라이브 스트림용 매니페스트 조작기

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 - 이 이벤트의 예약된 종료일 및 시간입니다. 이 속성은 unlimitedEndDateTimeis false and ignored ifunlimitedEndDateTimeis true.unlimitedEndDateTime`인 경우 필수입니다. 위의 내용을 참조하세요.

스트림 매니페스트 요청 수신

매니페스트 조작기는 동영상 플레이어 클라이언트 앱의 매니페스트 요청을 리슨하는 API 엔드포인트를 제공해야 합니다. 이 엔드포인트는 최소한 클라이언트 플레이어 앱에서 스트림 ID를 수집하고 꿰맨 스트림 매니페스트를 반환해야 합니다. 스트림 ID는 Ad Manager로의 스트리밍 세션을 식별하는 데 사용됩니다.

또한 적절한 대상을 식별하기 위해 다른 정보를 수집해야 콘텐츠 스트림(예: 콘텐츠 ID)입니다.

잠재적인 매니페스트 요청 엔드포인트의 예

GET /api/video/{asset_key}/manifest.{format}
Host: {your_domain}
경로 매개변수
asset_key 시스템에서 요청된 라이브 스트림에 해당하는 가상의 ID입니다.
format 스트림 형식에 해당하는 가상의 매개변수입니다. 다음 중 하나:
mpd MPEG-DASH 스트림용
m3u8 HLS 스트림
쿼리 매개변수
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는 1부터 시작하여 광고 시점 이벤트마다 점진적으로 할당됩니다.

ad_break_id/{string}

현재 광고 시점의 문자열 식별자입니다.

profile_name 요청된 프로필의 식별자,
segment_number 현재 광고 모음 내에서 이 세그먼트의 색인으로, 0에서 시작합니다.
MP4 컨테이너를 사용하는 경우segment_number를 'init'로 설정하여 초기화 세그먼트를 요청할 수 있습니다.
쿼리 매개변수
stream_id 필수 스트림 만들기 요청에서 반환된 사용자의 stream_id 매개변수입니다.
sd 필수 segment_duration
so 선택사항 segment_offset

so가 누락되면 이전 세그먼트가 모두 재생 시간이 동일하며 세그먼트 오프셋은 segment_numbersd.

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}&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id={a-stream-id}&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;scte35=$$scte35$$&amp;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&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id=ç√&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;scte35=$$scte35$$&amp;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&amp;sd=5000&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;scte35=" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;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&amp;sd=5000&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;scte35=$$scte35$$" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;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 라이브 스트림을 게재하고 있습니다.

추가 리소스