tips

DASH 스트리밍이란? 비개발자를 위한 MPD 파일 해설

MPEG-DASH와 MPD 매니페스트의 작동 방식, DASH 영상과 오디오 트랙을 다운로드하는 방법, 일반 MP4보다 저장하기 어려운 이유를 알아보세요.
FlowPick 팀
12분 분량
# dash # mpd # 스트리밍 # 적응형 # 해설

동영상을 다운로드하려고 했더니 MP4가 아니라 12KB짜리 .mpd 파일이 나왔습니다. 텍스트 편집기로 열어보니 XML로 가득 차 있고, 수백 개의 <SegmentURL> 태그가 가리키는 파일은 디스크 어디에도 없습니다.

이게 MPEG-DASH입니다. 아래에서 이것이 무엇인지, 플랫폼이 왜 이것을 사용하는지, 그리고 동영상을 실제로 어떻게 꺼내는지 설명합니다.

DASH가 해결한 문제

2008년으로 돌아가 봅시다. YouTube는 고정 비트레이트 FLV 파일을 전송하고 있었습니다. 인터넷이 느릴 때, 누군가 720p 동영상을 올리면 빙글빙글 도는 로딩만 바라봐야 했습니다. 유일한 방법은 수동으로 360p로 전환하는 것뿐이었습니다.

이건 플랫폼 입장에서 난감한 일이었습니다. 업계가 찾은 해결책: 고정 파일을 전송하는 대신, 사용 가능한 모든 화질을 기술한 매니페스트를 전송하고, 플레이어가 실시간 대역폭 측정에 따라 스스로 요청할 화질을 결정하게 하자.

Apple의 HLS와 ISO 표준 DASH(2012년)가 모두 이 문제를 해결했습니다. DASH — Dynamic Adaptive Streaming over HTTP — 는 국제 표준이 되었고, YouTube, Vimeo, Dailymotion 및 대부분의 기업용 동영상 플랫폼이 사용하고 있습니다.

주요 플랫폼의 DASH 사용 현황

어떤 플랫폼이 DASH를 사용하는지 알면, 다운로드 시 어떤 상황을 마주할지 예측할 수 있습니다:

플랫폼스트리밍 프로토콜비고
YouTubeDASH주로 DASH 사용, 일부 콘텐츠는 HLS도 사용
BilibiliDASH(일반 콘텐츠) + HLS(라이브)오디오/비디오 분리, 병합 필요
VimeoDASH기업용 콘텐츠도 DASH
TwitchHLS라이브는 HLS, VOD는 가끔 DASH
Coursera / edXDASH강의 동영상에서 보편적 사용
텐센트 비디오 / 유쿠 / 아이치이DASH + DRM고가치 콘텐츠에 Widevine 중첩

YouTube는 흥미로운 사례입니다. 2011년부터 DASH를 배포하기 시작했으며, 가장 먼저 대규모로 사용한 플랫폼 중 하나입니다. 현재 매일 수십억 건의 스트리밍 요청을 이 메커니즘으로 처리합니다. 빌리빌리도 DASH 헤비 유저로, 일반 동영상은 DASH, 라이브는 HLS를 사용합니다. 빌리빌리 동영상 로컬 다운로드 방법 에서 빌리빌리 다운로드 전체 과정을 다루고 있어, DASH 실전 사례로 이해하기 좋습니다.

MPD 파일: 동영상이 아니라 레시피

모든 DASH 스트림은 MPD 파일에서 시작합니다. Media Presentation Description의 약자로, 전체 스트림을 기술하는 XML 문서입니다. 길이, 사용 가능한 화질, 코덱 정보, 그리고 각 동영상 및 오디오 세그먼트를 찾을 수 있는 경로가 담겨 있습니다.

실제 단순화된 MPD 예시:

