들어가며: 넷플릭스의 미디어 처리 과제

넷플릭스는 전 세계 수백 시간 분량의 카메라 원본 파일을 매일 수집합니다. 각 시리즈와 영화는 저마다 다른 카메라 포맷, 해상도, 컬러 스페이스를 사용하며, 제작사마다 워크플로우가 제각각입니다. 이런 환경에서 반복적인 파일 관리 작업에 크리에이티브 시간을 빼앗기지 않도록 하기 위해 넷플릭스는 Media Production Suite(MPS) 를 개발했습니다.

MPS의 핵심 목표는 세 가지입니다:

  • 반복 작업 자동화
  • 주요 워크플로우 표준화
  • 제작팀이 창의적 협업에 집중할 시간 확보

이를 실현하기 위해 넷플릭스는 모든 것을 자체 개발하지 않고, 업계에서 이미 검증된 솔루션과 전략적으로 협력했습니다. 그 중심에 있는 것이 FilmLight API(FLAPI) 입니다. Step 3.7 Flash 엔터프라이즈 멀티모달 AI의 새로운 기준에서 다룬 GPU 기반 추론과 마찬가지로, 넷플릭스는 기존의 강력한 도구를 클라우드 네이티브 환경에 맞게 재구성했습니다.

Netflix cloud infrastructure for media processing with FLAPI integration

MPS의 미디어 처리 엔진: FLAPI 통합 방식

MPS는 단일 애플리케이션이 아니라, 전 세계 넷플릭스 제작을 지원하는 도구와 서비스의 생태계입니다. 그 안에서 FLAPI는 다음과 같은 역할을 수행합니다.

1. 카메라 메타데이터 검사 (Inspection)

제작진이 ASC MHL(Media Hash List) 파일과 함께 미디어를 업로드하면, MPS는 FLAPI를 통해 원본 카메라 파일의 기술적 특성을 분석합니다.

# FLAPI를 활용한 메타데이터 검사 예시 (Python)
import flapi

# Docker 컨테이너 내에서 FLAPI 인스턴스 생성
engine = flapi.MediaEngine(
    license_path="/etc/flapi/license.lic",
    work_dir="/tmp/flapi_work"
)

# 원본 카메라 파일 열기
clip = engine.open_clip("/mnt/media/raw/A001_C001_0101R5.mov")

# 메타데이터 추출
metadata = clip.get_metadata()
print(f"카메라: {metadata.camera_model}")
print(f"포맷: {metadata.format}")
print(f"프레임 레이트: {metadata.frame_rate}")
print(f"해상도: {metadata.width}x{metadata.height}")

# 넷플릭스 정규화 스키마에 맞게 변환
normalized = normalize_to_netflix_schema(metadata)
save_to_searchable_store(normalized)

# 리소스 정리
clip.close()
engine.shutdown()

이 메타데이터는 이후 타임라인 매칭, 디버깅, 파이프라인 검증에 재사용됩니다. FLAPI는 Docker 이미지로 패키징되어 클라우드와 온프레미스 컴퓨팅 센터에 동일하게 배포되므로, 전 세계 어디서든 일관된 검사 결과를 보장합니다.

2. VFX 플레이트 및 결과물 생성

시각 효과(VFX) 워크플로우는 이미지 처리 파이프라인에 가장 까다로운 요구를 합니다. MPS는 FLAPI를 사용해:

  • 포맷별 올바른 디베이어/디코딩 파라미터 적용
  • Framing Decision Lists(ASC FDL) 기반 크롭 및 디스퀴즈
  • ACES Metadata Files(AMF) 적용으로 반복 가능한 컬러 파이프라인 구축
  • 다양한 포맷의 미디어 결과물 생성
# FLAPI를 이용한 VFX 플레이트 생성 예시
import flapi

engine = flapi.MediaEngine()
clip = engine.open_clip("/mnt/media/raw/B001_C002_0102R7.mov")

# 디베이어 설정 (ARRI RAW 예시)
debayer_params = flapi.DebayerParams(
    format="ARRI_RAW",
    decode_quality="full",
    color_space="ACEScct"
)

# FDL 적용 (프레이밍 결정 리스트)
fdl = flapi.FramingDecisionList.from_file("/mnt/metadata/EP01_SC02.fdl")

# AMF 적용 (ACES 메타데이터 파일)
amf = flapi.ACESMetadataFile.from_file("/mnt/metadata/EP01_SC02.amf")

# OpenEXR 시퀀스 렌더링
output_dir = "/mnt/output/vfx_plates/EP01_SC02/"
engine.render_frames(
    clip=clip,
    frame_range=(1001, 1120),
    debayer=debayer_params,
    framing=fdl,
    color_pipeline=amf,
    output_format="openexr",
    output_directory=output_dir
)

clip.close()
engine.shutdown()

이 모든 과정은 자동화되고 반복 가능하며 감사 가능합니다. AMF는 OpenEXR과 함께 전달되어 수신자가 어떤 컬러 변환이 적용되었는지 정확히 알 수 있습니다.

3. 클라우드 네이티브 배포: Cosmos Stratum Functions

넷플릭스는 FLAPI를 서버리스 함수처럼 동작하도록 패키징했습니다. 각 함수는 단일 클립이나 클립의 일부를 처리하고 종료됩니다.

# Dockerfile 예시: FLAPI 기반 처리 컨테이너
FROM ubuntu:22.04

# FLAPI 라이브러리 설치
COPY flapi-package_3.2.1_amd64.deb /tmp/
RUN dpkg -i /tmp/flapi-package_3.2.1_amd64.deb && rm /tmp/flapi-package_3.2.1_amd64.deb

