메타에서의 FFmpeg: 대규모 미디어 처리

2 weeks ago 9

  • 메타는 FFmpeg과 ffprobe를 하루 수백억 번 실행하며, 대규모 미디어 파일 처리에서 발생하는 복잡한 문제를 해결함
  • 내부 포크 버전에서 사용하던 멀티레인 병렬 인코딩실시간 화질 지표 계산 기능을 오픈소스 FFmpeg에 반영해 완전한 통합을 달성함
  • FFmpeg 6.0~8.0 버전에서 구현된 효율적 스레딩 구조는 메타의 설계를 기반으로 하며, 모든 사용자에게 인코딩 효율 향상을 제공함
  • MSVP(메타 확장형 비디오 프로세서) 같은 맞춤형 하드웨어도 FFmpeg의 표준 API를 통해 통합되어, 소프트웨어·하드웨어 간 일관된 워크플로우를 유지함
  • 메타는 FFmpeg 커뮤니티와의 협력을 지속하며, 오픈소스 생태계와 산업 전반의 효율성 향상을 목표로 투자 확대를 이어감

FFmpeg의 역할과 메타의 사용 규모

  • FFmpeg은 다양한 오디오·비디오 코덱과 컨테이너 포맷을 지원하는 산업 표준 도구로, 복잡한 필터 체인을 통해 미디어 편집과 조작을 수행
  • 메타는 FFmpeg과 ffprobe를 하루 수십억~수백억 회 실행하며, 앱 사용자에게 새로운 영상 경험과 안정성을 제공
  • 초기에는 스레드 기반 멀티레인 인코딩실시간 품질 측정 기능을 위해 내부 포크 버전을 유지했으나, 최근 FFmpeg 본류에 해당 기능이 추가됨

내부 포크에서 오픈소스 FFmpeg로의 전환

  • 내부 포크는 시간이 지나며 업스트림 버전과 크게 분기되었고, 최신 코덱과 포맷 지원을 위해 두 버전을 병행 운영해야 했음
  • 이로 인해 기능 불일치와 리베이스 시 회귀 위험이 발생
  • 메타는 FFmpeg 개발자, FFlabs, VideoLAN과 협력해 필요한 기능을 업스트림에 반영하고, 내부 포크를 완전히 폐기함

멀티레인 트랜스코딩 효율화

  • 사용자가 영상을 업로드하면, DASH 스트리밍용 다중 인코딩 세트를 생성
    • 각 인코딩은 해상도, 코덱, 프레임레이트, 화질 수준이 다르며, 플레이어는 네트워크 상태에 따라 실시간 전환 가능
  • 기존에는 각 인코딩을 개별 FFmpeg 명령으로 처리했으나, 단일 명령 내 다중 출력 생성으로 디코딩 중복을 제거해 효율 향상
  • 내부 포크는 병렬 인코딩 최적화를 추가했으며, FFmpeg 6.0~8.0에서 이 구조가 공식 반영됨
    • 이 과정은 “수십 년 만의 가장 복잡한 리팩터링”으로 평가됨

실시간 화질 지표 계산 기능

  • PSNR, SSIM, VMAF 등 시각적 품질 지표는 압축 손실을 수치화하는 데 사용
  • 기존 FFmpeg은 인코딩 완료 후 별도 명령으로 계산했으나, 라이브 스트리밍에서는 실시간 계산이 필요
  • 이를 위해 각 출력 레인마다 인코더 뒤에 디코더를 삽입해, 압축 전후 프레임을 비교
  • FFmpeg 7.0부터 “in-loop 디코딩” 기능이 추가되어, 내부 포크 없이 실시간 품질 측정이 가능해짐

오픈소스 기여와 내부 유지 기능

  • 메타는 멀티레인 인코딩과 실시간 품질 측정 같은 기능을 업스트림화해 커뮤니티 전체의 효율 향상을 도모
  • 반면, Meta Scalable Video Processor(MSVP) 지원처럼 내부 인프라 전용 기능은 외부 테스트가 불가능해 내부 유지
    • FFmpeg의 표준 하드웨어 API를 활용해 NVENC, QSV 등과 동일한 방식으로 통합
    • 내부 패치는 최신 FFmpeg 버전에 맞춰 지속적으로 리베이스 및 검증

FFmpeg에 대한 지속적 투자

  • 효율적 인코딩과 실시간 품질 측정 도입으로 VOD 및 라이브 파이프라인에서 내부 포크 완전 폐기
  • FFmpeg의 표준화된 하드웨어 API 덕분에 MSVP ASIC과 소프트웨어 파이프라인의 통합 운영이 가능
  • 25년 이상 개발된 FFmpeg은 자원 활용, 코덱 지원, 안정성 향상을 통해 다양한 미디어를 지원
  • 메타는 오픈소스 개발자와 협력해 FFmpeg 발전에 계속 투자하며, 산업 전반과 사용자 경험 개선을 목표로 함

Read Entire Article