<?xml version="1.0" encoding="UTF-8"?>
<MPD type="static" mediaPresentationDuration="PT1H23M47S">
  <Period>
    <AdaptationSet contentType="video" mimeType="video/mp4">
      <Representation id="v1080" bandwidth="4500000" width="1920" height="1080">
        <SegmentTemplate
          initialization="video/1080p/init.mp4"
          media="video/1080p/seg-$Number$.m4s"
          startNumber="1" />
      </Representation>
      <Representation id="v720" bandwidth="2000000" width="1280" height="720">
        <SegmentTemplate
          initialization="video/720p/init.mp4"
          media="video/720p/seg-$Number$.m4s"
          startNumber="1" />
      </Representation>
    </AdaptationSet>
    <AdaptationSet contentType="audio" mimeType="audio/mp4">
      <Representation id="a128" bandwidth="128000">
        <SegmentTemplate
          initialization="audio/init.mp4"
          media="audio/seg-$Number$.m4s"
          startNumber="1" />
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

구조 설명:

  • <AdaptationSet>: 동등한 트랙의 그룹 — 모든 동영상 옵션, 또는 모든 오디오 옵션
  • <Representation>: 해당 그룹 내의 구체적인 화질/코덱 조합
  • <SegmentTemplate>: 세그먼트 파일의 URL 템플릿

템플릿 video/1080p/seg-$Number$.m4sseg-1.m4s, seg-2.m4s... 로 확장됩니다. 수천 개의 파일이 있을 수 있습니다.

오디오/비디오 분리: DASH의 핵심 설계

DASH가 다운로더에게 가장 골치 아픈 점은 오디오와 비디오가 두 개의 독립된 스트림이라는 것입니다. 이건 일부러 괴롭히려는 게 아니라, 설계 의도입니다:

한 동영상에 5개 언어의 오디오 트랙을 제공한다고 상상해보세요. 오디오/비디오가 합쳐져 있다면, 완전한 동영상 파일을 5벌 저장해야 하고, 서버 저장 비용이 5배로 늘어납니다. DASH의 방식은: 동영상 트랙 1벌, 오디오 트랙 5벌, 플레이어가 언어 설정에 따라 조합. 저장 비용이 크게 줄어듭니다.

다운로더에게 이것이 의미하는 바:

  1. 동영상 트랙과 오디오 트랙을 동시에 다운로드해야 함
  2. 다운로드 완료 후 하나의 파일로 병합해야 함
  3. 동영상만 받으면 소리가 없고, 오디오만 받으면 볼 수 없음

FlowPick은 MPD 안의 모든 AdaptationSet을 자동으로 감지하여, 동시에 다운로드하고 병합합니다. 병합 단계는 간단해 보이지만, 실제로 브라우저에서 FFmpeg WASM을 실행하는 데는 여러 함정이 있습니다. 자세한 분석은 FlowPick이 브라우저에서 수백 개 동영상 세그먼트를 MP4로 병합하는 방법 을 참고하세요.

DASH vs. HLS: 무엇이 다를까?

이미 M3U8/HLS 스트리밍 다운로드 방법을 읽었다면, HLS는 .m3u8 파일과 .ts 세그먼트를 사용한다는 것을 알고 계실 겁니다. DASH는 .mpd 파일과 .m4s 세그먼트를 사용합니다. 목표는 동일 — 적응형 스트리밍 — 하지만 세부 사항에 뚜렷한 차이가 있습니다.

DASHHLS
출처ISO/IEC 23009, 2012Apple, 2009
매니페스트 포맷XML(.mpd)일반 텍스트(.m3u8)
세그먼트 포맷fMP4(.m4s) 또는 MP4MPEG-TS(.ts)
오디오 처리독립 트랙동영상과 병합
암호화 방식CENC(Widevine/PlayReady)AES-128(키 획득 가능)
사용처YouTube, Vimeo, 기업 플랫폼Twitch, Apple 플랫폼

핵심적인 실질 차이: DASH는 오디오와 비디오를 분리합니다. 동영상 파일에는 오디오가 없고, 오디오 파일에는 동영상이 없습니다. 둘 다 다운로드하여 병합해야 합니다.

