MPD

Tony·2022년 12월 19일
0

이번에 영상 플레이어를 작업하면서 MPD 파일에 대해 알게 되어서 찾아보고 정리해보는 시간을 가져보자

MPD(MPEG-DASH Media Presentation Description)

  • MPEG-DASH MPD(Media Presentation Description)는 미디어 세그먼트에 대한 정보, 세그먼트 간의 관계 및 선택에 필요한 정보, 클라이언트에 필요할 수 있는 기타 메타데이터를 포함하는 XML 문서입니다.

  • 이 게시물에서는 최상위 수준(기간)에서 시작하여 아래쪽(세그먼트)으로 이동하는 MPD의 가장 중요한 부분에 대해 설명합니다.

  • 자세한 내용은 ISO에서 무료로 제공하는 최신 버전의 ISO/IEC 23009-1을 참조하십시오.

  • MPD 파일 예시

<?xml version="1.0"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" profiles="urn:mpeg:dash:profile:full:2011"
     minBufferTime="PT1.5S">
    <!-- Ad -->
    <Period duration="PT30S">
        <BaseURL>ad/</BaseURL>
        <!-- Everything in one Adaptation Set -->
        <AdaptationSet mimeType="video/mp2t">
            <!-- 720p Representation at 3.2 Mbps -->
            <Representation id="720p" bandwidth="3200000" width="1280" height="720">
                <!-- Just use one segment, since the ad is only 30 seconds long -->
                <BaseURL>720p.ts</BaseURL>
                <SegmentBase>
                    <RepresentationIndex sourceURL="720p.sidx"/>
                </SegmentBase>
            </Representation>
            <!-- 1080p Representation at 6.8 Mbps -->
            <Representation id="1080p" bandwidth="6800000" width="1920"
                            height="1080">
                <BaseURL>1080p.ts</BaseURL>
                <SegmentBase>
                    <RepresentationIndex sourceURL="1080p.sidx"/>
                </SegmentBase>
            </Representation>
        </AdaptationSet>
    </Period>
    <!-- Normal Content -->
    <Period duration="PT10M">
        <BaseURL>main/</BaseURL>
        <!-- Just the video -->
        <AdaptationSet mimeType="video/mp2t">
            <BaseURL>video/</BaseURL>
            <!-- 720p Representation at 3.2 Mbps -->
            <Representation id="720p" bandwidth="3200000" width="1280" height="720">
                <BaseURL>720p/</BaseURL>
                <!-- First, we'll just list all of the segments -->
                <!-- Timescale is "ticks per second", so each segment is 1 minute
                     long -->
                <SegmentList timescale="90000" duration="5400000">
                    <RepresentationIndex sourceURL="representation-index.sidx"/>
                    <SegmentURL media="segment-1.ts"/>
                    <SegmentURL media="segment-2.ts"/>
                    <SegmentURL media="segment-3.ts"/>
                    <SegmentURL media="segment-4.ts"/>
                    <SegmentURL media="segment-5.ts"/>
                    <SegmentURL media="segment-6.ts"/>
                    <SegmentURL media="segment-7.ts"/>
                    <SegmentURL media="segment-8.ts"/>
                    <SegmentURL media="segment-9.ts"/>
                    <SegmentURL media="segment-10.ts"/>
                </SegmentList>
            </Representation>
            <!-- 1080p Representation at 6.8 Mbps -->
            <Representation id="1080p" bandwidth="6800000" width="1920"
                            height="1080">
                <BaseURL>1080/</BaseURL>
                <!-- Since all of our segments have similar names, this time
                     we'll use a SegmentTemplate -->
                <SegmentTemplate media="segment-$Number$.ts" timescale="90000">
                    <RepresentationIndex sourceURL="representation-index.sidx"/>
                    <!-- Let's add a SegmentTimeline so the client can easily see
                         how many segments there are -->
                    <SegmentTimeline>
                        <!-- r is the number of repeats _after_ the first one, so
                             this reads:
                             Starting from time 0, there are 10 (9 + 1) segments
                             with a duration of (5400000 / @timescale) seconds. -->
                        <S t="0" r="9" d="5400000"/>
                    </SegmentTimeline>
                </SegmentTemplate>
            </Representation>
        </AdaptationSet>
        <!-- Just the audio -->
        <AdaptationSet mimeType="audio/mp2t">
            <BaseURL>audio/</BaseURL>
            <!-- We're just going to offer one audio representation, since audio
                 bandwidth isn't very important. -->
            <Representation id="audio" bandwidth="128000">
                <SegmentTemplate media="segment-$Number$.ts" timescale="90000">
                    <RepresentationIndex sourceURL="representation-index.sidx"/>
                    <SegmentTimeline>
                        <S t="0" r="9" d="5400000"/>
                    </SegmentTimeline>
                </SegmentTemplate>
            </Representation>
        </AdaptationSet>
    </Period>
</MPD>

Periods

  • <Period> 는 최상위 MPD엘리먼트를 포함하고, 컨텐트의 일부 시작 시간과 지속 시간을 설명합니다
  • 여러 기간을 장면이나 챕터에 사용하거나 프로그램 콘텐츠에서 광고를 분리할 수 있습니다.

