mir.pe (일반/밝은 화면)
최근 수정 시각 : 2024-03-18 17:03:00

FFmpeg

<colbgcolor=#f5f5f5,#2d2f34> FFmpeg
Fast Forward MPEG
파일:FFmpeg 로고.svg
발표 2000년 12월 20일
라이선스 LGPL, GPL[1]
링크 파일:홈페이지 아이콘.svg | 파일:홈페이지 아이콘.svg Windows
1. 개요2. FFmpeg에서 제공하는 것들3. 디코더
3.1. FFmpeg을 기반으로 하는 동영상 플레이어3.2. FFmpeg을 기반으로 하는 코덱
4. 동영상 인코더
4.1. 특징4.2. FFmpeg을 기반으로 하는 인코더4.3. FFmpeg를 기반으로 하는 서비스4.4. 일반적인 옵션4.5. 예시4.6. 프라운호퍼 AAC인코더 libfdk_aac 라이브러리 빌드
5. 그 외 FFmpeg을 이용하는 프로그램들6. 국산 플레이어의 GPL 위반 의혹7. FFmpeg? libav?

1. 개요

마이클 니더마이어(Michael Niedermayer)의 주도하에 개발되고 있는 모든 동영상, 음악, 사진 포맷들의 디코딩과 인코딩을 목표로 만들어지고 있는 오픈 소스 프로젝트. 참고로 FFmpeg의 로열티 문제는 FFmpeg가 아닌 FFmpeg가 포함하고 있는 H.265와 같은 유료 코덱들에 의한 것이다. 이미 이런 문제 때문에 삼성을 비롯한 전세계의 IT 관련 대기업들이 협력해 AV1 프로젝트를 진행중이다.[2]

관련 프로그램(인코더와 디코더 등등)에서 표준이라 불리울 정도로 많은 프로그램들의 기반으로 이용되고 있다. 아래의 FFmpeg을 기반[3]으로 하는 프로그램 리스트를 보면 알겠지만 거의 대부분의 비디오 관련 프로그램들이 사용하고 있다.

한 일화로 NVIDIA AMD는 자사의 그래픽카드의 하드웨어 가속을 위해 FFmpeg에 '직접' 소스를 건내주고 FFmpeg가 시키는대로 수정하였다. 대부분의 멀티미디어 재생기가 FFmpeg을 기반으로 하기 때문에, FFmpeg에서 지원만 한다면 그 효과를 당장 볼 수 있기 때문.

2. FFmpeg에서 제공하는 것들

3. 디코더

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

3.1. FFmpeg을 기반으로 하는 동영상 플레이어


여기에 적혀있는 것들은 유명한 것들이고, 이것들 말고도 수많은 미디어 플레이어들이 FFmpeg를 기반으로 한다.

3.2. FFmpeg을 기반으로 하는 코덱

4. 동영상 인코더

이쪽은 한마디로 정리가 가능하다. 곰인코더, 바닥, 다음 팟인코더 등 대다수 인코더 프로그램들은 FFmpeg 기반이다.

4.1. 특징

4.2. FFmpeg을 기반으로 하는 인코더


물론 이 목록 말고도, 대다수의 쉬운 인코더를 자처하는 프로그램들은 대부분 FFmpeg기반이다.

4.3. FFmpeg를 기반으로 하는 서비스

4.4. 일반적인 옵션

4.5. 예시

일반 영상을 스마트폰 등에 맞추어 재인코딩 할때나 블루레이 원본 영상을 인코딩할 때 [8]의 설정 예시는 다음과 같다.
#!syntax powershell
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

2015년 12월 부로 FFmpeg의 내장 AAC 인코더가 대폭 개선되었다고 발표했다. 링크1 링크2 제작자는 libfdk_aac와 비슷하거나 좀 더 우수한 성능을 나타낸다고 했지만 써본 사용자에 의하면 VBR 모드로는 여전히 부족하다고 하지만 CBR 모드로는 썩 괜찮다 카더라 링크. 참고로 FFmpeg 측의 주장대로 내장 aac가 (스테레오 채널) 128kbps 정도에서 음질이 상당한 것은 사실이지만 libfdk_aac에 비해 인코딩 속도는 다소 느린 편이다. (대신 빌드를 따로 할 필요가 없어 Zeranoe FFmpeg Build 같이 라이선스 문제로 libfdk_aac는 포함되지 않았지만 필요한 것들은 대부분 포함해서 바이너리로 공개하는 것들을 걍 쓰던 사람들의 편리성은 극대화 된 듯)

