FFmpeg는 모든 음악, 사진, 동영상처리 관련에 있어서 가장 근본이라고 생각한다. 우리가 사용하는 대부분의 코덱은 대부분 FFmpeg의 libavcodec을 기반으로 하고 있으며, Python에서 자주 사용하는 비전 라이브러리인 OpenCV나 MoviePy 등 동영상처리를 위해서는 결국 모두 FFmpeg를 통해서 처리 된다. 그만큼 중요하다는 소리다.
기본 문법
예시
ffmpeg를 실행하면 처리하는 정보를 보여주는데, image to video를 예시로 간단히 살펴보자.
Input에 대한 정보
- file format
- pixel format
- image size
- input framerate
Output에 대한 정보
- video codec
- pixel format
- video size
- output bitrate
- output framerate
- number of frames processed
주의
ffmpeg는 일반적인 파싱과 다르고 옵션이 많다. 많아도 너무 많다. document에는 설명도 별로 없는데 양이 많은 것 보니 진짜 많다. codec에 적용되는 옵션, output에만 가능한 옵션, input과 output에서 기능이 다른 옵션 등 상당히 까다로운 옵션이 많다. input option, output option을 구분해서 사용하는 등 주의깊게 사용해야 의도한 결과를 얻을 수 있을 것이다.
자주 사용하는 옵션
crf [quality]
Constant Rate Factor, 품질 조절
Bitrate대신 화질로 품질을 조절하는 방법이다. (0 ~ 63)의 값으로 낮을수록 품질이 높아지고 파일의 용량이 커진다. (0으로 설정하면 손실없는 가장 높은 품질의 결과를 얻을 수 있다.)
q
Quality factor, 품질 조절
낮을수록 높은 bitrate로 설정된다.
b:v [bitrate], b:a [bitrate]
Set bit rate in bits/s, bitrate 조절
1초에 해당하는 동영상에 얼마의 bit를 넣느냐를 의미한다. 높을수록 더 많은 정보를 담아서 화질이 좋아지게 된다. 대표적으로 CBR, VBR 방식이 있으며, CBR(Constant Bitrate)은 고정된 bitrate를 VBR(Variable Bitrate)는 최대, 최소 범위로 변동하는 bitrate를 사용하는 방식을 의미한다. ffmpeg는 기본적으로 CBR 방식을 사용하며, 옵션(vbr)을 통해서 VBR 방식을 사용할 수 있다.
값을 설정하면 codec이 처리 가능한 가장 가까운 bitrate로 설정된다.
c:v [codec], c:a [codec] 또는 vcodec [codec], acodec [codec]
Select codec, 코덱 설정
Input option으로 설정하면 encoder의 codec을 설정한다. Output option으로 설정하면 decoder의 codec을 설정한다.
r [fps] 또는 framerate [fps]
Set frame rate, Fps 조절
Input option으로 설정하면 input에 저장되어있는 시간 정보를 무시하고 설정한 fps에 맞춰서 생성한다. Output option으로 설정하면 설정한 fps를 맞추기 위해서 input에 frame을 줄이거나 복제한다. 구 버전에서 사용하는 -framerate와 같은 옵션이다.
vf [filter], af [filter] 또는 filter:v [filter], filter:a [filter]
Create filtergraph, 필터 설정
사이즈를 변경하거나 속도를 바꾸거나 자막을 입히는 등의 처리를 할 수 있다. 필터에도 정말 무수한 옵션이 있어 자세한 것은 ffmpeg filter 문서를 참고하자.
pix_fmt
Set pixel format, 픽셀 포맷 설정
픽셀 포맷을 설정한다. pix_fmts를 통해서 사용 가능한 픽셀 포맷을 확인할 수 있다.
monob, rgb555be, rgb555le, rgb565be, rgb565le, rgb24, bgr24, 0rgb, bgr0, 0bgr, rgb0, bgr48be, uyvy422, yuva444p, yuva444p16le, yuv444p, yuv422p16, yuv422p10, yuv444p10, yuv420p, nv12, yuyv422, gray
자주 사용하는 코드 예시
image to video
ffmpeg -framerate 30 -i {input_dir}/%06d.png -crf 0 {output_dir}.mp4
video to video
ffmpeg -i {input_dir}.mp4 -crf 0 -vf: scale=1920:1080 {output_dir}.mp4
image to gif
ffmpeg -f image2 -framerate 3 -i {input_dir}/%06d.png -loop 0 -crf 0 {output_dir}.gif
loop : 반복 재생할 횟수, 0이면 무한 반복
자주 접하는 오류
Please use -{option}:a or -{option}:v, -{option} is ambiguous
audio와 vidoe 두 가지에 모두 적용 가능한 옵션의 경우 발생하는 오류입니다. audio 혹은 video에 적용하는 옵션임을 명시해야합니다. “-{option}:v” or “-{option}:a” 를 통해서 해결 가능합니다.
Could find no file with path '{image_dir}/%06d.png' and index in the range 0-4
image 넘버링이 000001부터 시작하지 않아서 생기는 오류입니다. image_dir에 있는 image 파일의 네이밍을 %06으로 하면, 000001과 같은 숫자를 검색합니다. 단, 무한정 찾는 것이 아닌 000004까지만 찾아보고 넘어갑니다.