AdaptationSets

  • <AdaptationSets>은 미디어 스트림 또는 미디어 스트림세트를 포함한다
  • 가장 간단한 경우에는 기간이 콘텐츠에 대한 모든 오디오 및 비디오를 포함하는 하나의 적응 집합을 가질 수 있지만 대역폭을 줄이기 위해 각 스트림을 다른 Adaptation Sets으로 분할할 수 있습니다.
  • 일반적인 경우는 하나의 비디오 Adaptation Sets와 여러 오디오 Adaptation Sets(지원되는 각 언어에 대해 하나씩)가 있는 것입니다. Adaptation Sets에는 자막이나 임의의 메타데이터도 포함될 수 있습니다.

Representations

  • Representations을 통해 AdaptationSets는 다른 방식으로 인코딩된 동일한 콘텐츠를 포함할 수 있습니다.
  • 대부분의 경우 Representations은 다양한 화면 크기와 대역폭으로 제공됩니다.
  • 이를 통해 클라이언트는 불필요한 픽셀에 대역폭을 낭비하지 않고 버퍼링을 기다리지 않고 재생할 수 있는 최고 품질의 콘텐츠를 요청할 수 있습니다(720p TV에는 1080p 콘텐츠가 필요하지 않음).
  • Representations은 다른 코덱으로 인코딩할 수도 있으며, 다른 지원 코덱(브라우저에서 발생하는 것처럼 일부는 MPEG-4 AVC/h.264를 지원하고 일부는 VP8을 지원함)을 가진 클라이언트를 지원하거나 더 높은 품질의 표현을 새로운 클라이언트에 제공하는 동시에 레거시 클라이언트(예를 들어 h.264와 h.265를 모두 제공함)를 지원한다.
  • 여러 코덱은 배터리 구동식 장치에서도 유용할 수 있습니다. 장치는 최신 코덱에 대한 소프트웨어 지원이 있더라도 하드웨어 지원(배터리 사용량 감소)이 있기 때문에 이전 코덱을 선택할 수 있습니다.
  • 표현은 일반적으로 자동으로 선택되지만 일부 플레이어에서는 사용자가 선택 사항(특히 해상도)을 무시할 수 있습니다.
  • 사용자가 특정 비디오에서 대역폭을 낭비하고 싶지 않거나(아마도 오디오에만 관심이 있을 것이다), 더 높은 품질을 대가로 비디오 중지 및 버퍼를 사용할 의향이 있는 경우, 자신의 표현을 선택할 수 있습니다.

SubRepresentations

  • SubRepresentations는 Representation에서 하나의 미디어 스트림에만 적용되는 정보를 포함합니다.
  • 예를 들어, Representation이 오디오와 비디오를 모두 포함하는 경우 오디오에만 적용되는 추가 정보를 제공하는 SubRepresentation을 가질 수 있습니다.
  • 이 추가 정보는 특정 코덱, 샘플링 속도 또는 포함된 자막일 수 있습니다.
  • SubRepresentations는 또한 다중화된 컨테이너에서 하나의 스트림을 추출하거나 스트림의 낮은 품질 버전을 추출하는 데 필요한 정보를 제공합니다(예: 빨리 감기 모드에서 유용한 I-frames).

Media Segments

  • 미디어 세그먼트는 DASH 클라이언트가 재생하는 실제 미디어 파일로, 일반적으로 동일한 파일인 것처럼 연속해서 재생합니다(표현 간에 전환할 때 상황이 훨씬 더 복잡해질 수 있음).
  • 미디어 세그먼트 위치는 단일 세그먼트 표현에 대한 BaseURL, 세그먼트 목록(SegmentList) 또는 템플릿(SegmentTemplate)을 사용하여 설명할 수 있습니다.
  • 모든 세그먼트에 적용되는 정보는 SegmentBase에서 찾을 수 있습니다.
  • 세그먼트 시작 시간 및 기간은 SegmentTimeline으로 설명할 수 있습니다(클라이언트가 최신 세그먼트를 신속하게 결정할 수 있도록 라이브 스트리밍에 특히 중요함).
  • 이 정보는 MPD의 상위 수준에도 나타날 수 있으며, 이 경우 XML 계층 구조의 하위 정보로 재정의되지 않는 한 제공된 정보가 기본값입니다.
  • 세그먼트는 별도의 파일(라이브 스트리밍에 공통)에 있거나 단일 파일 내의 바이트 범위(정적/"주문형(on-demand)"에 공통)일 수 있습니다.
  • Representation Index Segment는 항상 별도의 파일이지만 Single Index Segment는 미디어 세그먼트와 동일한 파일의 바이트 범위일 수 있습니다.

Index Segments

  • 인덱스 세그먼트는 두 가지 유형으로 제공됩니다.
    • 전체 표현에 대한 하나의 표현 인덱스 세그먼트
    • 또는 미디어 세그먼트당 단일 인덱스 세그먼트

참고

profile
움직이는 만큼 행복해진다

0개의 댓글