Meta의 FFmpeg 활용 — 하루 수백억 회, 대규모 미디어 처리의 비밀
내부 포크 폐기, 멀티레인 병렬 인코딩, 실시간 품질 메트릭, 자체 ASIC까지
Meta Engineering Blogの記事を基に、MetaがFFmpegをどう活用しているかを整理한다.
하루 수백억 회
Meta는 ffmpeg(변환 CLI)과 ffprobe(메타데이터 조회)를 하루 수백억 회 실행한다. 하루 10억 건 이상의 동영상 업로드를 처리하며, 각 영상을 DASH 재생용 다중 해상도·코덱·화질로 인코딩한다.
내부 포크의 문제
Meta는 오랫동안 FFmpeg 내부 포크를 운영했다. 당시 업스트림에 없던 기능이 필요했기 때문이다:
스레드 기반 멀티레인 인코딩
실시간 품질 메트릭 계산
근데 포크가 업스트림과 점점 멀어지면서 문제가 커졌다. 새 코덱·포맷 지원이 업스트림에만 들어오고, 리베이스할 때마다 리그레션이 터졌다. 사용자가 올리는 다양한 포맷의 영상을 중단 없이 처리하려면 업스트림 최신 버전이 필요했다.
결국 FFlabs, VideoLAN과 협력해서 내부 포크를 완전히 폐기하고 업스트림만 쓰는 방향으로 전환했다.
멀티레인 트랜스코딩
DASH 재생을 위해 하나의 영상을 여러 해상도·코덱·프레임레이트·화질로 인코딩해야 한다. 앱의 비디오 플레이어가 네트워크 상태에 따라 실시간으로 인코딩을 전환한다.
가장 단순한 방식은 각 레인을 개별 FFmpeg 프로세스로 돌리는 것이다. 근데 이러면 디코딩을 레인 수만큼 반복하고, 프로세스 시작 오버헤드도 레인 수만큼 발생한다.
단일 FFmpeg 명령줄에서 프레임을 한 번만 디코딩하고 각 인코더로 분배하면, 디코딩 중복이 사라지고 프로세스 오버헤드도 1회로 줄어든다. 하루 10억 건 이상을 처리하는 규모에서 프로세스당 절감이 전체적으로 큰 차이를 만든다.
병렬 인코딩 스레딩
기존 FFmpeg은 여러 인코더를 쓸 때 프레임별로 직렬 실행했다. Meta 내부 포크는 모든 인코더 인스턴스를 병렬 실행하도록 수정했다.
FFmpeg 개발자들(FFlabs, VideoLAN 포함)의 기여로 FFmpeg 6.0부터 더 효율적인 스레딩이 구현되기 시작해 8.0에서 완성됐다. Meta 내부 포크의 설계에 직접적인 영향을 받았으며, 수십 년 만에 가장 복잡한 FFmpeg 리팩토링으로 기록됐다.
이 개선은 Meta만이 아니라 모든 FFmpeg 사용자에게 더 효율적인 인코딩을 제공한다.
실시간 품질 메트릭
PSNR, SSIM, VMAF 같은 품질 메트릭은 압축으로 인한 화질 손실을 수치로 표현한다. 기존 FFmpeg에서는 인코딩 완료 후 별도 명령줄로 계산했다. 근데 라이브스트리밍에서는 실시간으로 계산해야 한다.
Meta의 해법: 각 출력 레인의 인코더 뒤에 디코더를 삽입한다. 인코딩된 프레임을 다시 디코딩해서 원본과 비교하면, 단일 FFmpeg 명령줄에서 각 레인의 품질 메트릭을 실시간으로 뽑을 수 있다.
FFmpeg 7.0부터 FFlabs와 VideoLAN 개발자의 기여로 "인루프(in-loop)" 디코딩이 활성화되어, 이 기능에 대한 내부 포크 의존이 완전히 해소됐다.
자체 ASIC — MSVP
Meta는 비디오 트랜스코딩 전용 ASIC인 MSVP(Meta Scalable Video Processor)를 자체 설계했다. FFmpeg의 표준 하드웨어 API(NVIDIA NVDEC/NVENC, Intel QSV 등과 동일한 인터페이스)를 통해 MSVP를 통합했다.
소프트웨어 파이프라인과 하드웨어 파이프라인이 동일한 FFmpeg CLI로 동작하니, 파이프라인 간 일관성이 유지된다.
MSVP는 Meta 내부 인프라에서만 사용되고, 외부 개발자가 하드웨어에 접근할 수 없으므로 이 패치는 내부에만 유지된다.
업스트림 기여 기준
Meta의 기준은 명확하다:
범용적 개선 → 업스트림 기여 (멀티레인 스레딩, 실시간 품질 메트릭)
Meta 인프라 특화 → 내부 패치 유지 (MSVP 지원)
25년 이상 개발된 FFmpeg에 대한 지속적 투자를 통해, Meta 플랫폼의 새로운 동영상 경험과 안정성을 동시에 강화한다는 방향이다.
동작 흐름
Meta는 하루 수백억 회 ffmpeg/ffprobe를 실행하며, 10억+ 건의 영상을 DASH용으로 인코딩
단일 명령줄에서 1회 디코딩 → 다중 인코더 분배로 디코딩 중복 제거
FFmpeg 6.0~8.0에 구현된 병렬 스레딩은 Meta 포크 설계 기반
인코더 뒤에 디코더를 삽입해 실시간 품질 메트릭(PSNR/SSIM/VMAF) 산출
자체 ASIC(MSVP)을 FFmpeg 표준 하드웨어 API로 통합
범용 개선은 업스트림 기여, Meta 특화 패치는 내부 유지