FFmpeg
[image]
공식 홈페이지(윈도우 버전)
마이클 니더마이어(Michael Niedermayer)의 주도하에 개발되고 있는 모든 동영상, 음악, 사진 포맷들의 디코딩과 인코딩을 목표로 만들어지고 있는 LGPL과 GPL 라이센스[1] 를 따르는 오픈소스 프로젝트. 참고로 FFmpeg의 로열티 문제는 FFmpeg가 아닌 FFmpeg가 포함하고 있는 유료 코덱들에 의한 것이다. 이미 이런 문제 때문에 삼성을 비롯한 전세계의 IT 관련 대기업들이 협력해 AV1 프로젝트를 진행중이다.
관련 프로그램(인코더와 디코더 등등)에서 표준이라 불리울 정도로 많은 프로그램들의 기반으로 이용되고 있다. 아래의 FFmpeg을 기반[2] 으로 하는 프로그램 리스트를 보면 알겠지만 거의 대부분의 비디오 관련 프로그램들이 사용하고 있다.
한 일화로 NVIDIA와 AMD는 자사의 그래픽카드의 하드웨어 가속을 위해 FFmpeg에 ''' '직접' ''' 소스를 건내주고 FFmpeg이 시키는대로 수정하였다. 대부분의 멀티미디어 재생기가 FFmpeg을 기반으로 하기 때문에, FFmpeg에서 지원만 한다면 그 효과를 당장 볼 수 있기 때문.
쉽게 이야기하면 동영상을 재생할때 쓰이는 코덱이다. FFmpeg의 영향력이 절대적이다. MAC, 안드로이드, iOS, 윈도우즈에서 유명한 코덱 내장형 동영상 플레이어들은 모두 FFmpeg의 libavcodec을 기반으로 하고 있다고 봐도 무방하다.
이쪽은 한마디로 정리가 가능하다. 대다수 인코더 프로그램들은 모두 FFmpeg기반이다. 곰 인코더, 바닥, 다음 팟인코더 등...
일반 영상을 스마트폰 등에 맞추어 재인코딩 할때나 블루레이 원본 영상을 인코딩할때 [7] 의 설정'''예시'''는 다음과 같다.
내장 AAC 인코더가 영 좋지 못하기 때문에 FFmpeg에서 보다 고품질의 AAC 오디오를 사용하려면 프라운호퍼 코덱을 쓰는게 최선의 방법이지만 라이센스 문제로 배포되지는 못하고 직접 컴파일해서 써야된다. 일본에서 쉽게 빌드할수 있도록 툴을 제공하는 사이트가 있다. http://www.sakura-zaka.net/ffmpeg/ 구글 번역기로 충분히 따라갈수 있다.
단, 일본어 윈도우 전용으로 제작된 툴이라 마지막에 바탕화면에 빌드.lnk 파일을 생성하는 과정에서 .NET Framework 에러가 나면서 바탕화면에 아이콘이 생기지 않는다. 에러가 뜨면 Quit 버튼을 눌러서 종료하면 된다. 윈도우 일본어 언어팩을 깔아도 소용없으니 주의할 것. .NET Framework 일본어 언어팩이 설치되어 있어야만 에러가 나지 않는다. 오류로 바탕화면에 링크파일이 생성되지 않아도 실행파일을 직접 찾아서 빌드하면 된다.
32비트: \oreBuild\mingw32\msys\home\x86\_bin\ore_BuildTool.exe
64비트: \oreBuild\mingw64\msys\home\x64\_bin\ore_BuildTool.exe
빌드하는데 상당한 시간이 걸리며 2기가 정도의 용량이 필요하다. 빌드가 완료된 FFmpeg.exe 파일의 위치는 다음과 같다.
32비트: \oreBuild\mingw32\_ffmpeg_\ffmpeg.exe
64비트: \oreBuild\mingw64\_ffmpeg_\ffmpeg.exe
빌드가 완료되면 나머지 파일들은 지워도 된다.
주의사항으로 프라운호퍼 AAC 인코더는 따로 대역폭 옵션을 지정하지 않으면 고정 비트레이트 옵션에선 아무리 비트레이트를 올려도 17,000Hz 이상의 주파수는 칼같이 날려버린다. 가변 비트레이트 옵션도 역시 대역폭 지정이 없을경우 최고등급인 5는 제한이 없지만 바로 아래 등급인 4에서도 15.5kHz의 제한이 걸린다. 낮은 비트레이트 인코딩에선 이해가 가는 부분이지만 높은 비트레이트에서도 이러는건 아무리 봐도 정신줄을 놓은것처럼 보인다. 비트레이트를 높여서 인코딩 할때는 이 부분의 지정이 반드시 필요하다.
그 외에 FFmpeg Launcher도 같이 제공하고 있으므로 일본어 능력자라면 사용해 보자. 윈도우 상에서 쉽게 인코딩 할수 있다.
정 안되면 https://github.com/m-ab-s/media-autobuild_suite 를 써보는 것도 방법이다. 영문 스크립트 이므로 궂이 언어에 제약받지 않아도 된다. 인터넷만 연결되어 있으면 이론상 MSYS2가 지원되는 어떤 윈도우즈 상에서도 사용 가능. 시간만 있으면 공간 넉넉한 외장하드(대략 14기가 정도 먹는다)에 폴더 하나 마련해서 실행시키고 결과물만 시스템에 옮겨버려도 된다. 프라운호퍼 라이브러리 뿐만 아니라 AV1, nvenc 등 가능한 라이브러리는 다 찾아서 컴파일한다. 기본 세팅은 모든 라이브러리를 정적으로 ffmpeg.exe 에 박아넣게 되어 있으니 컴파일된 결과도 간편하게 가지고 다닐 수 있다. 다만 github 소스니 가끔 빌드가 실패하는 경우가 있다.
만일 리눅스라면 https://github.com/markus-perl/ffmpeg-build-script 프로젝트를 참조해 보자. 일단 데비안/우분투에서는 잘 작동하는데 다른 배포판에서는 살짝 마사지를 해 줘야 한다.
KMPlayer, 곰플레이어, 팟플레이어 3개 플레이어의 경우 GPL 위반 의혹이 있다. FFmpeg의 GPL 부분을 포함해서 사용하기 때문인데, 이 부분이 많이 쓰이는 코덱과 없어선 안 되는 기능이기 때문에 제외하고 LGPL 부분만 사용하기는 힘들다. 이 때문에 3개 플레이어 전부 FFmpeg을 별다른 생각 없이 내장했다가 GPL 위반 의혹을 사게 되었다.
이 문제가 제기된 이후 대부분의 플레이어가 별다른 대응이 없는 와중에 팟플레이어가 소스를 공개하였다. LGPL 라이선스와 함께 수정된 FFmpeg 소스코드를 다운받을 수 있는 주소를 제공하고, 글로벌 버전을 출시하며 기본 설치 패키지에서 FFmpeg를 빼 버렸다. 다만, 설치 완료 화면에서 'Open Codec for PotPlayer'를 체크하면 서버로부터 추가 파일 다운로드 후에 설치가 진행된다. 혹시 이 과정을 건너 뛰었다면 서버에서 파일을 직접 다운받을 수도 있다. (32비트용, 64비트용)
iOS의 AVPlayer의 경우 소스코드 전체를 공개하고 있다. #다운로드 페이지 iOS와 앱스토어 심사의 특성상 LGPL에서 허용하는 라이브러리 다이나믹 링크로 처리할 방법이 없기 때문에 아예 소스코드 전체를 공개한 듯 하다.[14] 이 때문에 앱스토어에서 "무인코딩"으로 검색하면 AVPlayer 이외에도 다른 국산 플레이어가 여러 개 튀어 나온다. 물론 소스코드 공개 이런거 없다.
상기 프로그램은 그나마 유명세를 타고 개발자들 사이에서 논란이 한 번 됐기에 회자되고 있을 뿐, 구글 플레이의 한국산 앱들 중에서도 ffmpeg를 사용하면서 라이센스를 위반한 것으로 보이는 앱이 수두룩 빽빽하다.[15] 애플 앱스토어는 라이센스 위반으로 앱을 신고하면 앱이 내려가는 사례도 왕왕 있으나, 라이센스 정책 뿐만 아니라 온갖 부분에서 정책이 허술한 구글 플레이 쪽은 사실상 그냥 무법지대로 방치되고 있는 중.
상용이든 무료든 내장 코덱을 이용하는 프로그램치고 오픈소스가 아닌 이상 '''GPL 위반에서 벗어나는 것은 현실적으로는 불가능하다.''' GPL 라이선스는 '''프로그램 코드 전부'''를 원하기 때문이다. Hall of Shame에 등재되어 있지 않는 프로그램은 GPL 위반이 아니라서가 아니라 대중에게 비교적 덜 알려진 경우에 불과하다. FFmpeg에 포함된 코덱들도 라이선스 이슈에서 완전히 자유로운 것은 아니다. GPL 라이선스는 상업적 목적이 주가 되는 개발자들한테서 점차 기피되고 있다. 물론 그렇다고 GPL을 부정적으로 볼 일은 아니다. GPL이 싫으면 자신이 직접 같은 기능을 하는 코드를 짜면 된다. 남이 만든 걸 금전적인 대가 없이 가져다 쓰면서 아무 책임도 안 지려는 게 이기적인 것이다. 애초에 GPL에 소스 공개 강제조항이 들어간 것도 오픈소스를 이용하면서 자기 코드는 내놓지 않는 먹튀를 방지하기 위해서다. [16]
[17]
우분투등의 몇몇 리눅스 배포판에는 ffmpeg를 설치하면 ffmpeg대신 avconv가 설치되는데[18] , 이는 ffmpeg의 포크이다. ffmpeg 안에서 파벌이 갈리고 싸움이 일어났는데, 그 결과 의견이 다른 사람들은 따로 나와서 libav라는 새로운 포크를 만들었다. libav 쪽은 ffmpeg 쪽을 완전히 무시하고 있는 상황이지만, ffmpeg 는 자신들이 개발하는것에 더해서, libav 쪽을 계속 모니터링하면서(아무래도 오픈소스니...) libav에서 만든것들도 좍 긁어다가 ffmpeg에 그대로 편입시키고 있는 상황. 덕분에 왠지 ffmpeg가 드러운 것 같긴 하지만[19] , 사용자 입장에서는 ffmpeg 쪽이 기능면에서 낫다. 2015년 8월 1일, ffmpeg의 리더 개발자가 libav를 직접적으로 명시하진 않았지만 불화로 인해 ffmpeg에서 갈라져나온 포크 프로젝트들에게 화해를 공식적으로 제안했다.
ffmpeg와 libav의 갈등에 대한 자세한 역사는 #FFmpeg-libav 분쟁 기록을 참고하면 좋다.
1. 개요
공식 홈페이지(윈도우 버전)
마이클 니더마이어(Michael Niedermayer)의 주도하에 개발되고 있는 모든 동영상, 음악, 사진 포맷들의 디코딩과 인코딩을 목표로 만들어지고 있는 LGPL과 GPL 라이센스[1] 를 따르는 오픈소스 프로젝트. 참고로 FFmpeg의 로열티 문제는 FFmpeg가 아닌 FFmpeg가 포함하고 있는 유료 코덱들에 의한 것이다. 이미 이런 문제 때문에 삼성을 비롯한 전세계의 IT 관련 대기업들이 협력해 AV1 프로젝트를 진행중이다.
관련 프로그램(인코더와 디코더 등등)에서 표준이라 불리울 정도로 많은 프로그램들의 기반으로 이용되고 있다. 아래의 FFmpeg을 기반[2] 으로 하는 프로그램 리스트를 보면 알겠지만 거의 대부분의 비디오 관련 프로그램들이 사용하고 있다.
한 일화로 NVIDIA와 AMD는 자사의 그래픽카드의 하드웨어 가속을 위해 FFmpeg에 ''' '직접' ''' 소스를 건내주고 FFmpeg이 시키는대로 수정하였다. 대부분의 멀티미디어 재생기가 FFmpeg을 기반으로 하기 때문에, FFmpeg에서 지원만 한다면 그 효과를 당장 볼 수 있기 때문.
2. FFmpeg에서 제공하는 것들
- ffmpeg - 미디어 포맷 변환 도구
- ffserver - 라이브 방송을 하는 멀티미디어 스트리밍 서버
- libavcodec - 오디오/비디오 코덱 라이브러리
- libavformat - 멀티미디어 컨테이너의 디먹서/먹서 라이브러리
- libavdevice - 입출력 장치 제어 라이브러리
- libavfilter - 미디어 필터 라이브러리
- libswscale - 이미지 처리 라이브러리
- libswresample - 오디오 처리 라이브러리
3. 디코더
쉽게 이야기하면 동영상을 재생할때 쓰이는 코덱이다. FFmpeg의 영향력이 절대적이다. MAC, 안드로이드, iOS, 윈도우즈에서 유명한 코덱 내장형 동영상 플레이어들은 모두 FFmpeg의 libavcodec을 기반으로 하고 있다고 봐도 무방하다.
3.1. FFmpeg을 기반으로 하는 동영상 플레이어
- iOS : AV player, nPlayer
- 안드로이드 : Dice Player, MX 플레이어, 안드로이드용 곰플레이어, 안드로이드용 KMP
- 윈도우 : 다음 팟플레이어, 곰플레이어, KMP, MPC-HC, 콘플레이어
- 맥 : 무비스트
- 크로스 플랫폼인 VLC, MPlayer[3]
3.2. FFmpeg을 기반으로 하는 코덱
- LAVFilters
- FFDshow[4]
- 그리고 LAV필터와 FFDshow를 기반으로하는 수많은 통합코덱들
4. 동영상 인코더
이쪽은 한마디로 정리가 가능하다. 대다수 인코더 프로그램들은 모두 FFmpeg기반이다. 곰 인코더, 바닥, 다음 팟인코더 등...
4.1. 특징
- FFmpeg 프로젝트 자체가 모든 영상의 디코딩/인코딩을 지향하기 때문에 추가적인 코덱의 설치가 필요없다.[5] ffmpeg.exe 파일 하나로도 인코딩이 가능하다.
- 멀티코어를 공식적으로 지원 한다. 따로 옵션을 적지않으면 모든 코어를 사용한다.
- VF(libavfilter) 기능 내장.
- FFmpeg은 쉬운 인코딩을 위해 각종 프리셋을 포함하고 있다. 사실 아래의 인코더들을 쓰는 것보다 직접 FFmpeg을 이용해서 프리셋을 활용하는 것이 더 나은 화질을 보장한다. CLI 기반이라 어질어질 할 수도 있지만, 찾아보면 위의 블로그처럼 스크립트를 공개한 곳이 많다. 정 귀찮으면 위 블로그에 있는 배치파일을 그냥 쓰면 된다. 리플들을 보면 수정된 프리셋이 많다. 그래도 아래의 인코더들보다 화질이 훨씬 좋게 나온다.[6] 정 귀찮으면 아래 나오는 인코더를 써도 된다.
4.2. FFmpeg을 기반으로 하는 인코더
- 제트오디오VX(무료 혹은 유료, 코원)
- 유마일
- 엔젤인코더
- 샤나인코더 - 개인 개발자가 만든 인코더 임에도 불구하고, 가볍게 인코딩하는 용도로는 매우 좋다. 무료.
- Freemake - 서양에서 유명한 인코딩 프로그램. 그러나 랜섬웨어 유포 위험이 있다.
- Mencoder
- 곰인코더
- 다음팟인코더
- Handbrake - 세계에서 가장 많이 쓰이는 인코더. MPEG-4와 MPEG-2를 인코딩할때 FFmpeg를 사용한다. H.264, HEVC와 Theora도 지원한다.
- WInff - ffmpeg를 GUI로 만든 프로그램이다
4.3. FFmpeg를 기반으로 하는 서비스
- 니코니코 동화, 아프리카 등의 인터넷 동영상 사이트
- 많은 인터넷 동영상 사이트들도 ffmpeg를 사용하고 있다. 영상 파일을 다운받아서 뜯어보면 알겠지만, Lavf(libavformat)를 사용하고 있으며 영상 인코딩에도 libavcodec를 사용하고 있다.
4.4. 일반적인 옵션
- -i
[input]
- 입력 파일을 지정한다.
- -vcodec
, -acodec[codec]
또는 -c:v[codec]
, -c:a[codec]
[codec]
- 비디오 코덱, 오디오 코덱을 지정한다. 사용할 수 있는 코덱은
로 확인할 수 있다.ffmpeg -encoders
로 지정하면 기존 스트림을 인코딩 하지 않고(direct stream) 복사한다.copy
- 비디오 코덱, 오디오 코덱을 지정한다. 사용할 수 있는 코덱은
- -vf
, -af[filter]
[filter]
- 비디오, 오디오에 필터를 적용한다. 리사이즈를 하거나 스피드를 바꾸거나 ass, srt 자막을 입히는 등의 처리를 할 수 있다. 자세한 것은 ffmpeg의 필터 문서를 참고하자. 참고로 자막을 입히는 건 폰트 때문에 윈도에서는 환경변수를 지정해 줘야 한다.
- -b:v
, -b:a[bitrate]
[bitrate]
- 비디오, 오디오의 비트레이트를 지정한다.
- -crf
[quality]
- 비트레이트 대신 화질 기준으로 인코딩할 때 쓰는 옵션. 0-51, 0은 무손실, 디폴트는 23
- -y
- 파일을 덮어쓸 일이 있어도 물어보지 않는다.
- -re
- 인코딩 속도를 1x(실시간)으로 제한한다. 로컬 파일을 ffserver로 스트리밍 시 실시간으로 feed를 전송하기 위해서 필요하다.
- -f
[container]
- 출력 포맷을 지정한다. 따로 적지않으면 파일명에 맞춰서 해준다.
- -t
[time]
- 지정된 시간 (초 단위)만큼 인코딩한다.
- -ss
[time]
- 지정된 시간 (초 단위)만큼 건너뛰고 인코딩한다. hh:mm:ss 방식으로도 표기가 가능하다.
4.5. 예시
일반 영상을 스마트폰 등에 맞추어 재인코딩 할때나 블루레이 원본 영상을 인코딩할때 [7] 의 설정'''예시'''는 다음과 같다.
ffmpeg -i filename.mp4 -sn -c:v libx264 -preset medium -crf 23 -tune animation -sws_flags lanczos -filter:v "scale=-1:720" -c:a aac -b:a 192k -ac 2 outfile.mkv
- "-i filename.mp4" - 입력 파일로 filename.mp4를 지정한다. 확장자를 포함시켜야 한다.
- "-threads 0" - 사용할 스레드 수를 지정한다 0은 모두. 0이 디폴트라 생략해도 무방하다.
- "-sn" - 내장자막을 인코딩하지 않겠다는 의미이다. 내장자막을 가져오고 싶으면 -c:s copy로 바꾸면 된다.
- "-vcodec libx264" - libx264를 사용하여 H.264로 인코딩. MPEG4를 쓰려면 libxvid, VP8을 쓰려면 libvpx로 설정해주면 된다. 밑은 옵션 중 libx264의 옵션을 사용하는 건 물론 달라지지만 대충 비슷하다. 다양한 옵션은 영어가 된다면 ffmpeg 위키 참조.
- "-preset medium" - libx264의 프리셋을 이용하는것으로 very slow, slower, slow, medium, fast, faster, veryfast 등의 옵션이 있다. ultrafast나 placebo (이렇게 느려지면 화질 개선이 플라시보 효과 이상의 무언가는 없다라는 수준) 등의 옵션도 있지만 보통 사람들은 쓸 일 없다 (...) 당연히 slow쪽으로 갈 수록 인코딩은 느려진다. CRF방식으로 인코딩을 할때는 용량에 관여을 하며, 비트레이트 지정으로 인코딩을 할 시 화질에 관여된다. CRF인코딩 기준 slow의 경우 medium에 비해 인코딩 시간이 50~66% 늘어나지만 용량은 0~4%정도 줄어든다. veryslow의 경우는 약 4.5배정도 인코딩 시간이 늘어나며 용량 이득은 12%정도다.[8]
- "-crf 23" - CRF는 고정 비트레이트 인코딩이 아닌 "가변 비트레이트 화질우선 인코딩"방식으로서 옵션값은 0에서 51까지의 설정이 가능한데 값이 낮을 수록 고화질이다. 18 정도면 거의 무손실이고 기본값인 23 정도면 상당히 고화질으로서 영화나 미드를 인코딩하는데 적절하다. 애니메이션은 보통 25~27의 값을 쓴다. 화질이 나쁜(깍두기 크리를 맞은) mpeg2방식의 HDTV원본을 재인코딩할때는 CRF방식으로 인코딩하면 원본보다 더 크게 인코딩 되는 경우가 있으므로 고정 비트레이트 방식으로 인코딩을 하는게 낫다.[9] 고정 비트레이트 방식으로 인코딩을 하고 싶다면 -crf 23 대신에 -vb 2000k 이렇게 지정하면 된다.
- "-tune animation" - libx264의 tune 옵션을 사용한다. 색감과는 관계가 없고 deblock 위주로 옵션을 조정한다. animation 옵션은 deblock 값을 높여서 화면을 좀 더 뭉게준다. 일반적인 영화나 티비영상의 경우 film 옵션을 쓴다.
- "-sws_flags lanczos -vf "scale=1280:-1"" lanczos란 리사이즈 필터를 이용하여 720p로 리사이즈. -1은 화면비에 맞춰서 자동으로 세로사이즈를 결정한다. 자동으로 리사이즈하는 경우에는 1280:718 이런식으로 이상한 사이즈가 나올수 있으니 왠만하면 수동으로 지정해주자. 이 VF명령줄에 여러가지 필터를 넣을 수 있다. libass를 사용해서 자막을 하드코딩 할 수도 있고 yadif로 디인터레이싱도 가능하다 ivtc도 가능하다. ffmpeg 필터 문서 참조.
- "-c:a aac -b:a 192k -ac 2" AAC 코덱으로 192k정도에 맞춰서 2채널로 다운믹싱하여 인코딩한다. AAC 외의 MP3같은 포멧도 사용할 수 있으나, OPUS와 Vorbis를 제외하면 음질이 상대적으로 떨어지기 때문에 비추천 한다.[10] 이보다도 고품질로 인코딩하고자 한다면 opus 혹은 Vorbis를 쓰거나, 프라운호퍼 AAC소스를 가져와서 직접 ffmpeg을 컴파일 해서 인코딩을 해야한다.[11] , Vorbis를 이용하여 -acodec libvorbis -ac 2 -aq 4 이런식으로 인코딩 할 수 있다. 단 Vorbis의 경우 일반적인 기기에서 호환성은 떨어진다.[12] 더 다양한 옵션은 FFmpeg 공식 오디오 인코딩 가이드 참조.
- "outfile.mkv" - 출력 파일명이다. 확장자에 따라 영상 컨테이너(avi, mp4, mkv같은)를 자동으로 선택해주긴 하지만, 가급적이면 -format 옵션으로 출력 포맷을 지정해 주도록 하자. 참고로 확장자가 mp4인 경우에는 음성코덱으로 AAC, MP2, MP3, AC3 만 가능하다. Vorbis, Opus 는 불가능함. MKV가 가장 호환성이 좋다. 현존하는 거의 모든 포멧을 담을 수 있을 정도.
4.6. 프라운호퍼 AAC인코더 libfdk_aac 라이브러리 빌드
내장 AAC 인코더가 영 좋지 못하기 때문에 FFmpeg에서 보다 고품질의 AAC 오디오를 사용하려면 프라운호퍼 코덱을 쓰는게 최선의 방법이지만 라이센스 문제로 배포되지는 못하고 직접 컴파일해서 써야된다. 일본에서 쉽게 빌드할수 있도록 툴을 제공하는 사이트가 있다. http://www.sakura-zaka.net/ffmpeg/ 구글 번역기로 충분히 따라갈수 있다.
단, 일본어 윈도우 전용으로 제작된 툴이라 마지막에 바탕화면에 빌드.lnk 파일을 생성하는 과정에서 .NET Framework 에러가 나면서 바탕화면에 아이콘이 생기지 않는다. 에러가 뜨면 Quit 버튼을 눌러서 종료하면 된다. 윈도우 일본어 언어팩을 깔아도 소용없으니 주의할 것. .NET Framework 일본어 언어팩이 설치되어 있어야만 에러가 나지 않는다. 오류로 바탕화면에 링크파일이 생성되지 않아도 실행파일을 직접 찾아서 빌드하면 된다.
32비트: \oreBuild\mingw32\msys\home\x86\_bin\ore_BuildTool.exe
64비트: \oreBuild\mingw64\msys\home\x64\_bin\ore_BuildTool.exe
빌드하는데 상당한 시간이 걸리며 2기가 정도의 용량이 필요하다. 빌드가 완료된 FFmpeg.exe 파일의 위치는 다음과 같다.
32비트: \oreBuild\mingw32\_ffmpeg_\ffmpeg.exe
64비트: \oreBuild\mingw64\_ffmpeg_\ffmpeg.exe
빌드가 완료되면 나머지 파일들은 지워도 된다.
ffmpeg -encoders
실행해서 libfdk_aac가 보이면 성공이다. 이 파일을 무단배포하면 라이센스 위반이니 주의할 것. 혼자만 사용하자. 주의사항으로 프라운호퍼 AAC 인코더는 따로 대역폭 옵션을 지정하지 않으면 고정 비트레이트 옵션에선 아무리 비트레이트를 올려도 17,000Hz 이상의 주파수는 칼같이 날려버린다. 가변 비트레이트 옵션도 역시 대역폭 지정이 없을경우 최고등급인 5는 제한이 없지만 바로 아래 등급인 4에서도 15.5kHz의 제한이 걸린다. 낮은 비트레이트 인코딩에선 이해가 가는 부분이지만 높은 비트레이트에서도 이러는건 아무리 봐도 정신줄을 놓은것처럼 보인다. 비트레이트를 높여서 인코딩 할때는 이 부분의 지정이 반드시 필요하다.
-cutoff 18000
옵션에서 컷오프 주파수를 지정해주자. 최대값은 20000.[13] 단, 낮은 비트레이트에서 컷오프 주파수를 무리하게 높게 잡으면 잘 들리지도 않는 고주파 부분이 데이터를 다 잡아먹어서 정작 중요한 저주파영역 음질이 골룸해질수 있으니 잘 판단하자. 자세한 인코딩 옵션은 https://trac.ffmpeg.org/wiki/Encode/AAC에서 확인.그 외에 FFmpeg Launcher도 같이 제공하고 있으므로 일본어 능력자라면 사용해 보자. 윈도우 상에서 쉽게 인코딩 할수 있다.
정 안되면 https://github.com/m-ab-s/media-autobuild_suite 를 써보는 것도 방법이다. 영문 스크립트 이므로 궂이 언어에 제약받지 않아도 된다. 인터넷만 연결되어 있으면 이론상 MSYS2가 지원되는 어떤 윈도우즈 상에서도 사용 가능. 시간만 있으면 공간 넉넉한 외장하드(대략 14기가 정도 먹는다)에 폴더 하나 마련해서 실행시키고 결과물만 시스템에 옮겨버려도 된다. 프라운호퍼 라이브러리 뿐만 아니라 AV1, nvenc 등 가능한 라이브러리는 다 찾아서 컴파일한다. 기본 세팅은 모든 라이브러리를 정적으로 ffmpeg.exe 에 박아넣게 되어 있으니 컴파일된 결과도 간편하게 가지고 다닐 수 있다. 다만 github 소스니 가끔 빌드가 실패하는 경우가 있다.
만일 리눅스라면 https://github.com/markus-perl/ffmpeg-build-script 프로젝트를 참조해 보자. 일단 데비안/우분투에서는 잘 작동하는데 다른 배포판에서는 살짝 마사지를 해 줘야 한다.
5. 그 외 ffmpeg을 이용하는 프로그램들
- Kodi(전 XBMC)
6. 국산 플레이어의 GPL 위반 의혹
KMPlayer, 곰플레이어, 팟플레이어 3개 플레이어의 경우 GPL 위반 의혹이 있다. FFmpeg의 GPL 부분을 포함해서 사용하기 때문인데, 이 부분이 많이 쓰이는 코덱과 없어선 안 되는 기능이기 때문에 제외하고 LGPL 부분만 사용하기는 힘들다. 이 때문에 3개 플레이어 전부 FFmpeg을 별다른 생각 없이 내장했다가 GPL 위반 의혹을 사게 되었다.
이 문제가 제기된 이후 대부분의 플레이어가 별다른 대응이 없는 와중에 팟플레이어가 소스를 공개하였다. LGPL 라이선스와 함께 수정된 FFmpeg 소스코드를 다운받을 수 있는 주소를 제공하고, 글로벌 버전을 출시하며 기본 설치 패키지에서 FFmpeg를 빼 버렸다. 다만, 설치 완료 화면에서 'Open Codec for PotPlayer'를 체크하면 서버로부터 추가 파일 다운로드 후에 설치가 진행된다. 혹시 이 과정을 건너 뛰었다면 서버에서 파일을 직접 다운받을 수도 있다. (32비트용, 64비트용)
iOS의 AVPlayer의 경우 소스코드 전체를 공개하고 있다. #다운로드 페이지 iOS와 앱스토어 심사의 특성상 LGPL에서 허용하는 라이브러리 다이나믹 링크로 처리할 방법이 없기 때문에 아예 소스코드 전체를 공개한 듯 하다.[14] 이 때문에 앱스토어에서 "무인코딩"으로 검색하면 AVPlayer 이외에도 다른 국산 플레이어가 여러 개 튀어 나온다. 물론 소스코드 공개 이런거 없다.
상기 프로그램은 그나마 유명세를 타고 개발자들 사이에서 논란이 한 번 됐기에 회자되고 있을 뿐, 구글 플레이의 한국산 앱들 중에서도 ffmpeg를 사용하면서 라이센스를 위반한 것으로 보이는 앱이 수두룩 빽빽하다.[15] 애플 앱스토어는 라이센스 위반으로 앱을 신고하면 앱이 내려가는 사례도 왕왕 있으나, 라이센스 정책 뿐만 아니라 온갖 부분에서 정책이 허술한 구글 플레이 쪽은 사실상 그냥 무법지대로 방치되고 있는 중.
상용이든 무료든 내장 코덱을 이용하는 프로그램치고 오픈소스가 아닌 이상 '''GPL 위반에서 벗어나는 것은 현실적으로는 불가능하다.''' GPL 라이선스는 '''프로그램 코드 전부'''를 원하기 때문이다. Hall of Shame에 등재되어 있지 않는 프로그램은 GPL 위반이 아니라서가 아니라 대중에게 비교적 덜 알려진 경우에 불과하다. FFmpeg에 포함된 코덱들도 라이선스 이슈에서 완전히 자유로운 것은 아니다. GPL 라이선스는 상업적 목적이 주가 되는 개발자들한테서 점차 기피되고 있다. 물론 그렇다고 GPL을 부정적으로 볼 일은 아니다. GPL이 싫으면 자신이 직접 같은 기능을 하는 코드를 짜면 된다. 남이 만든 걸 금전적인 대가 없이 가져다 쓰면서 아무 책임도 안 지려는 게 이기적인 것이다. 애초에 GPL에 소스 공개 강제조항이 들어간 것도 오픈소스를 이용하면서 자기 코드는 내놓지 않는 먹튀를 방지하기 위해서다. [16]
[17]
7. ffmpeg? libav?
우분투등의 몇몇 리눅스 배포판에는 ffmpeg를 설치하면 ffmpeg대신 avconv가 설치되는데[18] , 이는 ffmpeg의 포크이다. ffmpeg 안에서 파벌이 갈리고 싸움이 일어났는데, 그 결과 의견이 다른 사람들은 따로 나와서 libav라는 새로운 포크를 만들었다. libav 쪽은 ffmpeg 쪽을 완전히 무시하고 있는 상황이지만, ffmpeg 는 자신들이 개발하는것에 더해서, libav 쪽을 계속 모니터링하면서(아무래도 오픈소스니...) libav에서 만든것들도 좍 긁어다가 ffmpeg에 그대로 편입시키고 있는 상황. 덕분에 왠지 ffmpeg가 드러운 것 같긴 하지만[19] , 사용자 입장에서는 ffmpeg 쪽이 기능면에서 낫다. 2015년 8월 1일, ffmpeg의 리더 개발자가 libav를 직접적으로 명시하진 않았지만 불화로 인해 ffmpeg에서 갈라져나온 포크 프로젝트들에게 화해를 공식적으로 제안했다.
ffmpeg와 libav의 갈등에 대한 자세한 역사는 #FFmpeg-libav 분쟁 기록을 참고하면 좋다.
[1] 포함해서 빌드할지 여부를 선택할 수 있는 일부 기능과 최적화 코드가 GPL을 따르고 나머지는 LGPL을 따른다[2] 정확히는 FFmpeg의 일부인 libavcodec 라이브러리를 주로 쓴다.[3] FFmpeg 개발자중에는 MPlayer 개발에도 참여하는 사람이 많다. [4] 애시당초 FFmpeg에서 파생된 프로젝트이다.[5] 단 FFmpeg 컴파일 시 어떤 코덱의 라이브러리를 링크하느냐 마느냐에 따라 해당 코덱의 영상 처리가 불가능한 경우도 있다.[6] 이것은 인코더들이 아주 오래된 버전의 FFmpeg을 기반으로 하고 있으며, FFmpeg에서 제공하는 프리셋을 사용하지 않기 때문이다.[7] 팟인코더 등 인코딩 프로그램 대체[8] http://dicer.tistory.com/219 참조.[9] mpeg2를 h264로 재인코딩한다면 비트레이트는 mpeg2원본의 절반정도가 적절하다.[10] FFmpeg 오디오 코덱 서열 libopus > libvorbis >= libfdk_aac > aac > libmp3lame >= eac3/ac3 > libtwolame > vorbis > mp2 > wmav2/wmav1[11] 이 소스가 안드로이드가 출처인데 라이센스 때문에 대놓고 ffmpeg에 포함시키지는 못하고 이런 식으로 사용할 수 있는 것. 또한 DLL도 제공하는 건지 일부 FFmpeg 계열 인코더에 이걸 DLL로 포함한 경우가 있다.[12] 상업용 장비에서 이런 일이 좀 있다. 실제로 올레 스카이라이프 TV의 USB 파일 재생에서 Vorbis 지원을 안한다. 심지어 이런 장비의 경우 smi 자막을 지원 안해서 srt로 변환해야 하는 경우가 상당히 많다.[13] Lame MP3 encoder의 경우 최신버전에선 320kbps에서 주파수 컷오프가 거의 없다. 20,000Hz 까지 포함된다[14] 사실 이것도 KLDP에서 한차례 논란이 된 끝에 이렇게 된 것.[15] mms 및 그 파생 포맷을 스트리밍(인터넷 방송이나 라디오 따위)해주는 앱은 십중팔구 ffmpeg를 가져다 썼다고 보면 된다. 그리고 그 중에서 가이드라인을 따르거나 소스코드를 공개한 앱의 숫자는...[16] 다만 GPL도 헛점이 없는 것은 아니다. 자세한 건 GPL 문서 참조.[17] 다만 (C언어 기준) fork나 exec 함수를 사용해서 ffmpeg를 호출하는 경우는 (L)GPL이 적용되지 않는 듯 하다. 참고1 참고2 참고3 참고4[18] 단, 우분투의 upstream인 데비안 리눅스는 보안 대응/커밋수의 차이등을 근거로 ffmpeg로 다시 회귀하였기 때문에 데비안을 기반으로 하는 우분투 등의 리눅스 배포판들도 이 흐름에 따라갈 것으로 보인다.[19] 하지만 원래 자유 소프트웨어 겸 오픈소스는 그런 것을 권장하기 위해 나온 것이다.