FFmpeg

FFmpeg은 비디오, 오디오 및 기타 멀티미디어 파일과 스트림을 처리하기 위한 라이브러리와 프로그램 모음으로 구성된 자유-오픈 소스 소프트웨어 프로젝트이다. 그 핵심은 비디오 및 오디오 파일 처리를 위해 설계된 명령줄 ffmpeg 도구 자체이다. 이 도구는 포맷 트랜스코딩, 기본 편집(트리밍 및 연결), 비디오 스케일링, 비디오 후반 작업 효과 및 표준 준수(SMPTE, ITU)를 위해 널리 사용된다.

FFmpeg에는 다른 도구들도 포함되어 있다. 간단한 미디어 플레이어인 ffplay와 미디어 정보를 표시하는 명령줄 도구인 ffprobe가 있다. 포함된 라이브러리 중에는 많은 상용 및 자유 소프트웨어 제품에서 사용하는 오디오/비디오 코덱 라이브러리인 libavcodec, 오디오/비디오 컨테이너 뮤싱 및 디뮤싱 라이브러리인 libavformat (Lavf), 그리고 GStreamer와 유사한 필터그래프를 통해 필터를 향상시키고 편집하는 라이브러리인 libavfilter가 있다.

FFmpeg은 다른 많은 소프트웨어 프로젝트의 워크플로의 일부이며, 그 라이브러리들은 VLC와 같은 소프트웨어 미디어 플레이어의 핵심 부분이며 유튜브 및 빌리빌리의 핵심 처리 과정에 포함되어 왔다. 많은 오디오 및 비디오 파일 포맷을 위한 인코더와 디코더가 포함되어 있어, 일반적이거나 희귀한 미디어 파일의 트랜스코딩에 매우 유용하다.

FFmpeg은 활성화된 옵션에 따라 LGPL-2.1-이상 또는 GPL-2.0-이상으로 발행된다.

 역사 
이 프로젝트는 2000년에 파브리스 벨라르("Gérard Lantau"라는 가명 사용)에 의해 시작되었으며, 2004년부터 2015년까지 미하엘 니더마이어(Michael Niedermayer)가 이끌었다. 일부 FFmpeg 개발자들은 MPlayer 프로젝트에도 참여했다.

FFmpeg의 "FF"는 "빨리 감기"(fast forward)를 의미한다. 로고는 MPEG 비디오 코덱이 엔트로피 코딩을 처리하는 방식을 보여주는 지그재그 스캔 패턴을 나타낸다.

2011년 3월 13일, 한 무리의 FFmpeg 개발자들이 Libav라는 이름으로 프로젝트를 포크하기로 결정했다. 이 그룹은 FFmpeg 리더십과의 의견 불일치로 인해 프로젝트를 포크하기로 결정했다.
Libav는 2020년에 폐기된 것으로 선언되었다.

2014년 1월 10일, 두 명의 구글 직원이 퍼즈 테스트를 통해 지난 2년 동안 FFmpeg에서 1000개 이상의 버그가 수정되었다고 발표했다.

2018년 1월, FFmpeg의 오랜 구성 요소였던 ffserver 명령줄 프로그램이 제거되었다. 개발자들은 이전에 내부 API 사용으로 인한 높은 유지 관리 노력을 이유로 이 프로그램을 더 이상 사용하지 않을 것(deprecated)이라고 밝힌 바 있다.

이 프로젝트는 평균 3개월마다 새로운 릴리스를 발표한다. 웹사이트에서 릴리스 버전을 다운로드할 수 있지만, FFmpeg 개발자들은 사용자가 깃 버전 관리 시스템을 사용하여 최신 소스 코드 빌드에서 소프트웨어를 직접 컴파일할 것을 권장한다.

 코덱 역사 
지금까지 FFmpeg 프로젝트 내에서 해당 코덱이 있는 두 개의 영상 코딩 포맷과 하나의 컨테이너 포맷이 만들어졌다. 두 개의 비디오 코덱은 비손실 FFV1과, 비손실 및 손실을 지원하는 Snow 코덱이다. Snow의 개발은 정체되었으며, 비트스트림 포맷이 아직 확정되지 않아 2011년부터 실험적인 상태로 남아 있다. NUT이라는 멀티미디어 컨테이너 포맷은 더 이상 활발하게 개발되지 않지만 여전히 유지 관리되고 있다.