또 다른 중요한 차이는 암호화입니다. HLS의 일반적인 AES-128 암호화에서는 키를 정상적인 HTTP 요청으로 획득할 수 있지만(로그인 상태에서), DASH의 CENC 암호화는 Widevine/PlayReady 인증 체계를 거치며, 키가 기기에 바인딩되어 브라우저 확장 프로그램으로는 획득할 수 없습니다.

DASH 동영상이 일반적인 방법으로는 다운로드되지 않는 이유

종합하면, 어떤 방법도 통하지 않는 이유는 다음과 같습니다:

1. 동영상 파일 자체가 존재하지 않는다. MPD는 청사진입니다. 실제 콘텐츠는 CDN의 수백 개 .m4s 세그먼트에 흩어져 있습니다.

2. 오디오와 비디오가 독립 트랙이다. 모든 동영상 세그먼트를 다운로드해도 파일에는 소리가 없습니다. 오디오 세그먼트는 완전히 별개의 다운로드 경로입니다.

3. 세그먼트 URL에 보통 서명 토큰이 포함된다. 일반적인 세그먼트 URL은 이렇게 생겼습니다: https://cdn.example.com/video/seg-42.m4s?token=eyJhbGc...&expires=1735689600. 이 토큰은 시간 제한이 있고, 세션에 바인딩되어 있습니다.

4. 초기화 세그먼트가 중요하다. 동영상과 오디오 트랙은 모두 "초기화 세그먼트"(init.mp4)로 시작하며, 코덱 파라미터를 포함합니다. 이것이 없으면 플레이어가 후속 세그먼트를 파싱할 수 없습니다.

5. 콘텐츠 보호(CENC). 고가치 콘텐츠는 DASH 위에 Widevine 또는 PlayReady DRM을 중첩하며, 각 세그먼트가 암호화되고 키는 별도의 인증 서버를 통해 발급됩니다.

FlowPick의 DASH 스트림 다운로드 방식

FlowPick은 브라우저 탭 내에서 MPD 요청을 가로챕니다. 어떤 플랫폼에 로그인하면, 세션 쿠키가 요청과 함께 전달됩니다. FlowPick이 보는 매니페스트는 플레이어가 보는 것과 동일합니다.

다운로드 파이프라인:

  1. MPD XML 파싱 — 모든 AdaptationSetRepresentation 항목 추출
  2. 화질 옵션 표시 — 사용 가능한 동영상 해상도와 오디오 트랙 표시
  3. 병렬 다운로드 — 동영상과 오디오 세그먼트를 동시에 다운로드, 스레드 수는 설정에 따름(기본 2, 조정 가능)
  4. 초기화 세그먼트 우선 획득 — 이 파일들은 작지만 병합에 필수
  5. 메모리 내 조립 — 초기화 + 모든 세그먼트를 순서대로 연결
  6. 동영상과 오디오 병합 — WebAssembly로 컴파일된 FFmpeg 사용, 완전히 브라우저 탭 내에서 실행
  7. 디스크에 쓰기 — Chrome/Edge의 File System Access API, 또는 Firefox의 직접 다운로드 Blob

전체 파이프라인은 클라이언트에서 실행되며, 업로드가 없고 세그먼트가 제3자 서버를 경유하지 않습니다.

독립된 MPD URL이 있다면, DASH 온라인 다운로드 툴에 직접 붙여넣을 수도 있습니다. 아무것도 설치할 필요가 없습니다.

온라인 툴 vs. 확장 프로그램: 어떤 걸 써야 할까

DASH 다운로드에는 두 방식 모두 각자의 시나리오가 있습니다:

