다음으로 이동: 매니페스트 및 콘텐츠 요건 | 패키지, 플랫폼 및 플레이어
다중 기간 매니페스트와 단일 기간 매니페스트 비교
Ad Manager에서는 DASH에 대한 다중 기간 매니페스트와 단일 기간 매니페스트의 수집을 모두 지원합니다.
단일 기간 매니페스트를 사용하면 게시자는 콘텐츠를 구별하는 여러 기간이 아닌, 모든 콘텐츠와 광고 시점 기회가 포함된 하나의 기간으로 DASH 스트림을 제공합니다. DAI는 가져오기를 실행할 때마다 매니페스트를 다중 기간으로 변환하여 단일 기간 매니페스트를 지원합니다.
Google Ad Manager에서 라이브 스트림을 설정하고 스트리밍 형식으로 'DASH'를 선택하면 매니페스트가 단일 기간과 다중 기간 중에서 무엇으로 제공될지 선택할 수 있습니다.
이 가이드를 사용하여 다중 기간 매니페스트와 단일 기간 매니페스트에 관한 기대치를 확인하세요. 또한 단일 기간 매니페스트를 사용하는 경우 부록은 DAI가 단일 기간 매니페스트를 다중 기간 매니페스트로 변환하는 방법을 보여줍니다.
매니페스트 및 콘텐츠 요건
다중 기간 매니페스트의 경우다중 기간 MPEG-DASH 매니페스트에 대한 기대치
Google DAI는 원본 MPD에서 다음 유효성 검사를 수행합니다.
- MPD 요소 유효성 검사
- 기간 요소 유효성 검사
- AdaptationSet 요소 유효성 검사
- Representation 요소 유효성 검사
- 시간 속성이 있는 SegmentTemplate 유효성 검사
- 시간 구성요소 유효성 검사
MPD 요소 유효성 검사
Type
이dynamic
으로 설정됨Profile
이urn:mpeg:dash:profile:isoff-live:2011
로 설정됨availabilityStartTime
은 0이 아니어야 하며 MPD의 연속 폴 사이에 그 값이 변경되지 않아야 함PublishTime
은 0이 아니어야 하며 연속 폴 사이에 값이 증가하거나 동일하게 유지되어야 함 하지만 업데이트할 때마다publishTime
속성을 현재 시간으로 설정해야 합니다.- HTTPS는 동일한 MPD에서 참조되는 DASH 콘텐츠 전체에 사용해야 함
예
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" type="dynamic"
profiles="urn:mpeg:dash:profile:isoff-live:2011"
availabilityStartTime="2022-01-01T10:00:00Z"
publishTime="2022-01-01T10:00:00Z"
minimumUpdatePeriod="PT25S" timeShiftBufferDepth="PTM0S" maxSegmentDuration="PT2S"
minBufferTime="PT2S">
<Period …>
…
</Period>
…
</MPD>
기간 요소 유효성 검사
-
Start
가 0 이상이어야 함이렇게 하면 정수 날짜 입력란을 선택적으로 포함할 수 있는 ISO-8601 기간을 지원할 수 있습니다. 예를 들어P3DT3H1M30S
는 3일, 3시간 1분 30초를 나타냅니다.ISO-8601 연, 월, 주 기간 지정자는 현재 지원되지 않습니다.
Period
에 1개 이상의AdaptationSet
요소가 있음- 주소 지정 체계는 숫자 및 시간 기반 주소 지정을 포함한 템플릿으로 제한됨
예
<Period start="PT0S">
<AdaptationSet …>
…
</AdaptationSet>
<AdaptationSet …>
…
</AdaptationSet>
</Period>
MPD의 연속 폴 사이에서:
Period
요소는 MPD 상단에서만 삭제할 수 있음Period
요소는 MPD 하단에만 추가할 수 있음- MPD의 첫 번째와 마지막 기간만 업데이트할 수 있습니다. MPD의 다른 기간은 수정할 수 없습니다. 업데이트는 다음 목적을 위한 것이어야 합니다.
- 첫 번째 기간의 최고점에서 세그먼트 또는 이벤트 삭제
- 마지막 기간의 최저점에 새 세그먼트 또는 이벤트 추가
AdaptationSet 요소 유효성 검사
AdaptationSet
에 하나 이상의Representation
요소가 있음AdaptationSet
의ContentProtection
요소와 하위 요소는(있는 경우) MPD의 연속 폴 사이에 변경되면 안 됨
예
<AdaptationSet mimeType="video/mp4" startWithSAP="1"
contentType="video" par="16:9"
minWidth="640" maxWidth="640" minHeight="360" maxHeight="360"
maxFrameRate="60/2"
segmentAlignment="true">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>
<ContentComponent id="0" contentType="video" />
<Representation …>
…
</Representation>
<Representation …>
…
</Representation>
</AdaptationSet>
Representation 요소 유효성 검사
Id
가 비어 있지 않아야 함SegmentBase
또는SegmentList
요소가 없어야 함
예
<Representation width="640" height="360" sar="1:1" frameRate="60/2"
codecs="avc1.64001e" id="V300" bandwidth="300000">
…
</Representation>
시간 속성이 있는 SegmentTemplate 유효성 검사
SegmentTimeline
S
요소에는 미디어 URL에 사용되는t
속성이 포함될 수 있음- 없는 경우, 처음
S
요소 및 차후S
요소에 대해 해당 값은0
으로 간주되며, 이전S
요소의 가장 이른 프레젠테이션 시간 및 인접 기간의 합, 즉 이전S
요소의 [t
+d
× (r
+ 1)] 값으로 간주됨 $Time$
및$Number$
는 모두 다중 기간 매니페스트에서 지원됨SegmentTemplate
의S
tartNumber
가 사용되지 않음
- 없는 경우, 처음
- MPD의 연속 폴 사이에서:
- 세그먼트가 DVR 구간 스냅샷 외부로 이동할 때
SegmentTimeline
상단에서만 삭제할 수 있음 SegmentTimeline
하단에만 세그먼트를 추가할 수 있음
- 세그먼트가 DVR 구간 스냅샷 외부로 이동할 때
예
<SegmentTemplate timescale="90000" initialization="$RepresentationID$/init.mp4"
media="$RepresentationID$/$Time$.m4s">
<SegmentTimeline>
<S t="0" d="270000" r="20" />
</SegmentTimeline>
</SegmentTimeline>
시간 구성요소 유효성 검사
Google DAI는 ISO-8601 기간의 시간 구성요소 부분을 지원하며 선택적 정수 날짜 구성요소(P0Y0M[n]DT[n]H[n]M[n]S)를 지원합니다. 일 구성요소는 1일 = 24시간임을 고려해 기간으로 변환되며 시간 구성요소에 추가됩니다. 인식되는 가장 작은 단위는 나노초입니다.
유효한 시간 형식의 예
P0Y0M
P0Y0M2D
P2D
PT3H
PT0H3M
P0Y0M0DT0H0M1.000S
P0Y0M1DT2H4M10S
PT0.000000001S
잘못된 시간 형식의 예
P
PT
2007-03-01
P5Y0M1DT2H4M1.000S
P0Y1.5M1DT2H4M1.000S
P0YiM1DT2H4M1.000S
P0Y0M.3DT0H0M1.000S
3h
PT100,000H
큐 아웃 및 큐 인 메시지 이벤트에 대한 기대치
Google DAI는 큐 아웃 및 큐 인 메시지 이벤트에 대해 다음 유효성 검사를 수행합니다. 콘텐츠는 다음을 기준으로 사전 조건이 지정되어 있어야 합니다.
- 미디어 프레젠테이션은 여러 기간으로 나뉘어야 하고 각 미드롤
CUE-OUT
및CUE-IN
은 기간 경계에 있어야 합니다. - 각 기간의 시작 및 끝에 있는 콘텐츠 세그먼트는 세그먼트의 모든 프레임이 기간에 포함되도록 준비되어야 합니다.
- 키프레임/IDR 프레임은 큐 포인트를 따라야 하며 기간의 시작 부분에 있어야 합니다. 이에 따라 큐 포인트가 자연적인 경계에 있지 않은 경우 종료 기간에 짧은 세그먼트가 필요할 수 있습니다.
광고 시점 신호
- 하나의 광고 시점과 관련된 모든 콘텐츠는 하나 이상의 연속 기간 내에 포함되어야 합니다. 해당 기간에는 대체될 콘텐츠 세그먼트만 포함되어야 합니다.
-
광고 시점
CUE-OUT
표시기에서는 다음 예에 표시된 것처럼 MPD 매니페스트에서 신호를 받아야 합니다.예 1
- SCTE-35
EventStream
요소 SchemeIdUri="urn:scte:scte35:2014:xml+bin"
- DASH 표준에 정의되어 있습니다.
<MPD>
<Period start="PT0S" id="1">
<!-- 콘텐츠 기간 -->
...
</Period>
<Period start="PT32S" id="2">
<!-- 광고 시점 기간 -->
<!-- 광고 시점은 이 기간의 첫 세그먼트에서 시작되며,
마지막 세그먼트와 함께 종료됨 -->
<EventStream timescale="90000"
schemeIdUri="urn:scte:scte35:2014:xml+bin">
<Event duration="2520000" id="1">
<!-- 이 이벤트에 지정된 재생 시간은 해당 기간의
실제 재생 시간과 최대한 일치해야 함 -->
<Signal xmlns="http://www.scte.org/schemas/35/2016"
<Binary>
/DAlAAAAAAAAAP/wFAUAAAAEf+/+kybGyP4BSvaQAAEBAQAArky/3g==
<Binary>
</Signal>
</Event>
</EventStream>
</Period>
<Period start="PT60S" id="3">
<!-- 콘텐츠 기간 -->
...
</Period>
</MPD>
예 2
- SCTE-35
EventStream
요소 SchemeIdUri="urn:scte:scte35:2013:xml"
- DASH 표준에 정의되어 있습니다.
<MPD>
<Period start="PT0S" id="1">
<!-- 콘텐츠 기간 -->
...
</Period>
<Period start="PT32S" id="2">
<!-- 광고 시점 기간 -->
<!-- 광고 시점은 이 기간의 첫 세그먼트에서 시작되며,
마지막 세그먼트와 함께 종료됨 -->
<EventStream timescale="90000"
schemeIdUri="urn:scte:scte35:2013:xml">
<Event duration="2520000" id="1">
<!-- 이 이벤트에 지정된 재생 시간은 해당 기간의
실제 재생 시간과 최대한 일치해야 함 -->
<SpliceInfoSection xmlns="urn:scte:scte35:2013:xml">
<SpliceInsert outOfNetworkIndicator="true"
spliceImmediateFlag="true">
<BreakDuration autoReturn="true"
duration="2520000"/>
</SpliceInsert>
</SpliceInfoSection>
</Event>
</EventStream>
</Period>
<Period start="PT60S" id="3">
<!-- 콘텐츠 기간 -->
...
</Period>
</MPD>
- SCTE-35
CUE-OUT
이벤트에 지정된 광고 시점의 기간은 광고 시점 기간에 있는 모든 세그먼트의 총 기간과 동일해야 합니다.
지원되는 광고 마커
DASH에서 CUE 마크업은 XML Period
요소 경계와 함께 제공됩니다. CUE 마크업은 Period
내에서 EventStream
요소 내에 Event
요소로 제공됩니다. 이 추가 경계는 마크업을 식별하는 데 충분한 기능을 합니다. 또한 광고 시점은 Period
경계로 표시되므로 명시적 CUE-IN 마커가 필요하지 않습니다.
이 예에서는 DASH에 대한 XML 기반 SCTE35 마크업을 보여줍니다. 이는 데이터가 파싱되어 바이너리 대신 XML로 표시된 점을 제외하면 SCTE35 바이너리 이음 삽입과 유사합니다.
예
<Period>
<EventStream timescale="90000" schemeIdUri="urn:scte:scte35:2013:xml">
<Event duration="2520000" id="1">
<SpliceInfoSection xmlns="urn:scte:scte35:2013:xml">
<SpliceInsert outOfNetworkIndicator="true" spliceImmediateFlag="true">
<BreakDuration autoReturn="true" duration="2520000"/>
</SpliceInsert>
</SpliceInfoSection>
</Event>
</EventStream>
</Period>
DASH에서 CUE 마크업은 XML Period
요소 경계와 함께 제공됩니다. CUE 마크업은 Period
내에서 EventStream
요소 내에 Event
요소로 제공됩니다. 이 추가 경계는 마크업을 식별하는 데 충분한 기능을 합니다. 또한 광고 시점은 Period
경계로 표시되므로 명시적 CUE-IN 마커가 필요하지 않습니다.
이 예에서는 DASH에 대한 XML 기반 SCTE35 마크업을 보여줍니다. 이는 데이터가 파싱되어 바이너리 대신 XML로 표시된 점을 제외하면 SCTE35 Binary Time Signal
과 유사합니다.
예
<Period>
<EventStream timescale="90000" schemeIdUri="urn:scte:scte35:2013:xml">
<Event duration="2520000" id="1">
<SpliceInfoSection xmlns="urn:scte:scte35:2013:xml">
<TimeSignal outOfNetworkIndicator="true" spliceImmediateFlag="true">
<SpliceTime ptsTime="123123"/>
</TimeSignal>
<SegmentationDescriptor segmentationEventId="123123" segmentationEventCancelIndicator="false" segmentationDuration="123123">
<DeliveryRestrictions webDeliveryAllowedFlag="false" noRegionalBlackoutFlag="true" archiveAllowedFlag="false" deviceRestrictions="3"/>
<SegmentationUpid segmentationUpidType="14" segmentationTypeId="52" >11111</SegmentationUpid>
</SegmentationDescriptor>
</SpliceInfoSection>
</Event>
</EventStream>
</Period>
SegmentationTypeId
는 시간 신호의 유형을 나타냅니다.
다음 SegmentationTypeId
값은 유효한 CUE-OUT 시간 신호로 인식됩니다.
34
: 광고 시간 시작
48
: 제공업체 광고 시작t
52
: 제공업체 게재위치 기회 시작
다음 SegmentationTypeId
값은 유효한 CUE-IN 시간 신호로 인식됩니다.
35
: 광고 시점 종료
49
: 제공업체 광고 종료
53
: 제공업체 게재위치 기회 종료
DASH에서 CUE 마크업은 XML Period
요소 경계와 함께 제공됩니다. CUE 마크업은 Period
내에서 EventStream
요소 내에 Event
요소로 제공됩니다. 이 추가 경계는 마크업을 식별하는 데 충분한 기능을 합니다. 또한 광고 시점은 Period
경계로 표시되므로 명시적 CUE-IN 마커가 필요하지 않습니다.
이 예에서는 DASH의 바이너리 SCTE35 마크업을 보여줍니다.
예
<Period>
<EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin">
<Event duration="2520000" id="1">
<Signal xmlns="http://www.scte.org/schemas/35/2016">
<Binary>
/DAlAAAAAAAAAP/wFAUAAAAEf+/+kybGyP4BSvaQAAEBAQAArky/3g==
</Binary>
</Signal>
</Event>
</EventStream>
...
<Period>
시점 타겟팅 정보와 함께 유효한 CUE-OUT/CUE-IN이 포함되어 있는지 확인하려면 SCTE-35 바이너리(base64로 인코딩됨) 데이터를 디코딩 및 파싱해야 합니다.
예를 들어 유효한 CUE-OUT 신호가 포함되어 있는 바이너리 데이터는 다음과 같습니다.
예
<Period>
<EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin">
<Event duration="2520000" id="1">
<Signal xmlns="http://www.scte.org/schemas/35/2016">
<Binary>
/DAsAAAAAyiYAP/wBQb/PVbrDQAWAhRDVUVJB48zWH//AAEuGvsAACIAAdRJqiI=
</Binary>
</Signal>
</Event>
</EventStream>
...
<Period>
디코딩되고 나면 메시지에 다음과 같은 필드가 포함됩니다.
- 6으로 설정된
splice_command_type
은 이것이 시간 신호임을 나타냅니다. segmentation_type_id
는 시간 신호의 유형을 나타냅니다.
다음 segment_type_id
값은 유효한 CUE-OUT 시간 신호로 인식됩니다.
34
: 광고 시점 시작
다음 segmentation_type_id
값(splice_command_type = 6
인 경우)은 유효한 CUE-IN 시간 신호로 인식됩니다.
35
: 광고 시점 종료
시점 타겟팅 정보와 함께 유효한 CUE-OUT/CUE-IN이 포함되어 있는지 확인하려면 SCTE-35 바이너리(base64로 인코딩됨) 데이터를 디코딩 및 파싱해야 합니다.
예를 들어 유효한 CUE-OUT 신호가 포함되어 있는 바이너리 데이터는 다음과 같습니다.
예
<Period>
<EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin">
<Event duration="2520000" id="1">
<Signal xmlns="http://www.scte.org/schemas/35/2016">
<Binary>
/DBcAAAAAAAAAP/wBQb//ciI8QBGAh1DVUVJXQk9EX+fAQ5FUDAxODAzODQwMDY2NiEEZAIZQ1VFSV0JPRF/3wABLit7AQVDMTQ2NDABAQEKQ1VFSQCAMTUwKnPhdcU=
</Binary>
</Signal>
</Event>
</EventStream>
...
<Period>
디코딩되고 나면 메시지에 다음과 같은 필드가 포함됩니다.
- 6으로 설정된
splice_command_type
은 이것이 시간 신호임을 나타냅니다. segmentation_type_id
는 시간 신호의 유형을 나타냅니다.
다음 segment_type_id
값은 유효한 CUE-OUT 시간 신호로 인식됩니다.
48
: 제공업체 광고 시작
다음 segmentation_type_id
값(splice_command_type = 6
인 경우)은 유효한 CUE-IN 시간 신호로 인식됩니다.
49
: 제공업체 광고 종료
시점 타겟팅 정보와 함께 유효한 CUE-OUT/CUE-IN이 포함되어 있는지 확인하려면 SCTE-35 바이너리(base64로 인코딩됨) 데이터를 디코딩 및 파싱해야 합니다.
예를 들어 유효한 CUE-OUT 신호가 포함되어 있는 바이너리 데이터는 다음과 같습니다.
예
<Period>
<EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin">
<Event duration="2520000" id="1">
<Signal xmlns="http://www.scte.org/schemas/35/2016">
<Binary>
/DA0AAAAAAAA///wBQb+cr0AUAAeAhxDVUVJSAAAjn/PAAGlmbAICAAAAAAsoKGKNAIAmsnRfg==
</Binary>
</Signal>
</Event>
</EventStream>
...
<Period>
디코딩되고 나면 메시지에 다음과 같은 필드가 포함됩니다.
- 6으로 설정된
splice_command_type
은 이것이 시간 신호임을 나타냅니다. segmentation_type_id
는 시간 신호의 유형을 나타냅니다.
다음 segment_type_id
값은 유효한 CUE-OUT 시간 신호로 인식됩니다.
52
: 제공업체 게재위치 기회 시작
다음 segmentation_type_id
값(splice_command_type = 6
인 경우)은 유효한 CUE-IN 시간 신호로 인식됩니다.
53
: 제공업체 게재위치 기회 종료
SCTE-35 마크업의 매크로
피드에 EXT-OATCLS-SCTE35
또는 EXT-X-DATERANGE
마크업이 포함되어 있으면 메타데이터가 자동으로 추출되고 맞춤 키-값을 통해 사용할 수 있게 됩니다. 맞춤 키-값을 설정하고 광고 태그를 생성할 때 해당 키-값을 매크로로 삽입해야 합니다.
SCTE-35 필드의 새로운 맞춤 키-값을 설정할 때 맞춤 키(예: 'scte35')를 사용하고 다음과 같이 피드에서 사용할 수 있는 필드 유형에 해당하는 매크로에 값을 설정합니다.
매크로 | 설명 |
---|---|
%%SPLICE_INSERT_EVENT_ID%% |
SCTE35 메시지의 부호 없는 정수는 10진수 문자열로 변환됩니다. |
%%SPLICE_INSERT_UPID%% |
|
%%TIME_SIGNAL_EVENT_ID%% |
|
%%TIME_SIGNAL_UPID%% |
0x 접두어 없이 소문자 16진수로 렌더링됩니다. |
%%TIME_SIGNAL_UPID_RAW%% |
16진수 변환 없이 SCTE 메시지의 원시 바이트를 삽입합니다(초기 문자열은 유효한 UTF-8 인코딩 문자열이어야 함). |
%%AFMM_CBC%% |
이음 정보에서 광고 시점 코드를 추출합니다(프랑스어 AF2M 사양에 필요함). |
단일 기간 MPEG-DASH 매니페스트에 대한 기대치
Google DAI는 원본 MPD에서 다음 유효성 검사를 수행합니다.
- MPD 요소 유효성 검사
- 기간 요소 유효성 검사
- EventStream 요소 유효성 검사
- AdaptationSet 요소 유효성 검사
- Representation 요소 유효성 검사
- 시간 속성이 있는 SegmentTemplate 유효성 검사
- 시간 구성요소 유효성 검사
MPD 요소 유효성 검사
Type
이dynamic
으로 설정됨Profiles
가urn:mpeg:dash:profile:isoff-live:2011
로 설정됨AvailabilityStartTime
은 0이 아니어야 하며 MPD의 연속 폴 사이에 그 값이 변경되지 않아야 함PublishTime
은 0이 아니어야 하며 연속 폴 사이에 값이 증가하거나 동일하게 유지되어야 함- MPD에 정확히 하나의
Period
요소가 있음 - HTTPS는 동일한 MPD에서 참조되는 DASH 콘텐츠 전체에 사용해야 함
예
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" type="dynamic"
profiles="urn:mpeg:dash:profile:isoff-live:2011"
availabilityStartTime="2022-01-01T10:00:00Z"
publishTime="2022-01-01T10:00:00Z"
minimumUpdatePeriod="PT25S" timeShiftBufferDepth="PTM0S" maxSegmentDuration="PT2S"
minBufferTime="PT2S">
<Period …>
…
</Period>
…
</MPD>
기간 요소 유효성 검사
Start
가 0 이상이어야 함Period
에 1개 이상의AdaptationSet
요소가 있음
예
<Period start="PT0S">
<AdaptationSet …>
…
</AdaptationSet>
<AdaptationSet …>
…
</AdaptationSet>
</Period>
EventStream 요소 유효성 검사
MPD의 연속 폴 사이에서:
EventStream
상단에서만Event
요소를 삭제할 수 있음EventStream
의 하단에만Event
요소를 추가할 수 있음
AdaptationSet 요소 유효성 검사
AdaptationSet
에 하나 이상의Representation
요소가 있음AdaptationSet
의ContentProtection
요소와 하위 요소는(있는 경우) MPD의 연속 폴 사이에 변경되면 안 됨
예
<AdaptationSet mimeType="video/mp4" startWithSAP="1"
contentType="video" par="16:9"
minWidth="640" maxWidth="640" minHeight="360" maxHeight="360"
maxFrameRate="60/2"
segmentAlignment="true">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>
<ContentComponent id="0" contentType="video" />
<Representation …>
…
</Representation>
<Representation …>
…
</Representation>
</AdaptationSet>
Representation 요소 유효성 검사
Id
가 비어 있지 않아야 함SegmentBase
또는SegmentList
요소가 없어야 함
예
<Representation width="640" height="360" sar="1:1" frameRate="60/2"
codecs="avc1.64001e" id="V300" bandwidth="300000">
…
</Representation>
$Time$ 속성이 있는 SegmentTemplate 유효성 검사
SegmentTimeline
S
요소에는 미디어 URL에 사용되는t
속성이 포함될 수 있음- 없는 경우, 처음
S
요소 및 차후S
요소에 대해 해당 값은0
으로 간주되며, 이전S
요소의 가장 이른 프레젠테이션 시간 및 인접 기간의 합, 즉 이전S
요소의 [t
+d
× (r
+ 1)] 값으로 간주됨 $Time$
는 단일 기간 매니페스트에서 지원되며,$Number$
는 아직 지원되지 않음SegmentTemplate
의S
tartNumber
가 사용되지 않음
- 없는 경우, 처음
- MPD의 연속 폴 사이에서:
- 세그먼트가 DVR 구간 스냅샷 외부로 이동할 때
SegmentTimeline
상단에서만 삭제할 수 있음 SegmentTimeline
하단에만 세그먼트를 추가할 수 있음
- 세그먼트가 DVR 구간 스냅샷 외부로 이동할 때
예
<SegmentTemplate timescale="90000" initialization="$RepresentationID$/init.mp4"
media="$RepresentationID$/$Time$.m4s">
<SegmentTimeline>
<S t="0" d="270000" r="20" />
</SegmentTimeline>
</SegmentTimeline>
시간 구성요소 유효성 검사
Google DAI는 ISO-8601 기간의 시간 구성요소 부분을 지원하며 선택적 정수 날짜 구성요소(P0Y0M[n]DT[n]H[n]M[n]S)를 지원합니다. 일 구성요소는 1일 = 24시간임을 고려해 기간으로 변환되며 시간 구성요소에 추가됩니다. 인식되는 가장 작은 단위는 나노초입니다.
유효한 시간 형식의 예
P0Y0M
P0Y0M2D
P2D
PT3H
PT0H3M
P0Y0M0DT0H0M1.000S
P0Y0M1DT2H4M10S
PT0.000000001S
잘못된 시간 형식의 예
P
PT
2007-03-01
P5Y0M1DT2H4M1.000S
P0Y1.5M1DT2H4M1.000S
P0YiM1DT2H4M1.000S
P0Y0M.3DT0H0M1.000S
3h
PT100,000H
입력 SCTE-35 마커에 대한 기대치
Google DAI는 입력 SCTE-35 마커에 대해 다음과 같은 유효성 검사를 수행합니다.
이음 포인트 유효성 검사
Google DAI는 이음 포인트가 다음 유효성 검사를 통과하는 경우에만 이를 DASH MPD Event
요소에서 전달되는 SCTE-35 마커로 인식합니다.
- Base64로 인코딩된 SCTE-35 데이터는 이벤트의
Signal
요소에 있는Binary
요소에 포함되어야 합니다.Splice_insert
가 지원됨segmentation_descriptor
명령어가 있는Time_signal
이 지원됨
- SCTE-35 마커가 있는 이벤트가 포함된
EventStream
요소는schemeIdUri
가urn:scte:scte35:2014:xml+bin
으로 설정되어 있어야 함 Signal
네임스페이스는http://www.scte.org/schemas/35/2016
으로 설정되어야 함- 큐 아웃의 경우
Event
에presentationTime
이 설정되어 있어야 함 - 큐 인의 경우
Event
의presentationTime
이 설정되어 있고 기간은 설정되어 있지 않아야 함 EventStream
의Event
요소는presentationTime
에 따라 정렬된 순서로 되어 있어야 함
이 컨텍스트에서 이음 포인트는 Period
를 개별 콘텐츠로 분할하고 이음 포인트의 프레젠테이션 시간이나 재생 시간을 기준으로 Period
요소를 분할하는 데 사용됩니다. 이러한 이음 포인트는 SCTE-35 마커가 있는 이벤트
요소에 의해 제공됩니다.
splice_insert 유효성 검사
- 큐 아웃은
out_of_network_indicator
가1
로 설정된splice_insert
임 - 큐 인은
out_of_network_indicator
가0
으로 설정된splice_insert
임 - 큐 인은 큐 아웃이 포함된
Event
가splice_insert
이고duration
에 0이 아닌 값이 설정된 경우에만 선택사항임- Google DAI가 암시적인
splice_insert
큐 인을 큐 아웃의presentationTime
+duration
의 프레젠테이션 시간으로 해석함 - 명시적인 큐 인 이벤트는 그 기간이 끝나기 전에 큐 아웃을 종료할 수 있습니다. 이렇게 하면 조기 반환을 트리거할 수 있습니다.
- Google DAI가 암시적인
time_signal 유효성 검사
- 큐 아웃은 다음과 일치하는
segment_type_id
를 가진segmentation_descriptor
가 포함된time_signal
임:- 34 - 광고 시점 시작
- 48 - 제공업체 광고 시작
- 52 - 제공업체 게재위치 기회 시작
- 큐 인은 다음과 일치하는
segment_type_id
를 가진segmentation_descriptor
가 포함된time_signal
임:- 35 - 광고 시점 종료
- 49 - 제공업체 광고 종료
- 53 - 제공업체 게재위치 기회 종료
- 다른 모든
segmentation_type_ids
는 지원되지 않음 Time_signal
은 명시적인 큐 인이 있는 광고 시점으로부터의 자동 반환을 지원하지 않음
프레젠테이션 시간 유효성 검사
Google DAI는 세그먼트 분할을 지원하지 않으므로 이음 포인트의 프레젠테이션 시간과 가장 가까운 세그먼트 경계 사이의 거리에 대해 100ms의 허용오차만 허용합니다.
-
이음 포인트의 프레젠테이션 시간은
EventStream
의timescale
에 따라Period
의start
에 맞춰 조정된Event
의presentationTime
을 추가함으로써MPD
의availabilityStartTime
을 기준으로 합니다.암시적인 큐 인의 프레젠테이션 시간은 연결된 큐 아웃의 프레젠테이션 시간에 기간을 추가하여 계산할 수 있습니다. 이음 포인트의 기간은
EventStream
의Event
/timescale
의duration
을 사용하여 계산됩니다.이 컨텍스트에서 SCTE-35 신호에 제공된 PTS 시간 및 기간은 프레젠테이션 시간 또는 기간을 계산하는 데 사용되지 않습니다.
- 큐 아웃은 다른 큐 아웃 또는 큐 인과 동일한
Segment
경계에 있으면 안 됩니다. - 동일한
Segment
경계에 하나 이상의 큐 인이 있을 수 있습니다(예: 조기 광고 시점이 광고 시점의 실제 종료와 동시에 트리거됨). 중복 큐 인은 사실상 무시됩니다.
기간, 큐 아웃 및 큐 인 메시지 이벤트
단일 기간 매니페스트의 다중 기간 프레젠테이션을 만드는 경우 큐 아웃 이벤트의 시작 및 종료 시점(또는 큐 아웃 및 큐 인 이벤트의 시작 시점)에 모두 새 Periods
가 삽입됩니다.
- 첫 번째 새
Period
의 시작은 큐 아웃의 프레젠테이션 시간으로 표시되고, 두 번째 새Period
의 시작은 큐-아웃의presentationTime
및duration
의 합계 또는 큐 인의presentationTime
으로 표시됩니다(제공되는 경우).duration
이 있는 큐 아웃에 대해 큐 인이 제공되는 경우Period
는 이전의 이음 포인트를 사용하여 분할됩니다.
- Google DAI가 SCTE-35 메시지의
splice_time
,break_duration
,auto_return
,splice_immediate_flag
필드를 무시합니다.
전체 광고 시간 동안 큐 아웃 메시지를 나타내는 Event
가 있어야 합니다.
하지만 EventStream
의 첫 번째 Event
가 항상 큐 아웃 메시지라는 의미는 아닙니다. 입력 DVR 구간이 충분히 긴 경우 해당 구간의 이전 광고 시점에 속하는 이벤트가 있을 수 있습니다.
큐 아웃 메시지가 다음 큐 인 메시지에 의해 종료됩니다.
- SCTE-35 이음 ID(
splice_event_id
또는segmentation_event_id
)와 이벤트의id
속성이 무시됨 auto_return
이 설정되지 않은 경우splice_insert
큐 아웃 메시지는splice_insert
큐 인 메시지에 의해서만 종료될 것으로 예상됨time_signal
큐 아웃 메시지는 동일한segmentation_type_id
의time_signal
큐 인 메시지에 의해서만 종료될 것으로 예상됨
Period
가 생성됨).예
<EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin" timescale="600" presentationTimeOffset="991724821200">
<Event presentationTime="992568282204" duration="18073" id="1615447966">
<Signal xmlns="http://www.scte.org/schemas/35/2016">
<Binary>/DAbAAAAAAAAAP/wCgUAAAAAf98AAAAAAAAHeq0Q</Binary>
</Signal>
</Event>
<Event presentationTime="992568300277" id="1085695472">
<Signal xmlns="http://www.scte.org/schemas/35/2016">
<Binary>/DAbAAAAAAAAAP/wCgUAAAAAf18AAAAAAAAqqkN1</Binary>
</Signal>
</Event>
</EventStream>
지원되는 플랫폼, 패키지 프로그램 및 플레이어
플랫폼 |
||
---|---|---|
기기/브라우저 |
버전 |
DRM |
Chrome 브라우저 |
66 이상 버전 |
Widevine |
Firefox 브라우저 |
60 이상 버전 |
Widevine |
Microsoft Edge |
18 |
PlayReady |
Android |
4.4 이상 버전 |
Widevine |
Chromecast |
Gen2, Ultra(CAF API) |
Widevine |
Roku |
3, 4(펌웨어 8.1) |
PlayReady |
패키지 프로그램 |
||
---|---|---|
2.1.0 |
여러 기간 지원 |
|
1.47.3 |
여러 기간 지원 |
|
1.11.17 | 단일 기간 지원 |
플레이어 |
||
---|---|---|
Shaka |
테스트에 권장됨 |
|
Bitmovin |
||
Exo-Player |
||
Dash.js |
부록
단일 기간 매니페스트를 사용하는 경우 이 예는 DAI가 단일 기간 매니페스트를 다중 기간 매니페스트로 변환하는 방법을 보여줍니다.
단일 기간 매니페스트 입력의 예
<?xml version="1.0" encoding="UTF-8"?>
<MPD availabilityStartTime="2017-01-01T10:00:00Z" id="id1" maxSegmentDuration="PT2S" minBufferTime="PT2S" minimumUpdatePeriod="PT25S" profiles="urn:mpeg:dash:profile:isoff-live:2011" publishTime="2017-01-01T10:00:00Z" timeShiftBufferDepth="PT5M" type="dynamic" ns1:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:ns1="http://www.w3.org/2001/XMLSchema-instance">
<BaseURL>http://example.com/dash/</BaseURL>
<Period id="1" start="PT0S">
<EventStream timescale="90000" schemeIdUri="urn:scte:scte35:2014:xml+bin">
<Event duration="2700000" presentationTime="270000" id="1">
<Signal xmlns="http://www.scte.org/schemas/35/2016">
<Binary>/DAlAAAAAAAAAP/wFAUAAA+if+/+INAJ0P4AKTLgAAAAAAAA9UTkTA==</Binary>
</Signal>
</Event>
<Event presentationTime="2970000" id="2">
<Signal xmlns="http://www.scte.org/schemas/35/2016">
<Binary>/DAgAAAAAAAAAP/wDwUAAA+if0/+IPk8sAAAAAAAAH3XbUE=</Binary>
</Signal>
</Event>
</EventStream>
<AdaptationSet contentType="audio" lang="eng" mimeType="audio/mp4" segmentAlignment="true" startWithSAP="1">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
<SegmentTemplate timescale="44100" initialization="$RepresentationID$/init.mp4" media="$RepresentationID$/$Number$.m4s">
<SegmentTimeline>
<S t="0" d="132300" r="20" />
</SegmentTimeline>
</SegmentTemplate>
<Representation audioSamplingRate="48000" bandwidth="48000" codecs="mp4a.40.2" id="A48">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />
</Representation>
</AdaptationSet>
<AdaptationSet contentType="video" maxFrameRate="60/2" maxHeight="360" maxWidth="640" mimeType="video/mp4" minHeight="360" minWidth="640" par="16:9" segmentAlignment="true" startWithSAP="1">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main" />
<SegmentTemplate timescale="90000" initialization="$RepresentationID$/init.mp4" media="$RepresentationID$/$Number$.m4s">
<SegmentTimeline>
<S t="0" d="270000" r="20" />
</SegmentTimeline>
</SegmentTemplate>
<Representation bandwidth="300000" codecs="avc1.64001e" frameRate="60/2" height="360" id="V300" sar="1:1" width="640" />
</AdaptationSet>
</Period>
</MPD>
다중 기간 매니페스트 출력의 예
<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:XMLSchema-instance="http://www.w3.org/2001/XMLSchema-instance" XMLSchema-instance:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" id="id1" profiles="urn:mpeg:dash:profile:isoff-live:2011" type="dynamic" availabilityStartTime="2017-01-01T10:00:00Z" publishTime="2017-01-01T10:00:00Z" minimumUpdatePeriod="PT25S" minBufferTime="PT2S" timeShiftBufferDepth="PT5M0S" maxSegmentDuration="PT2S">
<BaseURL>http://example.com/dash/</BaseURL>
<Period id="0s" start="PT0S">
<AdaptationSet mimeType="audio/mp4" startWithSAP="1" lang="eng" contentType="audio" segmentAlignment="true">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>
<SegmentTemplate timescale="44100" presentationTimeOffset="0" media="$RepresentationID$/$Number$.m4s" initialization="$RepresentationID$/init.mp4">
<SegmentTimeline>
<S d="132300"></S>
</SegmentTimeline>
</SegmentTemplate>
<Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="A48" bandwidth="48000">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></AudioChannelConfiguration>
</Representation>
</AdaptationSet>
<AdaptationSet mimeType="video/mp4" startWithSAP="1" contentType="video" par="16:9" minWidth="640" maxWidth="640" minHeight="360" maxHeight="360" maxFrameRate="60/2" segmentAlignment="true">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>
<SegmentTemplate timescale="90000" presentationTimeOffset="0" media="$RepresentationID$/$Number$.m4s" initialization="$RepresentationID$/init.mp4">
<SegmentTimeline>
<S d="270000"></S>
</SegmentTimeline>
</SegmentTemplate>
<Representation width="640" height="360" sar="1:1" frameRate="60/2" codecs="avc1.64001e" id="V300" bandwidth="300000"></Representation>
</AdaptationSet>
</Period>
<Period id="3s" start="PT3S">
<EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin" timescale="90000">
<Event duration="2700000" id="1">
<Signal xmlns="http://www.scte.org/schemas/35/2016">
<Binary>/DAlAAAAAAAAAP/wFAUAAA+if+/+INAJ0P4AKTLgAAAAAAAA9UTkTA==</Binary>
</Signal>
</Event>
</EventStream>
<AdaptationSet mimeType="audio/mp4" startWithSAP="1" lang="eng" contentType="audio" segmentAlignment="true">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>
<SegmentTemplate timescale="44100" presentationTimeOffset="132300" media="$RepresentationID$/$Number$.m4s" initialization="$RepresentationID$/init.mp4">
<SegmentTimeline>
<S t="132300" d="132300" r="9"></S>
</SegmentTimeline>
</SegmentTemplate>
<Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="A48" bandwidth="48000">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></AudioChannelConfiguration>
</Representation>
</AdaptationSet>
<AdaptationSet mimeType="video/mp4" startWithSAP="1" contentType="video" par="16:9" minWidth="640" maxWidth="640" minHeight="360" maxHeight="360" maxFrameRate="60/2" segmentAlignment="true">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>
<SegmentTemplate timescale="90000" presentationTimeOffset="270000" media="$RepresentationID$/$Number$.m4s" initialization="$RepresentationID$/init.mp4">
<SegmentTimeline>
<S t="270000" d="270000" r="9"></S>
</SegmentTimeline>
</SegmentTemplate>
<Representation width="640" height="360" sar="1:1" frameRate="60/2" codecs="avc1.64001e" id="V300" bandwidth="300000"></Representation>
</AdaptationSet>
</Period>
<Period id="33s" start="PT33S">
<EventStream schemeIdUri="urn:scte:scte35:2014:xml+bin" timescale="90000">
<Event id="2">
<Signal xmlns="http://www.scte.org/schemas/35/2016">
<Binary>/DAgAAAAAAAAAP/wDwUAAA+if0/+IPk8sAAAAAAAAH3XbUE=</Binary>
</Signal>
</Event>
</EventStream>
<AdaptationSet mimeType="audio/mp4" startWithSAP="1" lang="eng" contentType="audio" segmentAlignment="true">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>
<SegmentTemplate timescale="44100" presentationTimeOffset="1455300" media="$RepresentationID$/$Number$.m4s" initialization="$RepresentationID$/init.mp4">
<SegmentTimeline>
<S t="1455300" d="132300" r="9"></S>
</SegmentTimeline>
</SegmentTemplate>
<Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="A48" bandwidth="48000">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></AudioChannelConfiguration>
</Representation>
</AdaptationSet>
<AdaptationSet mimeType="video/mp4" startWithSAP="1" contentType="video" par="16:9" minWidth="640" maxWidth="640" minHeight="360" maxHeight="360" maxFrameRate="60/2" segmentAlignment="true">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"></Role>
<SegmentTemplate timescale="90000" presentationTimeOffset="2970000" media="$RepresentationID$/$Number$.m4s" initialization="$RepresentationID$/init.mp4">
<SegmentTimeline>
<S t="2970000" d="270000" r="9"></S>
</SegmentTimeline>
</SegmentTemplate>
<Representation width="640" height="360" sar="1:1" frameRate="60/2" codecs="avc1.64001e" id="V300" bandwidth="300000"></Representation>
</AdaptationSet>
</Period>
</MPD>