2010년 여름, FFmpeg 개발자인 피오나 글레이저(Fiona Glaser), 로날드 불체(Ronald Bultje), 데이비드 콘래드(David Conrad)는 ffvp8 디코더를 발표했다. 테스트를 통해 그들은 ffvp8이 구글의 자체 libvpx 디코더보다 빠르다는 것을 확인했다. 버전 0.6부터 FFmpeg은 WebM과 VP8도 지원했다.

2013년 10월, 네이티브 VP9 디코더와 오픈 소스 고효율 비디오 코딩(HEVC) 디코더인 OpenHEVC가 FFmpeg에 추가되었다. 2016년에는 네이티브 AAC 인코더가 안정적인 것으로 간주되어 VisualOn과 FAAC의 두 외부 AAC 인코더에 대한 지원이 제거되었다. FFmpeg 3.0("Einstein")은 Fraunhofer FDK AAC 인코더에 대한 빌드 지원을 유지했다. 버전 3.4 "Cantor"부터 FFmpeg은 FITS 이미지 포맷을 지원했다. 2018년 11월 버전 4.1 "al-Khwarizmi" 이후로 AV1은 WebM을 포함하여 MP4 및 Matroska에서 뮤싱될 수 있다.

 구성 요소 

 명령줄 도구 
 ffmpeg은 오디오 또는 비디오 포맷을 변환하는 명령줄 도구이다. 또한 TV 캡처 카드와 같은 다양한 하드웨어 및 소프트웨어 소스로부터 실시간으로 캡처하고 인코딩할 수 있다.
 ffplay는 SDL과 FFmpeg 라이브러리를 사용하는 간단한 미디어 플레이어이다.
 ffprobe는 미디어 정보(텍스트, CSV, XML, JSON)를 표시하는 명령줄 도구이다. MediaInfo도 참조하라.

 라이브러리 
 libswresample은 오디오 리샘플링 루틴을 포함하는 라이브러리이다.
 Libavcodec은 모든 네이티브 FFmpeg 오디오/비디오 인코더와 디코더를 포함하는 라이브러리이다. 대부분의 코덱은 최고의 성능과 높은 코드 재사용성을 보장하기 위해 처음부터 개발되었다.
 libavformat (Lavf)는 오디오/비디오 컨테이너 포맷을 위한 디뮤저와 뮤저를 포함하는 라이브러리이다.
 libavutil은 FFmpeg의 여러 부분에서 공통적으로 사용되는 루틴을 포함하는 도우미 라이브러리이다. 이 라이브러리에는 해시 함수, 암호, LZO 압축 해제기 및 베이스64 인코더/디코더가 포함되어 있다.
 libswscale은 비디오 이미지 스케일링 및 색 공간/픽셀 포맷 변환 루틴을 포함하는 라이브러리이다.
 libavfilter는 vhook의 대체물로, 디코더와 인코더 사이에서 비디오/오디오를 수정하거나 검사(디버깅용)할 수 있게 해준다. 필터는 MPlayer 및 AviSynth를 포함한 많은 프로젝트에서 이식되었다.
 libavdevice는 내부 및 외부 장치를 통한 오디오/비디오 입출력을 포함하는 라이브러리이다.

 지원 하드웨어 
 CPU 
FFmpeg은 비디오 및 오디오 압축 및 압축 해제 알고리즘의 소프트웨어 구현을 포괄한다. 이들은 X86(IA-32 및 X86-64), PPC(파워PC), ARM, DEC 알파, SPARC 및 MIPS를 포함한 다양한 명령어 집합에서 컴파일되고 실행될 수 있다.

 특수 목적 하드웨어 
오디오/비디오 압축 및 압축 해제를 위한 다양한 주문형 집적 회로(ASIC)가 존재한다. 이러한 ASIC은 호스트 CPU로부터 계산 부담을 부분적으로 또는 완전히 덜어줄 수 있다. 알고리즘의 완전한 구현 대신 이러한 ASIC을 사용하기 위한 API만 있으면 된다.

다음 API들도 지원된다: DirectX 비디오 가속(DXVA2, 윈도우), Direct3D 11(D3D11VA, 윈도우), 미디어 파운데이션(윈도우), Vulkan(VKVA), VideoToolbox(iOS, iPadOS, macOS), RockChip MPP, OpenCL, OpenMAX, MMAL(Raspberry Pi), MediaCodec(안드로이드 OS), V4L2(리눅스). 환경에 따라 이러한 API는 특정 ASIC, GPGPU 루틴 또는 CPU의 SIMD 코드로 연결될 수 있다.

 지원 코덱 및 포맷 
 이미지 포맷 

FFmpeg은 많은 일반적인 이미지 포맷과 일부 특이한 이미지 포맷을 지원한다.

