Pod Serving API는 인코딩되고 컨디셔닝된 광고 세그먼트에 대한 액세스를 제공합니다. 사용자 대상 HLS에 바로 연결할 수 있도록 준비됨 또는 MPEG-DASH 미디어 재생목록입니다. MPEG-DASH의 경우 Pod Serving API는 또한 광고 매니페스트 템플릿을 사용하여 광고에 대한 추가 정보와 컨텍스트를 세그먼트.
이 가이드에서는 기본적인 광고 모음 게재 매니페스트 조작을 구현하는 데 중점을 둡니다. 라이브 스트림용 서버를 이용할 수 있습니다
기본 요건: Google Ad Manager에서 실시간 스트림 이벤트 구성하기
Pod Serving API에 요청하기 전에 처리하는 각 스트림에 대해 Ad Manager 라이브 스트림 이벤트를 만들어야 합니다. LiveStreamEventService API
또는 Google Ad Manager 웹 인터페이스를 사용하여 라이브 스트림 이벤트를 만들 수 있습니다.
라이브 스트림 이벤트를 Pod Serving API와 함께 사용하려면 이벤트의 여러 속성을 채워야 합니다.
customAssetKey
- 이 이벤트에 사용할 맞춤 식별자입니다. 필수 네트워크의 모든 이벤트에서 고유한 값을 갖습니다.adTags
- Ad Manager 트래피킹 워크플로에서 생성된 기본 광고 태그 URL입니다.dynamicAdInsertionType
-POD_SERVING_REDIRECT
로 설정해야 합니다.streamingFormat
-HLS
또는DASH
로 설정합니다.segmentUrlAuthenticationKeyIds
- 하나 이상 HMAC 키 광고 세그먼트 요청에 서명하는 데 사용됩니다.daiEncodingProfileIds
- DAIEncodingProfile 이 이벤트에 대해 사용 설정된 ID입니다.startDateTime
- 이벤트의 시작 날짜 및 시간endDateTime
- 이 이벤트의 예약된 종료일 및 시간입니다. 이 속성은unlimitedEndDateTime
is false and ignored if
unlimitedEndDateTimeis true.
unlimitedEndDateTime`인 경우 필수입니다. 위의 내용을 참조하세요.
스트림 매니페스트 요청 수신
매니페스트 조작기는 동영상 플레이어 클라이언트 앱의 매니페스트 요청을 리슨하는 API 엔드포인트를 제공해야 합니다. 이 엔드포인트는 최소한 클라이언트 플레이어 앱에서 스트림 ID를 수집하고 꿰맨 스트림 매니페스트를 반환해야 합니다. 스트림 ID는 Ad Manager로의 스트리밍 세션을 식별하는 데 사용됩니다.
또한 적절한 대상을 식별하기 위해 다른 정보를 수집해야 콘텐츠 스트림(예: 콘텐츠 ID)입니다.
잠재적인 매니페스트 요청 엔드포인트의 예
GET /api/video/{asset_key}/manifest.{format}
Host: {your_domain}
경로 매개변수 | |||||
---|---|---|---|---|---|
asset_key |
시스템에서 요청된 라이브 스트림에 해당하는 가상의 ID입니다. | ||||
format |
스트림 형식에 해당하는 가상의 매개변수입니다. 다음 중 하나:
|
쿼리 매개변수 | |
---|---|
stream_id |
클라이언트 동영상 플레이어 앱의 Ad Manager 스트림 ID입니다. |
콘텐츠 스트림 가져오기
매니페스트 요청에서 수집한 Content ID를 사용하여 콘텐츠 선택 광고를 연결할 수 있습니다.
광고 세그먼트를 콘텐츠 스트림에 연결
광고 세그먼트 URL의 연결은 스트림 형식에 따라 다릅니다.
HLS 스트림
HLS 스트림은 일반적으로 각 인코딩 프로필에 해당하는 변형 매니페스트 링크 집합이 포함된 다중 변형 매니페스트로 제공됩니다.
참고: 편의상 이 가이드에서는 HLS 미디어가 오디오와 동영상을 동일한 세그먼트 파일로 mux하는 형식으로 인코딩되었다고 가정합니다.
프록시 다중 변형 재생목록
플레이어의 선택한 대안 매니페스트를 처리하려면 원래 다중 대안 재생목록의 각 대안 재생목록 URL을 조작자의 다른 엔드포인트 호출로 대체해야 합니다.
HLS를 스티칭하는 나머지 단계에서는 단일 변형 매니페스트가 처리되고 있다고 가정합니다.
잠재적 대안 요청 엔드포인트의 예
GET /api/video/{asset_key}/variant/{variant_id}.m3u8
Host: {your_domain}
경로 매개변수 | |
---|---|
asset_key |
시스템에서 요청된 라이브 스트림에 해당하는 가상의 ID입니다. |
variant |
처리 중인 특정 대안의 식별자가 포함된 가상 매개변수입니다. |
쿼리 매개변수 | |
---|---|
stream_id |
클라이언트 동영상 플레이어 앱의 Ad Manager 스트림 ID입니다. 여기에 사용된 사용자 세션을 식별할 수 있습니다. |
처리되지 않은 다중 변형 매니페스트 예
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://cdn.{...}/360p.m3u8
프록시된 다중 변형 매니페스트의 예
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://{manifest_manipulator}/api/video/tears_of_steel/variant/1080p.m3u8?stream_id=6e69425c-0ac5-43ef-b070-c5143ba68541:CHS
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,CODECS="avc1.4d000c,mp4a.40.5"
https://{manifest_manipulator}/api/video/tears_of_steel/variant/720p.m3u8?stream_id=6e69425c-0ac5-43ef-b070-c5143ba68541:CHS
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://{manifest_manipulator}/api/video/tears_of_steel/variant/360p.m3u8?stream_id=6e69425c-0ac5-43ef-b070-c5143ba68541:CHS
광고 시점 세그먼트 식별 및 불연속성 삽입
변형 매니페스트를 처리할 때 시작 시간, 지속 시간, 동적 매니페스트가 처리될 때까지 게재 예정인 다음 광고 시간의 색인 광고 콘텐츠로 대체될 세그먼트가 포함되어 있습니다.
광고 시점은 다음에 따라 다양한 방식으로 콘텐츠 세그먼트와 구분될 수 있습니다.
살펴보겠습니다. 광고 시점을 설명하는 일반적인 방법 중 하나는
#EXT-X-CUE-OUT
태그가 있는 세그먼트도 그 뒤에 #EXT-X-CUE-IN
태그를 사용하여 뒤에 올립니다.
Google에서 호스팅하는 광고 시점을 콘텐츠 세그먼트와 구분하려면 각 광고 시점의 시작과 끝에 #EXT-X-DISCONTINUITY
태그를 삽입해야 합니다. 이러한 연속되지 않는 부분 태그가 최종 매니페스트에 표시되지 않으면 재생이 실패합니다.
삽입된 광고 세그먼트 URI가 암호화되지 않습니다. 콘텐츠가 암호화된 경우 각 광고 시점의 첫 번째 광고 세그먼트 전에 #EXT-X-KEY:METHOD=NONE
를 지정하여 암호화를 삭제한 후 광고 시점 후에 다시 추가해야 합니다.
샘플 매니페스트 (원본)
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.005,
contentorigin.com/1.ts
#EXTINF:5.005,
contentorigin.com/2.ts
#EXT-X-CUE-OUT:15.000
#EXTINF:5.005,
contentorigin.com/3.ts
#EXTINF:5.005,
contentorigin.com/4.ts
#EXTINF:5.005,
contentorigin.com/5.ts
#EXTINF:5.000,d
contentorigin.com/6.ts
#EXT-X-CUE-IN
#EXTINF:5.005,
contentorigin.com/7.mp4
#EXTINF:5.005,
contentorigin.com/8.mp4
불연속성이 삽입된 매니페스트
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.005,
contentorigin.com/1.ts
#EXTINF:5.005,
contentorigin.com/2.ts
#EXTINF:5.005,
#EXT-X-DISCONTINUITY
{... New segments will go here ...}
#EXT-X-DISCONTINUITY
#EXTINF:5.005,
contentorigin.com/7.mp4
#EXTINF:5.005,
contentorigin.com/8.mp4
광고 모음 세그먼트 처리
광고 모음 내 각 세그먼트에 대해 몇 가지 추가 값을 추적해야 합니다.
segment_number
: 광고 모음 내 세그먼트 색인입니다(0부터 시작). 또는 mp4 초기화 세그먼트의 경우 'init'입니다.segment_duration
: 현재 세그먼트의 길이(밀리초)입니다. 이 값은 포드의 마지막 세그먼트를 제외한 모든 세그먼트에서 동일해야 합니다.segment_offset
: 이전 세그먼트의 길이를 세그먼트 오프셋에 더하여 계산된 세그먼트 오프셋(밀리초)last
: 광고 모음의 마지막 세그먼트를 식별하는 불리언 값입니다. 기본값은 false입니다.
광고 세그먼트 URL 만들기
광고 시점 내의 각 세그먼트를 다음 형식의 URL로 바꿉니다.
/linear/pods/v1/seg/network/{network_code}/custom_asset/{custom_asset_key}/{pod_identifier}/profile/{profile_name}/{segment_number}.(ts|mp4|vtt|aac|ac3|eac3)
경로 매개변수 | |
---|---|
network_code
|
이 네트워크의 Ad Manager 360 네트워크 코드입니다. |
custom_asset_key
|
LiveStreamEventService API 또는 Ad Manager 360 웹 인터페이스의 라이브 스트림 페이지에 지정된 맞춤 라이브 스트림 애셋 키입니다. |
pod_identifier |
지원되는 형식은 다음과 같습니다. pod/{integer}
현재 광고 시점의 숫자 식별자입니다. 광고 모음 ID는 ad_break_id/{string}
현재 광고 시점의 문자열 식별자입니다. |
profile_name
|
요청된 프로필의 식별자, |
segment_number
|
현재 광고 모음 내에서 이 세그먼트의 색인으로, 0에서 시작합니다. MP4 컨테이너를 사용하는 경우segment_number를 'init'로 설정하여 초기화 세그먼트를 요청할 수 있습니다. |
쿼리 매개변수 | ||
---|---|---|
stream_id
|
필수 | 스트림 만들기 요청에서 반환된 사용자의 stream_id 매개변수입니다.
|
sd
|
필수 | segment_duration
|
so
|
선택사항 | segment_offset
|
pd
|
지속 시간이 없는 광고 시점이 사용 설정된 이벤트를 제외하고 필수입니다. | 광고 시점의 길이 (밀리초)입니다. ad_pod_duration 라고도 합니다.
|
auth-token
|
필수 | 이 광고 모음의 서명된 URL 인코딩 HMAC 토큰입니다. |
last
|
선택사항 | 광고 시점의 마지막 세그먼트를 나타내는 불리언입니다. 기본값은 false입니다. |
쿼리 매개변수 값은 URL로부터 안전하도록 올바르게 인코딩되어야 합니다. 이것은
auth-token
필드에 특히 중요합니다. /
가 포함될 수 있기 때문입니다.
+
, =
자(영문 기준)입니다.
샘플 매니페스트(세그먼트 교체 후)
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.005,
contentorigin.com/1.ts
#EXTINF:5.005,
contentorigin.com/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.005,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/ad_break_id/adbreak1/profile/devrel4628000/0.ts?sd=5005&so=0&pd=18015&auth-token=ad_break_id%3Dadbreak1~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2
#EXTINF:5.005,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/ad_break_id/adbreak1/profile/devrel4628000/1.ts?sd=5005&so=5005&pd=18015&auth-token=ad_break_id%3Dadbreak1~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2
#EXTINF:5.005,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/ad_break_id/adbreak1/profile/devrel4628000/2.ts?sd=5005&so=10010&pd=18015&auth-token=ad_break_id%3adbreak1~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2
#EXTINF:3.000,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/ad_break_id/adbreak1/profile/devrel4628000/3.ts?sd=3000&so=15015&pd=18015&auth-token=ad_break_id%3Dadbreak1~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2&last=true
#EXT-X-DISCONTINUITY
#EXTINF:5.005,
contentorigin.com/7.mp4
#EXTINF:5.005,
contentorigin.com/8.mp4
축하합니다. 이제 DAI 광고 모음 게재 API에서 제공하는 광고 세그먼트가 포함된 라이브 스트림을 게재하고 있습니다.
DASH 스트림
DASH 스트림은 MPD 파일로 제공되며, 이 파일에는 콘텐츠가 일련의 기간으로 표시되는 단일 파일에 모든 스트림 인코딩이 포함됩니다.
요청 기간 템플릿
Google Ad Manager에 기간 템플릿을 요청합니다. 이 템플릿은 포함된 매크로가 채워지면 광고 시점 기간이 시작됩니다.
이 템플릿은 스트림 세션당 한 번만 요청하고 각 광고 시점에 재사용할 수 있도록 캐시해야 합니다.
기간 템플릿 요청 엔드포인트hjf
GET /linear/pods/v1/dash/network/{network_code}/custom_asset/{custom_asset}/pods.json
Host: dai.google.com
Content-Type: application/json
경로 매개변수 | |
---|---|
network_code |
게시자의 Ad Manager 360 네트워크 코드입니다. |
custom_asset |
Google Ad Manager 실시간 스트림 이벤트의 맞춤 애셋 키입니다. |
쿼리 매개변수 | |
---|---|
stream_id |
클라이언트 동영상 플레이어의 Ad Manager 스트림 ID입니다. |
응답 JSON | |
---|---|
dash_period_template |
기간 템플릿 XML 문자열입니다. |
segment_duration_ms |
대시 기간 템플릿에 있는 각 광고 미디어 세그먼트의 재생 시간(단위: 밀리초 단위입니다. |
요청 예시(cURL)
curl https://dai.google.com/linear/pods/v1/dash/network/21775744923/custom_asset/tears_of_steel/pods.json?stream-id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS
응답 예
{"dash_period_template":"<Period id="adpod-$$pod-id$$" $$period-start$$ $$period-duration$$> <BaseURL>https://dai.google.com/linear/pods/v1/seg/event/{event_code}/pods/$$pod-id$$/profile/</BaseURL>
<SegmentTemplate initialization="$RepresentationID$/init.mp4?stream_id={a-stream-id}&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id={a-stream-id}&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&scte35=$$scte35$$&auth_token=$$token$$" startNumber="1" presentationTimeOffset="0">
<SegmentTimeline>
<S t="0" d="5" r="$$number-of-repeated-segments$$"/>
</SegmentTimeline>
</SegmentTemplate>
<AdaptationSet id="0" width="1280" height="720" frameRate="30" contentType="video" subsegmentAlignment="true" startWithSAP="1">
<InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation mimeType="video/mp4" codecs="avc1.640029" id="a943ff679a2f3e71d9181a21b7542122g" bandwidth="3200000"/>
<Representation mimeType="video/mp4" codecs="avc1.640029" id="abbbd80q4w5ce2fs28308rd1f4g4bat0" bandwidth="1500000"/>
</AdaptationSet>
<AdaptationSet id="1" contentType="audio"> <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="a87ff679a2f3e71d9181a67b7542122c" bandwidth="95000"/>
<Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="eccbc87e4b5ce2fe28308fd9f2a7baf3" bandwidth="127000"/>
</AdaptationSet>
</Period>",
"segment_duration_ms":5000}
기간 템플릿 채우기
기간 템플릿에는 각 광고에 대해 대체해야 하는 여러 매크로가 포함되어 있습니다. 있습니다. 모든 매크로를 대체해야 합니다. 사용하지 않는 매크로는 빈 문자열("")입니다.
Macro | 설명 | 예 |
---|---|---|
$$pod-id$$ |
이 기간이 나타내는 광고 모음의 색인입니다. 이 값은 모든 시청자 세션에서 동일한 광고 모음에 있어야 합니다. | 1 |
$$period-start$$ |
현재 MPD에서 기간이 시작되는 시간입니다. start="###" 로 대체해야 하는 선택적 속성입니다. 여기서 ### 는 광고 시점이 시작되는 프레젠테이션 시간입니다. 기간의 시작 시간이 제공되지 않으면 이 매크로는 빈 문자열로 대체해야 합니다.
|
start="PT2H33M30S" |
$$period-duration$$ |
전체 광고 기간의 길이입니다. 필수 속성인
duration="###" 로 대체되어야 합니다. 여기서 ### 는
표준 DASH 기간 형식으로 된 광고 기간의 지속 시간입니다. 기간의 기간이 제공되지 않은 경우 이 매크로는 빈 문자열로 대체해야 합니다.
|
duration="PT15S" |
$$pod-duration$$ |
이 광고 모음에 대해 결정될 것으로 예상되는 광고의 길이입니다. 밀리초 단위입니다. | 15000 |
$$number-of-repeated-segments$$ |
이 값은 광고 기간 길이(밀리초)를 segment_duration_ms 값으로 나눈 후 가장 가까운 정수로 올림하여 계산됩니다. | 3 |
$$cust_params$$ |
이 매크로는 현재 광고 시점에 고유한 맞춤 타겟팅 매개변수(제공되는 경우)로 대체할 수 있습니다. 값은 이 Ad Manager 또는 고객센터 도움말 맞춤 매개변수가 필요하지 않은 경우 이 매크로는 빈 문자열로 대체해야 합니다. |
&cust_params=section%3Dblog%26anotherKey%3Dvalue1%2Cvalue2
|
$$scte35$$ |
이 매크로는 광고 시간에 고유한 scte35 값으로 대체되어야 합니다. 제공됩니다. scte35 정보가 필요하지 않은 경우 이 매크로는 빈 문자열로 대체됩니다. |
/DAqAAAAAAAA///wDwVAAAT2f0/+ecF1mQABC/8ACgAIQ1VFSQAAAAsuZVlR
|
$$token$$ |
서명되고 URL로 인코딩된 HMAC 토큰입니다. 이 토큰은 필수입니다. |
custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D6a8c44c72e4718ff63ad2284edf2a8b9e319600b430349d31195c99b505858c9
|
매크로가 포함된 원시 기간 템플릿
<Period id="adpod-$$pod-id$$" $$period-start$$ $$period-duration$$>
<BaseURL>
https://dai.google.com/linear/pods/v1/seg/event/{event_code}/pods/$$pod-id$$/profile/
</BaseURL>
<SegmentTemplate initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id=ç√&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&scte35=$$scte35$$&auth_token=$$token$$" startNumber="1" presentationTimeOffset="0">
<SegmentTimeline>
<S t="0" d="5" r="$$number-of-repeated-segments$$"/>
</SegmentTimeline>
</SegmentTemplate>
<AdaptationSet id="0" width="1280" height="720" frameRate="30" contentType="video" subsegmentAlignment="true" startWithSAP="1">
<InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation mimeType="video/mp4" codecs="avc1.640029" id="a943ff679a2f3e71d9181a21b7542122g" bandwidth="3200000"/>
<Representation mimeType="video/mp4" codecs="avc1.640029" id="abbbd80q4w5ce2fs28308rd1f4g4bat0" bandwidth="1500000"/>
</AdaptationSet>
<AdaptationSet id="1" contentType="audio"> <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="a87ff679a2f3e71d9181a67b7542122c" bandwidth="95000"/>
<Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="eccbc87e4b5ce2fe28308fd9f2a7baf3" bandwidth="127000"/>
</AdaptationSet>
</Period>
채워진 광고 기간
<Period id="pod-0" start="PT5H50M12S">
<BaseURL>
https://dai.google.com/linear/pods/v1/seg/event/M-nTcApTRTi6CEGIt4GYMw/pod/0/profile/
</BaseURL>
<SegmentTemplate startNumber="0" media="1080p/0.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&sd=5000&pd=30000&cust_params=&auth-token=&scte35=" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&pd=30000&cust_params=&auth-token=&scte35=">
<SegmentTimeline>
<S d="5" r="1"/>
</SegmentTimeline>
</SegmentTemplate>
<AdaptationSet mimeType="video/mp4" scanType="progressive" contentType="video">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation width="768" height="432" frameRate="30" codecs="avc1.42c01e" id="fmp4-video-1200k" bandwidth="1300000">
<InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
</Representation>
</AdaptationSet>
<AdaptationSet mimeType="audio/mp4" scanType="progressive" contentType="audio">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="fmp4-audio-128kbps" bandwidth="128000">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
</Representation>
</AdaptationSet>
</Period>
채워진 기간을 DASH 매니페스트에 삽입
마지막으로 원시 매니페스트에서 적절한 마침표를 광고 기간이 채워지고, 최종 병합된 매니페스트를 동영상 클라이언트입니다.
원시 콘텐츠 매니페스트 예
<?xml version="1.0"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:DASH:schema:MPD:2011" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011" profiles="urn:mpeg:dash:profile:isoff-main:2011" type="static" mediaPresentationDuration="PT0H9M56.46S">
<BaseURL>
http://example.com/tears_of_steel/
</BaseURL>
<Period start="PT0S">
<AdaptationSet bitstreamSwitching="true">
<Representation id="0" codecs="avc1" mimeType="video/mp4" width="1920" height="1080" startWithSAP="1" bandwidth="500000">
<SegmentBase>
<Initialization sourceURL="segments/1080/1.m4s" range="0-862"/>
</SegmentBase>
<SegmentList duration="15">
<SegmentURL media="segments/1080p/2.m4s" mediaRange="863-7113"/>
<SegmentURL media="segments/1080p/3.m4s" mediaRange="7114-14104"/>
<SegmentURL media="segments/1080p/4.m4s" mediaRange="14105-17990"/>
...
</SegmentList>
</Representation>
<Representation id="1" codecs="avc1" mimeType="video/mp4" width="1280" height="720" startWithSAP="1" bandwidth="250000">
<SegmentBase>
<Initialization sourceURL="segments/720p/1.m4s" range="0-864"/>
</SegmentBase>
<SegmentList duration="15">
<SegmentURL media="segments/720p/2.m4s" mediaRange="865-11523"/>
<SegmentURL media="segments/720p/3.m4s" mediaRange="11524-25621"/>
<SegmentURL media="segments/720p/4.m4s" mediaRange="25622-33693"/>
...
</SegmentList>
</Representation>
<Representation id="1" codecs="avc1" mimeType="video/mp4" width="640" height="480" startWithSAP="1" bandwidth="100000">
<SegmentBase>
<Initialization sourceURL="segment/480p/1.m4s" range="0-865"/>
</SegmentBase>
<SegmentList duration="15">
<SegmentURL media="segment/480p/2.m4s" mediaRange="866-26970"/>
<SegmentURL media="segment/480p/3.m4s" mediaRange="26971-72543"/>
<SegmentURL media="segment/480p/4.m4s" mediaRange="72544-95972"/>
...
</SegmentList>
</Representation>
...
</AdaptationSet>
</Period end>
</MPD>
꿰맨 매니페스트의 예
<?xml version="1.0"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:DASH:schema:MPD:2011" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011" profiles="urn:mpeg:dash:profile:isoff-main:2011" type="static" mediaPresentationDuration="PT0H9M56.46S">
<BaseURL>
http://example.com/tears_of_steel/
</BaseURL>
<Period id="pod-0" start="PT5H50M12S">
<BaseURL>
https://dai.google.com/linear/pods/v1/seg/event/M-nTcApTRTi6CEGIt4GYMw/pod/0/profile/
</BaseURL>
<SegmentTemplate startNumber="0" media="1080p/0.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&sd=5000&pd=30000&cust_params=&auth-token=&scte35=$$scte35$$" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&pd=30000&cust_params=&auth-token=&scte35=$$scte35$$">
<SegmentTimeline>
<S d="5" r="1"/>
</SegmentTimeline>
</SegmentTemplate>
<AdaptationSet mimeType="video/mp4" scanType="progressive" contentType="video">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation width="768" height="432" frameRate="30" codecs="avc1.42c01e" id="fmp4-video-1200k" bandwidth="1300000">
<InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
</Representation>
</AdaptationSet>
<AdaptationSet mimeType="audio/mp4" scanType="progressive" contentType="audio">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="fmp4-audio-128kbps" bandwidth="128000">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
</Representation>
</AdaptationSet>
</Period>
</MPD>
축하합니다. 이제 DAI 광고 모음 게재 API에서 제공하는 광고 세그먼트가 포함된 DASH 라이브 스트림을 게재하고 있습니다.
추가 리소스
- IMA SDK를 사용하여 광고 모음을 재생하는 방법은 다음과 같습니다.
- DAI API를 사용한 광고 모음 게재 재생