4.6. 프라운호퍼 AAC인코더 libfdk_aac 라이브러리 빌드

내장 AAC 인코더가 좋지 않기 때문에 FFmpeg에서 보다 고품질의 AAC 오디오를 사용하려면 프라운호퍼 코덱을 쓰는 게 최선의 방법이지만 라이선스 문제로 배포되지는 못하고 직접 컴파일해서 써야 된다. github에 올라와 있는 빌더툴을 이용하자.

윈도우용깃헙링크
리눅스용깃헙링크[16]

(윈도우용 기준)영문 스크립트이므로 굳이 언어에 제약받지 않아도 된다. 인터넷만 연결되어 있으면 이론상 MSYS2가 지원되는 어떤 윈도우즈 상에서도 사용 가능. 시간만 있으면 공간 넉넉한 외장하드(대략 14기가 정도 먹는다)에 폴더 하나 마련해서 실행시키고 결과물만 시스템에 옮겨버려도 된다. 프라운호퍼 라이브러리 뿐만 아니라 AV1, nvenc 등 가능한 라이브러리는 다 찾아서 컴파일한다. 기본 세팅은 모든 라이브러리를 정적으로 ffmpeg.exe 에 박아넣게 되어 있으니 컴파일된 결과도 간편하게 가지고 다닐 수 있다. 다만 github 소스니 가끔 빌드가 실패하는 경우가 있다.

샤나인코더에는 fdk aac가 기본적으로 컴파일되어 있다.

주의사항으로 프라운호퍼 AAC 인코더는 LC의 경우 따로 대역폭 옵션을 지정하지 않으면 고정 비트레이트 옵션에선 아무리 비트레이트를 올려도 17,000Hz 이상의 주파수는 칼같이 날려버린다. 가변 비트레이트 옵션도 역시 대역폭 지정이 없을경우 최고등급인 5는 제한이 없지만 바로 아래 등급인 4에서도 15.5kHz의 제한이 걸린다. 낮은 비트레이트 인코딩에선 이해가 가는 부분이지만 높은 비트레이트에서도 이러는건 아무리 봐도 정신줄을 놓은것처럼 보인다. 이 연구소에는 고주파는 못듣는 노인네들만 있는 모양이다. 이러니까 MP3인코더에서 Lame한테 관광을 당하지 비트레이트를 높여서 인코딩 할때는 이 부분의 지정이 반드시 필요하다. -cutoff 18000 옵션에서 컷오프 주파수를 지정해주자. 최대값은 20000.[17] 단, 낮은 비트레이트에서 컷오프 주파수를 무리하게 높게 잡으면 잘 들리지도 않는 고주파 부분이 데이터를 다 잡아먹어서 정작 중요한 저주파영역 음질이 골룸해질 수 있으니 잘 판단하자. 자세한 인코딩 옵션은 https://trac.ffmpeg.org/wiki/Encode/AAC에서 확인하자.

5. 그 외 FFmpeg을 이용하는 프로그램들

6. 국산 플레이어의 GPL 위반 의혹

KMPlayer, 곰플레이어, 팟플레이어 3개 플레이어의 경우 GPL 위반 의혹이 있다. FFmpeg의 GPL 부분을 포함해서 사용하기 때문인데, 이 부분이 많이 쓰이는 코덱과 없어선 안 되는 기능이기 때문에 제외하고 LGPL 부분만 사용하기는 힘들다. 이 때문에 3개 플레이어 전부 FFmpeg을 별다른 생각 없이 내장했다가 GPL 위반 의혹을 사게 되었다.