PGMYUV 이미지 포맷은 바이너리(P5) PGM Netpbm 포맷의 자체 변형이다. FFmpeg은 또한 PGM 및 PPM 포맷의 16비트 심도와, 알파 채널 유무에 따른 바이너리(P7) PAM 포맷(pix_fmts monob, gray, gray16be, rgb24, rgb48be, ya8, rgba, rgb64be에 대해 8비트 또는 16비트 심도)을 지원한다.

 지원 포맷 

FFmpeg 내에서 만들어지고 개발된 FFV1 및 Snow 포맷 외에도 이 프로젝트는 다음 포맷들을 지원한다:

 뮤저 
FFmpeg에서 출력 포맷(컨테이너 포맷 및 출력 스트림을 만드는 기타 방법)은 "뮤저(muxers)"라고 불린다. FFmpeg은 다음과 같은 것들을 지원한다:

 AIFF
 ASF
 AVI 및 AviSynth로부터의 입력
 BFI
 CAF
 FLV
 GIF
 GXF, General eXchange Format, SMPTE 360M
 HLS, HTTP Live Streaming
 IFF
 ISO base media file format (QuickTime, 3GP 및 MP4 포함)
 Matroska (WebM 포함)
 Maxis XA
 MPEG-DASH
 MPEG 프로그램 스트림
 MPEG 트랜스포트 스트림 (AVCHD 포함)
 MXF, Material eXchange Format, SMPTE 377M
 MSN Webcam 스트림
 NUT
 Ogg
 OMA
 RL2
 세그먼트 (분할된 비디오 스트림 생성용)
 Smooth Streaming
 TXD
 WTV

 픽셀 포맷 

FFmpeg은 IMC1-IMC4, AI44, CYMK, RGBE, Log RGB 및 기타 포맷을 지원하지 않는다. 또한 ARGB 1:5:5:5, 2:10:10:10 또는 기타 일반적으로 사용되지 않는 BMP 비트필드 포맷도 아직 지원하지 않는다.

 지원 프로토콜 

 개방형 표준 

 IETF RFC:
 FTP
 Gopher
 HLS
 HTTP
 HTTPS
 RTP
 RTSP
 SCTP
 SDP
 SRTP
 TCP
 TLS
 UDP
 UDP-Lite
 IETF I-Ds:
 SFTP (libssh를 통해)
 마이크로소프트 OSP:
 CIFS/SMB (libsmbclient를 통해) 
 MMS over TCP (MS-MMSP) 
 MMS over HTTP (MS-WMSP)
 CENELEC
 SAT>IP
 OASIS 표준:
 AMQP 0-9-1 (librabbitmq를 통해)
 SRT Alliance 표준:
 SRT (libsrt를 통해)

 사실상 표준 

 RTSP over TLS
 Icecast 프로토콜
 어도비 RTMP, RTMPT, RTMPE, RTMPTE 및 RTMPS
 RealMedia RTSP/RDT
 ZeroMQ (libzmq를 통해)
 RIST (librist)

 지원 필터 

