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

Pod Serving API는 사용자 대상 HLS 또는 MPEG-DASH 미디어 재생목록에 직접 연결할 수 있는 방식으로 준비된 인코딩되고 컨디셔닝된 광고 세그먼트에 대한 액세스를 제공합니다. MPEG-DASH의 경우 Pod Serving API는 이러한 광고 세그먼트에 관한 추가 정보와 컨텍스트를 제공하는 매니페스트 템플릿도 제공합니다.

이 가이드에서는 라이브 스트림을 위한 기본 광고 모음 게재 매니페스트 조작 서버를 구현하는 방법을 중점적으로 설명합니다.

기본 요건: Google Ad Manager에서 실시간 스트림 이벤트 구성

포드 제공 API에서 요청하기 전에 처리하는 각 스트림에 대해 Ad Manager 실시간 스트림 이벤트를 만들어야 합니다. LiveStreamEventService API 또는 Google Ad Manager 웹 인터페이스를 사용하여 실시간 스트림 이벤트를 만들 수 있습니다.

실시간 스트림 이벤트를 포드 제공 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입니다.

콘텐츠 스트림 검색

매니페스트 요청에서 수집된 콘텐츠 ID를 사용하여 광고와 연결할 콘텐츠 스트림을 선택합니다.

광고 세그먼트를 콘텐츠 스트림에 연결

광고 세그먼트 URL 병합은 스트림 형식에 따라 다릅니다.

HLS 스트림

HLS 스트림은 일반적으로 다중 변형 매니페스트로 제공되며, 이 다중 변형 매니페스트에는 각 인코딩 프로필에 상응하는 변형 매니페스트의 링크 집합이 포함됩니다.

참고: 이 가이드에서는 편의상 HLS 미디어가 오디오와 동영상을 동일한 세그먼트 파일로 결합하는 형식으로 인코딩되었다고 가정합니다.

프록시 다중 변형 재생목록

플레이어의 선택된 변형 매니페스트를 처리하려면 원래 다중 변형 재생목록의 각 변형 재생목록 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/{pod_id}/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_id 광고 시점의 식별자입니다. 1부터 광고 시점마다 1씩 증가하는 정수여야 합니다.

이 값은 현재 이벤트에서 동일한 광고 시점을 보는 모든 사용자에게서 동일해야 합니다.

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 선택사항 광고 시간의 마지막 세그먼트를 나타내는 부울입니다. 기본값은 거짓입니다.

쿼리 매개변수 값은 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/pod/1/profile/devrel4628000/0.ts?sd=5005&so=0&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~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/pod/1/profile/devrel4628000/1.ts?sd=5005&so=5005&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~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/pod/1/profile/devrel4628000/2.ts?sd=5005&so=10010&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~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/pod/1/profile/devrel4628000/3.ts?sd=3000&so=15015&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~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 Pod Serving 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 Pod Serving API에서 제공하는 광고 세그먼트를 사용하여 DASH 라이브 스트림을 게재합니다.

추가 리소스