이 문제가 제기된 이후 대부분의 플레이어가 별다른 대응이 없는 와중에 팟플레이어가 소스를 공개하였다. LGPL 라이선스와 함께 수정된 FFmpeg 소스코드를 다운받을 수 있는 주소를 제공하고( 소스코드 다운 링크), 글로벌 버전을 출시하며 기본 설치 패키지에서 FFmpeg를 빼 버렸다. 다만, 설치 완료 화면에서 'Open Codec for PotPlayer'를 체크하면 서버로부터 추가 파일 다운로드 후에 설치가 진행된다. 혹시 이 과정을 건너 뛰었다면 서버에서 파일을 직접 다운받을 수도 있다. ( 32비트용, 64비트용)

iOS의 AVPlayer의 경우 소스코드 전체를 공개하고 있다. #다운로드 페이지 iOS와 앱스토어 심사의 특성상 LGPL에서 허용하는 라이브러리 다이나믹 링크로 처리할 방법이 없기 때문에 아예 소스코드 전체를 공개한 듯하다.[18] 이 때문에 앱스토어에서 "무인코딩"으로 검색하면 AVPlayer 이외에도 다른 국산 플레이어가 여러 개 튀어나온다. 물론 소스코드 공개 이런 거 없다.

상기 프로그램은 그나마 유명세를 타고 개발자들 사이에서 논란이 한 번 됐기에 회자되고 있을 뿐, Google Play의 한국산 앱들 중에서도 FFmpeg를 사용하면서 라이선스를 위반한 것으로 보이는 앱이 수두룩 빽빽하다.[19] 애플 앱스토어는 라이선스 위반으로 앱을 신고하면 앱이 내려가는 사례도 왕왕 있으나, 라이선스 정책뿐만 아니라 온갖 부분에서 정책이 허술한 구글 플레이 쪽은 사실상 그냥 무법지대로 방치되고 있는 중.

상용이든 무료든 내장 코덱을 이용하는 프로그램치고 오픈소스가 아닌 이상 GPL 위반에서 벗어나는 것은 현실적으로는 불가능하다. GPL 라이선스는 프로그램 코드 전부를 원하기 때문이다. Hall of Shame에 등재되어 있지 않는 프로그램은 GPL 위반이 아니라서가 아니라 대중에게 비교적 덜 알려진 경우에 불과하다. FFmpeg에 포함된 코덱들도 라이선스 이슈에서 완전히 자유로운 것은 아니다. GPL 라이선스는 상업적 목적이 주가 되는 개발자들한테서 점차 기피되고 있다. 물론 그렇다고 GPL을 부정적으로 볼 일은 아니다. GPL이 싫으면 자신이 직접 같은 기능을 하는 코드를 짜면 된다. 남이 만든 걸 금전적인 대가 없이 가져다 쓰면서 아무 책임도 안 지려는 게 이기적인 것이다. 애초에 GPL에 소스 공개 강제조항이 들어간 것도 오픈소스를 이용하면서 자기 코드는 내놓지 않는 먹튀를 방지하기 위해서다. 보통 이런식으로 GPL로 공개된 소스 코드들은 별도의 계약을 통해 클로즈드 라이선싱이 가능한 경우가 많다. (x264 같은)

7. FFmpeg? libav?

우분투등의 몇몇 리눅스 배포판에는 FFmpeg를 설치하면 FFmpeg대신 avconv가 설치되는데[20], 이는 FFmpeg의 포크이다. FFmpeg 안에서 파벌이 갈리고 싸움이 일어났는데, 그 결과 의견이 다른 사람들은 따로 나와서 libav라는 새로운 포크를 만들었다. libav 쪽은 FFmpeg 쪽을 완전히 무시하고 있는 상황이지만, FFmpeg 는 자신들이 개발하는것에 더해서, libav 쪽을 계속 모니터링하면서(아무래도 오픈소스니...) libav에서 만든것들도 좍 긁어다가 FFmpeg에 그대로 편입시키고 있는 상황. 덕분에 왠지 FFmpeg가 드러운 것 같긴 하지만[21], 사용자 입장에서는 FFmpeg 쪽이 기능면에서 낫다. 2015년 8월 1일, FFmpeg의 리더 개발자가 libav를 직접적으로 명시하진 않았지만 불화로 인해 FFmpeg에서 갈라져나온 포크 프로젝트들에게 화해를 공식적으로 제안했다.


