NYTimes 비디오 스트리밍 아키텍처: HLS와 FFmpeg를 사용한 고성능 추출 엔진 구축

발행: (2026년 4월 21일 AM 10:41 GMT+9)
5 분 소요
원문: Dev.to

Source: Dev.to

소개

소프트웨어 개발자로서 전 세계 규모의 플랫폼이 멀티미디어 데이터를 어떻게 관리하고 배포하는지 이해하는 일은 언제나 매력적인 도전 과제입니다. 세계에서 가장 권위 있는 뉴스 매체 중 하나인 **The New York Times (NYTimes)**는 비디오를 제공하기 위해 단순한 정적 파일 호스팅 방식 대신 HLS (HTTP Live Streaming) 프로토콜을 기반으로 한 동적이고 적응 가능한 구조를 사용하는 복잡한 배포 아키텍처를 채택하고 있습니다.

NYTimes Video Downloader 프로젝트를 구현했습니다. 이 글에서는 구현 과정을 살펴보겠습니다: HLS 프로토콜 역공학, 동적 토큰 검증 루프, 서버 측 무손실 병합(lossless muxing) 과정을 자세히 다룰 것입니다.

웹 초창기에는 비디오를 다운로드하는 것이 매우 간단했습니다: <video> 태그의 src 속성을 확인하면 보통 정적인 .mp4 링크에 접근할 수 있었습니다. 현대 웹 생태계에서는 NYTimes가 사용자의 네트워크 상황에 따라 최적의 시청 경험을 제공하기 위해 HLS를 사용하고 있습니다.

HLS 아키텍처

  • Master Playlist: 다양한 해상도(480p, 720p, 1080p 등)에 대한 하위 재생 목록을 포함합니다.
  • Media Playlist: 특정 해상도에 대한 비디오 세그먼트 순서를 나열합니다; 각 세그먼트는 보통 2~6초 길이입니다.

기술적 도전 과제

추출 엔진이 .m3u8 트리 구조를 재귀적으로(recursive) 파싱할 수 있어야 합니다. 또한, 저대역폭에 최적화된 저화질 버전 대신 사용자가 원본 품질을 받을 수 있도록 **가장 높은 비트레이트(Highest Bitrate)**를 가진 채널을 자동으로 식별하고 격리해야 합니다.

NYTimes는 비디오 API에 다층 보호를 적용합니다. 일반 curl 명령으로 내부 미디어 인터페이스에 요청을 보내면 대부분 403 Forbidden 또는 401 Unauthorized 오류가 반환됩니다.

비동기 코어 및 성능

전 세계 다운로드 요청을 지원하기 위해 nytimes_downloader_tu 백엔드는 전통적인 블로킹 요청 모델을 버리고 완전한 Python Asyncio + httpx 스택으로 전환되었습니다:

  • 페이지 HTML을 파싱하여 메타데이터 추출.
  • 내부 REST 또는 GraphQL 인터페이스를 쿼리하여 미디어 구성 조회.
  • 네트워크를 통해 다중 레벨 .m3u8 파일을 재귀적으로 가져오기.

동기 모델에서는 워커(worker) 프로세스가 네트워크 응답을 기다리는 동안 유휴 상태가 됩니다. Asyncio를 사용하면 단일 프로세스가 수천 개의 동시 추출 작업을 관리할 수 있어 서버 하드웨어 비용을 크게 절감하고 응답 시간을 단축합니다.

모든 HLS 세그먼트를 파싱한 뒤에는 사용자에게 하나의 통합 MP4 파일을 제공해야 합니다. 사용자가 수백 개의 TS 조각을 직접 다운로드하도록 요구하는 것은 재앙적인 사용자 경험(UX)입니다.

기술 스택 요약

  • 백엔드: Python / Django / Redis / FFmpeg
  • 아키텍처: Asyncio / 분산 크롤링
  • 프론트엔드: HTML5 / Tailwind CSS / Vanilla JS
  • 인프라: Cloudflare / Docker / Nginx

HLS 파싱 로직을 최적화하고 비동기 백엔드 아키텍처를 활용함으로써 끊김 없는 1080p 비디오 추출 경험을 구현했습니다.

WebDev #NYTimes #Python #FFmpeg #OpenSource #Programming #VideoStreaming #DevTools #TurkishDevelopers

0 조회
Back to Blog

관련 글

더 보기 »

404 로보 하이쿠

이 댓글을 숨기시겠습니까? 게시물에서는 숨겨지지만 댓글의 permalink를 통해 여전히 볼 수 있습니다. 하위 댓글도 숨기기...