适用于直播的清单操纵器

Pod Serving API 支持访问经过编码和经过调整的广告片段,这些片段的准备方式可以直接拼接到面向用户的 HLS 或 MPEG-DASH 媒体播放列表中。对于 MPEG-DASH,Pod Serving API 还会提供一个清单模板,用于为这些广告细分提供更多信息和上下文。

本指南重点介绍如何为直播实现基本的 Pod Serving 清单操纵服务器。

必备条件:在 Google Ad Manager 中配置直播活动

在通过 Pod 投放 API 发出任何请求之前,您必须先为您处理的每个视频流创建 Ad Manager 直播活动。您可以使用 LiveStreamEventService APIGoogle Ad Manager 网页界面创建直播活动。

对于要与 Pod Serving API 搭配使用的直播活动,您需要填充活动的几个属性:

  • customAssetKey - 要用于此事件的自定义标识符。在广告联盟的所有事件中必须是唯一的。
  • adTags - 由 Ad Manager 广告投放管理工作流程生成的主要广告代码网址。
  • dynamicAdInsertionType - 必须设置为 POD_SERVING_REDIRECT
  • streamingFormat - 相应地设置为 HLSDASH
  • 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 选择要与广告拼接的内容流。

将广告片段拼接到内容流中

广告片段网址拼接方式因视频流格式而异。

HLS 视频流

HLS 流通常作为多变体清单提供,其中包含一组指向变体清单的链接,这些链接对应于每个编码配置文件。

注意:为简单起见,本指南假定您的 HLS 媒体编码为将音频和视频多路复用到同一片段文件中的格式。

代理多变体播放列表

您需要将原始多变体播放列表中的每个变体播放列表网址替换为对操纵器的另一个端点调用,以处理播放器选择的变体清单。

拼接 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:广告连播中的细分受众群索引,从零开始。或者,如果是 mp4 初始化片段,请使用“init”。
  • segment_duration:当前片段的时长(以毫秒为单位)。除了 Pod 中的最后一个细分之外,其他所有细分的此值都应相同。
  • segment_offset:通过将上一片段的时长与其片段偏移量相加(以毫秒为单位)计算出的片段偏移量
  • last:用于标识广告连播中最后一个细分受众群的布尔值。默认值为 false。

创建广告细分网址

将广告插播时间点中的每个片段替换为以下格式的网址:

/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 此细分受众群在当前广告连播中的索引,从零开始。
使用 MP4 容器时,可通过将 segment_number 设置为“init”来请求初始化细分受众群。
查询参数
stream_id 必需 从数据流创建请求返回的用户 stream_id 参数。
sd 必需 segment_duration
so 可选 segment_offset

如果缺少 so,则假定之前的片段都具有相同的时长,并且片段偏移量根据 segment_numbersd 计算得出。

pd 必选,已启用无时长广告插播的活动除外 广告插播的时长(以毫秒为单位)。也称为 ad_pod_duration
auth-token 必需 此广告连播的签名网址编码 HMAC 令牌
last 可选 指示广告插播时间点中最后一个片段的布尔值。默认值为 false。

必须对查询参数值进行正确编码,以确保网址安全。这对于 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 短划线时间段模板中每个广告媒体片段的时长(以毫秒为单位)。
示例请求 (c网址)
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}

填充经期模板

时间段模板包含多个宏,您必须为每个广告插播时间点替换这些宏。必须替换所有宏。未使用的宏应替换为空字符串 ("")。

说明 示例
$$pod-id$$ 此时间段所代表的广告连播的索引。对于同一 Pod,该值必须在所有观看者会话中匹配。 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$$ 经过网址编码的签名 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 直播。

其他资源