[1] 포함해서 빌드할지 여부를 선택할 수 있는 일부 기능과 최적화 코드가 GPL을 따르고 나머지는 LGPL을 따른다. [2] 2022년 9월에 libaom-av1 muxer로 정식 릴리즈 버전에 추가됐다! [3] 정확히는 FFmpeg의 일부인 libavcodec 라이브러리를 주로 쓴다. [4] FFmpeg 개발자중에는 MPlayer 개발에도 참여하는 사람이 많다. [5] 애시당초 FFmpeg에서 파생된 프로젝트이다. [6] 단 FFmpeg 컴파일 시 어떤 코덱의 라이브러리를 링크하느냐 마느냐에 따라 해당 코덱의 영상 처리가 불가능한 경우도 있다. [7] 이것은 인코더들이 아주 오래된 버전의 FFmpeg을 기반으로 하고 있으며, FFmpeg에서 제공하는 프리셋을 사용하지 않기 때문이다. [8] 팟인코더 등 인코딩 프로그램 대체 [9] http://dicer.tistory.com/219 참조. [10] MPEG2를 H.264로 재인코딩한다면 비트레이트는 MPEG2 원본의 절반 정도가 적절하다. [11] FFmpeg 오디오 코덱 서열: libopus > libvorbis >= libfdk_aac > aac(FFmpeg 자체 aac 인코더) > libmp3lame >= eac3/ac3 > libtwolame(최신 mp2 인코더) > vorbis(초기 vorbis 인코더) > mp2(초기 mp2 인코더) > wmav2/wmav1(초기 wma 인코더) [12] 이 소스는 안드로이드가 출처인데 라이선스 때문에 대놓고 FFmpeg에 포함시키지는 못하고 이런 식으로 사용할 수 있는 것. 또한 DLL도 제공하는 건지 일부 FFmpeg 계열 인코더에 이걸 DLL로 포함한 경우가 있다. [13] 아예 macOS 쓰는 방법도 있다. 그쪽은 Apple AAC 인코더를 기본적으로 사용 가능하다보니 FFmpeg 맥 버전 역시 이걸 사용 가능하도록 만들어져 있다. 다만 FFmpeg는 라이센스 문제를 신경쓰는 편이라 윈도우용에서는 기능을 비활성화시켜놨다. [14] 상업용 장비에서 이런 일이 좀 있다. 실제로 올레 스카이라이프 TV의 USB 파일 재생에서 Vorbis 지원을 안 한다. 심지어 이런 장비의 경우 smi 자막을 지원 안해서 srt로 변환해야 하는 경우가 상당히 많다. [15] 2010년대 후반부터 지원 [16] 데비안/우분투에서는 잘 작동하는데 다른 배포판에서는 살짝 마사지를 해 줘야 한다. [17] Lame MP3 encoder의 경우 최신버전에선 320kbps에서 주파수 컷오프가 거의 없다. 20,000Hz 까지 포함된다. [18] 사실 이것도 KLDP에서 한차례 논란이 된 끝에 이렇게 된 것. [19] mms 및 그 파생 포맷을 스트리밍(인터넷 방송이나 라디오 따위) 해주는 앱은 십중팔구 FFmpeg를 가져다 썼다고 보면 된다. 그리고 그중에서 가이드라인을 따르거나 소스코드를 공개한 앱의 숫자는... [20] 단, 우분투의 upstream인 데비안 리눅스는 보안 대응/커밋수의 차이등을 근거로 FFmpeg로 다시 회귀하였기 때문에 데비안을 기반으로 하는 우분투 등의 리눅스 배포판들도 이 흐름에 따라갈 것으로 보인다. [21] 하지만 원래 자유 소프트웨어 겸 오픈소스는 그런 것을 권장하기 위해 나온 것이다.