티스토리 뷰

FFmpeg은 디지털 음성 스트림과 영상 스트림에 대해서 다양한 종류의 형태로 기록하고 변환하는 컴퓨터 프로그램이다. FFmpeg은 명령어를 직접 입력하는 방식으로 동작하며 여러가지 자유 소프트웨어와 오픈 소스 라이브러리로 구성되어 있다. 라이브러리 중에는 libavcodec도 들어있는데, 이 라이브러리는 음성/영상 코덱 라이브러리로 여러 프로젝트에서 쓰이고 있다. 또, libavformat 라는 음성/영상 다중화, 역다중화 라이브러리도 있다. 이 프로젝트의 이름은 MPEG 영상 표준화 그룹에서 유래했고, "mpeg" 앞에 붙은 "FF"는 "fast forward"를 의미한다.


이 프로젝트는 'Fabrice Bellard'에 의해 시작되었고, 지금은 'Michael Niedermayer'에 의해서 지속되고 있다. 수많은 FFmpeg 개발자들이 'MPlayer' 프로젝트에 포함되어 있고, 'FFmpeg'는 MPlayer 프로젝트 서버를 호스팅하고 있다.


FFmpeg은 리눅스 기반으로 개발되었지만, 애플, 윈도, 아미가OS 등 대부분의 운영 체제에서 컴파일이 가능하다.

공식 사이트 바로가기


FFmpeg에서 제공하는 것들


* ffmpeg - 미디어 포맷 변환 도구

* ffserver - 라이브 방송을 하는 멀티미디어 스트리밍 서버

* libavcodec - 오디오/비디오 코덱 라이브러리

* libavformat - 멀티미디어 컨테이너의 디먹서/먹서 라이브러리

* libavdevice - 입출력 장치 제어 라이브러리

* libavfilter - 미디어 필터 라이브러리

* libswscale - 이미지 처리 라이브러리

* libswresample - 오디오 처리 라이브러리


디코더


쉽게 이야기하면 동영상을 재생할때 쓰이는 코덱이다. FFmpeg의 영향력이 절대적이다. MAC, 안드로이드, iOS, 윈도우즈에서 유명한 코덱 내장형 동영상 플레이어들은 모두 FFmpeg의 libavcodec을 기반으로 하고 있다고 봐도 무방하다.


특징


FFmpeg 프로젝트 자체가 모든 영상의 디코딩/인코딩을 지향하기 때문에 추가적인 코덱의 설치가 필요없다. ffmpeg.exe 파일 하나로도 인코딩이 가능하다. 멀티코어를 공식적으로 지원 한다. 따로 옵션을 적지않으면 모든 코어를 사용한다.


VF(libavfilter) 기능 내장


FFmpeg은 쉬운 인코딩을 위해 각종 프리셋을 포함하고 있다. 사실 아래의 인코더들을 쓰는 것보다 직접 FFmpeg을 이용해서 프리셋을 활용하는 것이 더 나은 화질을 보장한다. CLI 기반이라 어질어질 할 수도 있지만, 찾아보면 위의 블로그처럼 스크립트를 공개한 곳이 많다. 정 귀찮으면 위 블로그에 있는 배치파일을 그냥 쓰면 된다. 리플들을 보면 수정된 프리셋이 많다. 그래도 아래의 인코더들보다 화질이 훨씬 좋게 나온다. 정 귀찮으면 아래 나오는 인코더를 써도 된다.


일반적인 옵션


-i [input]


입력 파일을 지정한다.


-vcodec [codec], -acodec [codec] 또는 -c:v [codec], -c:a [codec]


비디오 코덱, 오디오 코덱을 지정한다. 사용할 수 있는 코덱은 ffmpeg -encoders 로 확인할 수 있다. copy로 지정하면 기존 스트림을 인코딩 하지 않고(direct stream) 복사한다.


-vf [filter], -af [filter]


비디오, 오디오에 필터를 적용한다. 리사이즈를 하거나 스피드를 바꾸거나 ass, srt 자막을 입히는 등의 처리를 할 수 있다. 자세한 것은 ffmpeg의 필터 문서를 참고하자. 참고로 자막을 입히는 건 폰트 때문에 윈도에서는 환경변수를 지정해 줘야 한다.


-b:v [bitrate], -b:a [bitrate]


비디오, 오디오의 비트레이트를 지정한다.


-crf [quality]


비트레이트 대신 화질 기준으로 인코딩할 때 쓰는 옵션. 0-51, 0은 무손실, 디폴트는 23


-y


파일을 덮어쓸 일이 있어도 물어보지 않는다.


-re


인코딩 속도를 1x(실시간)으로 제한한다. 로컬 파일을 ffserver로 스트리밍 시 실시간으로 feed를 전송하기 위해서 필요하다.


-f [container]


출력 포맷을 지정한다. 따로 적지않으면 파일명에 맞춰서 해준다.


-t [time]


지정된 시간 (초 단위)만큼 인코딩한다.


-ss [time]


지정된 시간 (초 단위)만큼 건너뛰고 인코딩한다. hh:mm:ss 방식으로도 표기가 가능하다.

댓글
댓글쓰기 폼