시나리오권장 방식
독립된 MPD URL, 공개 스트림온라인 툴, 설치 불필요
로그인이 필요한 콘텐츠브라우저 확장 프로그램, 세션 쿠키 전달
플랫폼이 POST 요청으로 매니페스트 획득브라우저 확장 프로그램, 네트워크 레이어에서 가로채기
플랫폼이 MPD URL을 난독화브라우저 확장 프로그램, 자동 식별
세그먼트 URL에 시한 제한브라우저 확장 프로그램, 실시간 획득

온라인 툴은 브라우저 크로스 오리진(CORS) 정책의 제한을 받습니다. 동영상 호스팅 서버가 CORS 헤더를 설정하지 않았다면, 온라인 툴의 직접 다운로드는 실패합니다. 이때 확장 프로그램이 더 안정적입니다.

실전에서 DASH 식별하기

어떤 사이트가 DASH를 사용하는지 알고 싶다면? 동영상 로드 전에 개발자 도구를 여세요:

  1. F12Network
  2. 필터 입력창에 .mpd 또는 manifest 입력
  3. 동영상 재생
  4. Content-Type: application/dash+xml 요청 찾기

찾았습니다. 이것이 진입점입니다. 이 요청의 URL이 온라인 툴에 붙여넣을 내용이며, FlowPick이 자동으로 가로채는 대상이기도 합니다.

일부 플랫폼은 URL을 난독화하거나 GET 대신 POST로 매니페스트를 요청합니다. 이때 온라인 툴은 소용없지만, 브라우저 확장 프로그램은 네트워크 가로채기 레이어에서 요청을 캡처하므로 방법에 관계없이 작동합니다.

라이브 스트림: 완전히 다른 상황

정적 DASH 스트림(영화, 녹화 강의)은 type="static" 속성과 알려진 mediaPresentationDuration을 가집니다. 라이브 스트림은 type="dynamic"을 사용합니다:

<MPD type="dynamic"
     availabilityStartTime="2026-07-01T09:00:00Z"
     minimumUpdatePeriod="PT5S"
     timeShiftBufferDepth="PT1H">

MPD가 지속적으로 업데이트되며(이 예시에서는 5초마다), 롤링 윈도 내의 세그먼트만 사용 가능합니다. 세그먼트가 timeShiftBufferDepth를 벗어나면 CDN에서 사라집니다.

라이브 스트림의 경우, FlowPick은 녹화를 시작한 시점부터 캡처합니다. 현재 버퍼를 초과하여 되감을 수 없습니다. 지난 라이브 콘텐츠는 다시보기/VOD URL을 찾으세요. 그것은 정적 DASH 또는 HLS 스트림으로, 깔끔하게 다운로드할 수 있습니다.

자주 묻는 질문

MPD 파일을 다운로드했는데 열리지 않음

MPD는 동영상 파일이 아니라 매니페스트 파일입니다. 이것을 파싱하고 모든 세그먼트를 순서대로 다운로드한 후 병합하는 도구가 필요합니다. 동영상 플레이어로 MPD를 직접 열면 보통 소용없습니다(VLC는 예외로, DASH URL 직접 재생을 지원합니다).

다운로드 시 오디오와 비디오가 분리됨

동영상 트랙 또는 오디오 트랙 중 하나만 다운로드한 것입니다. FlowPick이 두 AdaptationSet을 모두 다운로드했는지 확인하세요. 팝업에 독립된 오디오 항목이 선택되어 있는지 보세요. 두 트랙 모두 다운로드했는데 병합되지 않았다면, FFmpeg WASM 메모리 제한(파일이 너무 큼)에 걸렸을 수 있습니다. 한 단계 낮은 화질을 선택해보세요.

세그먼트 다운로드는 성공했는데 병합 실패

초대형 파일(>4GB) 시나리오에서 흔합니다. FFmpeg WASM은 32비트 주소 공간에서 메모리 제한이 있습니다. 이런 경우 FlowPick은 다른 병합 전략으로 전환을 시도합니다. Chrome 최신 버전을 권장하며, FSA 스트리밍 쓰기가 대용량 파일 처리에 가장 안정적입니다.


추천 글

다음 단계