FFmpeg은 다른 무엇보다 다음 필터들을 지원한다.

 오디오 

 리샘플링 (aresample)
 통과/저지 필터
 로우패스 필터 (lowpass)
 하이패스 필터 (highpass)
 전역 통과 필터 (allpass)
 버터워스 대역 필터 (bandpass)
 버터워스 대역 저지 필터 (bandreject)
 임의 유한 임펄스 응답 필터 (afir)
 임의 무한 임펄스 응답 필터 (aiir)
 이퀄라이저
 피크 이퀄라이저 (equalizer)
 버터워스/체비쇼프 유형 I/유형 II 멀티밴드 이퀄라이저 (anequalizer)
 로우 셀빙 필터 (bass)
 하이 셀빙 필터 (treble)
 Xbox 360 이퀄라이저
 FIR 이퀄라이저 (firequalizer)
 바이쿼드 필터 (biquad)
 DC 오프셋 제거/추가 (dcshift)
 표현식 평가
 시간 영역 표현식 평가 (aeval)
 주파수 영역 표현식 평가 (afftfilt)
 다이내믹스
 리미터 (alimiter)
 컴프레서 (acompressor)
 다이내믹 레인지 익스팬더 ()
 사이드 체인 컴프레서 (sidechaincompress)
 컴팬더 (compand)
 노이즈 게이트 (agate)
 사이드 체인 노이즈 게이트 (sidechaingate)
 왜곡
 비트크러셔 (acrusher)
 엠퍼시스 (aemphasis)
 증폭/노멀라이저
 볼륨 (volume)
 Dynamic Audio Normalizer (dynaudnorm)
 EBU R 128 음량 노멀라이저 (loudnorm)
 변조
 정현파 진폭 변조 (tremolo)
 정현파 위상 변조 (vibrato)
 페이저 (aphaser)
 코러스 (chorus)
 플랜저 (flanger)
 Pulsator (apulsator)
 에코/리버브
 에코 (aecho)
 라우팅/패닝
 스테레오 확장 (stereowiden)
 채널 차이 증가 (extrastereo)
 M/S를 L/R로 (stereotools)
 채널 매핑 (channelmap)
 채널 분리 (channelsplit)
 채널 패닝 (pan)
 채널 병합 (amerge)
 채널 결합 (join)
 헤드폰용
 스테레오를 바이노럴로 (earwax, SoX에서 이식됨)
 Bauer 스테레오를 바이노럴로 (bs2b, libbs2b를 통해)
 크로스피드 (crossfeed)
 다채널을 바이노럴로 (sofalizer, libnetcdf 필요)
 지연
 지연 (adelay)
 거리에 따른 지연 (compensationdelay)
 페이드
 페이더 (afade)
 크로스페이더 (acrossfade)
 오디오 시간 늘리기 및 피치 스케일링
 시간 늘리기 (atempo)
 시간 늘리기 및 피치 시프팅 (rubberband, librubberband를 통해)
 편집
 트리밍 (atrim)
 묵음 패딩 (apad)
 묵음 제거 (silenceremove)
 프레임/채널 정보 표시
 프레임 정보 표시 (ashowinfo)
 채널 정보 표시 (astats)
 묵음 구간 표시 (silencedetect)
 오디오 볼륨 표시 (volumedetect)
 리플레이게인 스캐너 (replaygain)
 프레임/채널 정보 수정
 출력 포맷 설정 (aformat)
 샘플 수 설정 (asetnsamples)
 샘플링 레이트 설정 (asetrate)
 믹서 (amix)
 동기화 (asyncts)
 HDCD 데이터 디코더 (hdcd)
 플러그인
 LADSPA (ladspa)
 LV2 (lv2)
 아무것도 하지 않음 ()

 비디오 

 변환
 크로핑 (crop, cropdetect)
 디졸브 (fade)
 스케일링 (scale)
 패딩 (pad)
 회전 (rotate)
 전치 (transpose)
 기타:
 렌즈 보정 (lenscorrection)
 OpenCV 필터링 (ocv)
 원근 보정 (perspective)
 시간적 편집
 프레임 레이트 (fps, framerate)
 루핑 (loop)
 트리밍 (trim)
 디인터레이스 (bwdif, idet, kerndeint, nnedi, yadif, w3fdif)
 Inverse Telecine
 필터링
 블러링 (boxblur, gblur, avgblur, sab, smartblur)
 합성곱 필터
 합성곱 (convolution)
 윤곽선 검출 (edgedetect)
 소벨 필터 (sobel)
 Prewitt 필터 (prewitt)
 언샤프 마스킹 (unsharp)
 데노이징 (atadenoise, bitplanenoise, dctdnoiz, owdenoise, removegrain)
 로고 제거 (delogo, removelogo)
 자막 (ASS, subtitles)
 알파 채널 편집 (alphaextract, alphamerge)
 크로마키 (chromakey, colorkey, lumakey)
 프레임 검출
 블랙 프레임 검출 (blackdetect, blackframe)
 섬네일 선택 (thumbnail)
 프레임 혼합 (blend, tblend, overlay)
 비디오 안정화 (vidstabdetect, vidstabtransform)
 색상 및 레벨 조정
 밸런스 및 레벨 (colorbalance, colorlevels)
 채널 믹싱 (colorchannelmixer)
 색 공간 (colorspace)
 매개변수 조정 (curves, eq)
 히스토그램 및 시각화
 CIE Scope (ciescope)
 Vectorscope (vectorscope)
 Waveform monitor (waveform)
 색 히스토그램 (histogram)
 그리기
 OCR
 품질 측정
 SSIM (ssim)
 PSNR (psnr)
 룩업 테이블 (LUT)
 lut, lutrgb, lutyuv, lut2, lut3d, haldclut

 지원 테스트 패턴 
 SMPTE 컬러바 (smptebars 및 smptehdbars)
 EBU 컬러바 (pal75bars 및 pal100bars)

 지원 LUT 포맷 
 cineSpace LUT 포맷
 Iridas Cube
 어도비 애프터 이펙트 3dl
 다빈치 리졸브 dat
 Pandora m3d

 지원 미디어 및 인터페이스 