# Python 바인딩 및 Cosmos Stratum 런타임
COPY requirements.txt /app/
RUN pip install -r /app/requirements.txt

COPY stratum_function.py /app/

# 서버리스 엔트리포인트
CMD ["python", "/app/stratum_function.py"]
# stratum_function.py: Cosmos Stratum Function 진입점
import json
import flapi
import os

def handler(event, context):
    """단일 클립 처리 함수"""
    clip_path = event['clip_path']
    output_dir = event['output_dir']
    frame_range = event.get('frame_range', None)
    
    engine = flapi.MediaEngine()
    clip = engine.open_clip(clip_path)
    
    if frame_range:
        start, end = frame_range
        clip.trim(start, end)
    
    # 처리 로직 (예: 트랜스코딩)
    clip.transcode(
        output_format="dnxhr_444",
        output_path=os.path.join(output_dir, os.path.basename(clip_path) + ".mxf")
    )
    
    clip.close()
    engine.shutdown()
    
    return {
        'statusCode': 200,
        'body': json.dumps({'processed': clip_path})
    }

이러한 접근 방식 덕분에 넷플릭스는 CPU 인스턴스만으로도 방대한 인코딩 풀을 활용할 수 있었고, GPU 인스턴스는 다른 워크로드에 할당할 수 있었습니다.

Serverless functions in Docker containers for elastic scaling of image processing System Abstract Visual

탄력적 확장과 생산성 향상

제작 워크로드는 본질적으로 스파이크성이 강합니다.

  • 조용한 날: 검사할 신규 푸티지 최소
  • VFX 턴오버 또는 트리밍 작업: 단시간에 수천 개의 병렬 렌더 필요

FLAPI를 클라우드 함수로 배포함으로써 MPS는:

  • 수요에 따라 컴퓨팅 자원을 즉시 할당하고 해제
  • 고정된 로컬 하드웨어 풀에 용량을 묶지 않음
  • 공유 리소스 풀에서 여러 인코딩 워크로드 간 수요 평활화

이 탄력성 덕분에 피크 프로덕션 기간에도 수동 큐 관리 없이 빠른 처리 시간을 유지할 수 있습니다.

국내 개발 생태계에서의 적용 맥락

국내 방송사나 OTT 플랫폼에서도 유사한 고민이 많습니다. 특히:

  • 다양한 카메라 포맷(소니 베니스, 레드 코모도, ARRI Alexa 등) 지원
  • 컬러 매니지먼트 파이프라인(ACES) 표준화
  • 클라우드 기반 VFX 협업 환경 구축

SI 환경에서는 레거시 시스템과의 통합이 까다로울 수 있습니다. FLAPI와 같은 API 기반 접근은 기존 MAM(Media Asset Management) 시스템과 비교적 쉽게 연동할 수 있어 좋은 선택지가 됩니다. 다만, 라이선스 비용과 초기 Docker 환경 구성에 대한 투자가 필요하다는 점은 고려해야 합니다.

이 기술의 한계 및 주의사항

  • FLAPI는 GPU 가속도 지원하지만, 넷플릭스는 CPU 인스턴스만 사용했습니다. 국내 환경에서 GPU 인스턴스 비용이 부담된다면 CPU 기반 처리로도 충분한 성능을 낼 수 있는지 사전 검증이 필요합니다.
  • FLAPI 의존도가 높아지면 FilmLight의 업데이트 주기와 로드맵에 영향을 받을 수 있습니다. 넷플릭스는 이를 완화하기 위해 ACES, ASC FDL 같은 오픈 스탠다드를 적극 활용했습니다.
  • 모든 카메라 포맷이 완벽하게 지원되는 것은 아니므로, 프로덕션 전에 지원 대상 포맷을 반드시 확인해야 합니다.

다음 단계 학습 방향

  • ACES 2.0 표준과 컬러 매니지먼트 심화 학습
  • ASC MHL(Media Hash List)과 미디어 무결성 검증
  • 클라우드 네이티브 미디어 처리 아키텍처 (서버리스, 이벤트 기반)
  • 메타의 자율 AI 에이전트 REA, ML 실험을 혁신하다에서 다룬 AI 기반 자동화와의 시너지 고려

Camera file inspection and metadata extraction workflow using FilmLight API IT Technology Image

결론: 협업과 오픈 스탠다드의 힘

넷플릭스의 MPS 사례는 모든 것을 자체 개발하기보다, 검증된 파트너 기술을 클라우드 네이티브 환경에 맞게 통합하는 전략의 효과를 잘 보여줍니다. FLAPI를 Docker 기반 서버리스 함수로 패키징하여 CPU 인스턴스에서 실행함으로써, 넷플릭스는 비용 효율성과 확장성을 동시에 달성했습니다.

이 접근법의 핵심 교훈은:

  • 반복 가능한 것은 자동화하라
  • 표준화가 이득이 되는 것은 중앙화하라
  • 깊은 도메인 전문성이 이미 있는 영역은 파트너십을 활용하라

결국 이 모든 노력은 제작진이 기술적 문제에 시간을 빼앗기지 않고, 더 나은 이야기를 전하는 데 집중할 수 있도록 하기 위함입니다. 여러분의 프로젝트에서도 유사한 원칙을 적용해 보세요. 특히 미디어 처리 파이프라인을 구축 중이라면, FLAPI나 다른 검증된 API를 클라우드 네이티브 방식으로 재해석하는 것을 고려해볼 만합니다.

본 콘텐츠는 신뢰할 수 있는 출처를 바탕으로 AI 도구를 활용하여 초안이 작성되었으며, 편집자의 검토를 거쳐 발행되었습니다. 전문가의 조언을 대체하지 않습니다.