FFmpeg은 외부 라이브러리를 통해 다음 장치들을 지원한다.

 미디어 
 콤팩트 디스크 (libcdio를 통해; 입력 전용)

 물리적 인터페이스 
 IEEE 1394 (일명 파이어와이어; libdc1394 및 libraw1394를 통해; 입력 전용)
 IEC 61883 (libiec61883을 통해; 입력 전용)
 DeckLink
 Brooktree 비디오 캡처 칩 (bktr 드라이버를 통해; 입력 전용)

 오디오 입출력 
 고급 리눅스 사운드 아키텍처 (ALSA)
 오픈 사운드 시스템 (OSS)
 펄스오디오
 잭 오디오 커넥션 키트 (JACK; 입력 전용)
 OpenAL (입력 전용)
 sndio
 코어 오디오 (macOS용)
 AVFoundation (입력 전용)
 AudioToolbox (출력 전용)

 비디오 입출력 
 Video4Linux2
 비디오 포 윈도우 (입력 전용)
 윈도우 다이렉트쇼
 안드로이드 카메라 (입력 전용)

 화면 캡처 및 출력 
 심플 다이렉트미디어 레이어 2 (출력 전용)
 OpenGL (출력 전용)
 리눅스 프레임버퍼 (fbdev)
 그래픽 장치 인터페이스 (GDI; 입력 전용)
 X 윈도 시스템 (X11; XCB를 통해; 입력 전용)
 X video extension (XV; Xlib를 통해; 출력 전용)
 Kernel Mode Setting (libdrm을 통해; 입력 전용)

 기타 
 아스키 아트 (libcaca를 통해; 출력 전용)

 애플리케이션 

 법적 측면 
FFmpeg은 100개 이상의 코덱을 포함하고 있으며, 그 중 대부분은 이런저런 압축 기술을 사용한다. 이러한 많은 압축 기술은 소프트웨어 특허와 관련된 법적 청구의 대상이 될 수 있다. 이러한 청구는 소프트웨어 특허를 시행하는 미국과 같은 국가에서는 집행 가능할 수 있지만, 예를 들어 유럽 연합 회원국에서는 집행 불가능하거나 무효로 간주된다. AC3 및 모든 MPEG-1 및 MPEG-2 코덱을 포함한 많은 오래된 코덱의 특허는 만료되었다.

FFmpeg은 LGPL 라이선스에 따라 라이선스가 부여되지만, 특정 FFmpeg 빌드가 GPL 라이브러리(특히 X264)와 링크된 경우 전체 바이너리는 GPL에 따라 라이선스가 부여된다.

 FFmpeg을 사용하는 프로젝트 

FFmpeg은 Blender, Cinelerra-GG Infinity, HandBrake, Kodi, MPC-HC, Plex, Shotcut, VirtualDub2(VirtualDub 포크), VLC 미디어 플레이어, Xine 및 유튜브와 같은 소프트웨어에서 사용된다. 또한 구글 크롬과 리눅스 버전의 파이어폭스에서 비디오 및 오디오 재생을 처리한다. Multimedia Xpert 및 XMedia Recode를 포함한 FFmpeg용 GUI 프런트엔드가 개발되었다.

FFmpeg은 Ffdshow, FFmpegInterop, GStreamer FFmpeg 플러그인, LAV Filters 및 OpenMAX IL에서 각각의 멀티미디어 플랫폼의 인코딩 및 디코딩 기능을 확장하는 데 사용된다.

NASA의 마스 2020 임무의 일환으로, FFmpeg은 화성의 퍼서비어런스 탐사차에서 영상이 지구로 전송되기 전 이미지 및 비디오 압축을 위해 사용된다.

 임베디드 애플리케이션 
FFmpeg은 또한 임베디드 애플리케이션에서도 사용되는데, 여기서 커스텀 하드웨어와 함께 사용하여 버전 및 종속성 관리를 단순화하고 여러 다른 OS 및 프로세서 제조업체에 걸쳐 운영체제 추상화를 제공할 수 있다.

 각주 

 외부 링크 
 
 

분류:자유 소프트웨어
분류:C 라이브러리
분류:오디오 라이브러리
분류:비디오 라이브러리
분류:멀티미디어
분류:C로 작성된 자유 소프트웨어
분류:크로스 플랫폼 자유 소프트웨어
분류:자유 라이브러리
분류:멀티미디어 프레임워크
분류:어셈블리어 소프트웨어
분류:명령줄 소프트웨어