VOD akışları için manifest düzenleyici

Kapsül Yayınlama API'si, doğrudan kullanıcının gördüğü HLS veya MPEG-DASH medya oynatma listesine eklenebilecek şekilde hazırlanan uyarlanabilir bit hızı video reklam kapsüllerine erişim sağlar.

Bu rehber, VOD akışları için temel bir Kapsül Yayınlama manifest düzenleme sunucusunun uygulanmasına odaklanmıştır.

Akış manifesti isteklerini alma

Manifest düzenleyiciniz, video oynatıcı istemci uygulamasından gelen manifest isteklerini dinlemek için bir API uç noktası sağlamalıdır. Bu uç noktanın en azından istemci oynatıcı uygulamasından bir akış kimliği toplaması gerekir. Bu akış kimliği, reklam kapsülü isteklerinizde Ad Manager'a yapılan akış oturumunu tanımlamak için kullanılır.

Ayrıca, uygun içerik akışını tanımlamak için Content ID gibi başka bilgiler de toplamanız gerekir.

Örnek manifest isteği uç noktası

GET /api/stream_id/{stream_id}/video/{content_id}.{format}
Host: {your_domain}
Yol parametreleri
stream_id İstemci video oynatıcı uygulamasındaki Ad Manager akış kimliği.
content_id Sisteminizdeki içerik videosuna karşılık gelen varsayımsal bir kimlik.
format Akış biçimine karşılık gelen varsayımsal bir parametre. Şunlardan biri:
mpd MPEG-DASH akışları için
m3u8 HLS akışları için

İçerik akışını alma

Reklamlarla birleştirilecek içerik akışını seçmek için manifest isteğinden toplanan Content ID'yi kullanın.

Reklam kapsülü manifestlerini isteme

Ad Manager'dan reklam istemek için sunucunuz istenen kodlama profillerini, reklam etiketini ve hedefleme parametrelerini ileterek reklam kapsülleri uç noktasına POST isteği göndermelidir. Bu istek, 1. adımda topladığınız akış kimliğini de içerir.

Bunun karşılığında, yayıncının reklam etiketi tarafından istenen reklam kapsülleri için manifest dosyalarını ve bunların içeriğinize ne zaman ve nereye eklenmesi gerektiği hakkında bilgi içeren reklam kapsülü nesnelerinin bir listesini alırsınız.

POST /ondemand/pods/api/v1/network/{network_code}/streams/{stream_id}/adpods
Host: dai.google.com
Content-Type: application/json
Yol parametreleri
network_code Yayıncının Ad Manager 360 ağ kodu.
stream_id İstemci video oynatıcı uygulamasındaki akış kimliği.

JSON gövdesi

Gövde parametreleri
encoding_profiles Required Her reklam arası için almak istediğiniz kodlama profillerinin JSON temsillerinin listesi. Aşağıdaki ayrıntılara göz atın

Oynatmanın mümkün olduğunca sorunsuz olması için bu, içerik akışınızda kullanılan kodlama profilleri grubuyla eşleşmelidir.

ad_tag Required VMAP reklamları istemek için kullanılan reklam etiketi.
cuepoints Optional İçerik akışında, videonun ortasında gösterilen reklam aralarının ekleneceği işaret noktalarının listesi. İşaret noktaları, kayan nokta saniye cinsinden ölçülür.

Yalnızca konumsal zaman ofsetleri kullanan videonun ortasında gösterilen reklamlar içeren VMAP yanıtları için gereklidir. Bu yaygın bir durumdur.

content_duration_seconds Optional Saniye cinsinden içerik süresi.

Yalnızca percentage zaman farkını kullanan videonun ortasında gösterilen reklamlar içeren VMAP yanıtları için gereklidir. Bu yaygın bir durumdur.

manifest_type Optional İstenen reklam akışlarının biçimi (hls veya dash). Varsayılan değer hls değeridir.
dai_options Optional Manifestlerin oluşturulma biçimini kontrol eden ek seçenekler. Aşağıdaki ayrıntılara göz atın
Kodlama profili
profile_name Required Bu Kodlama Profili için bir tanımlayıcı. Bu değer, seçtiğiniz herhangi bir dize olabilir. Ancak aynı akışta aynı ada sahip birden fazla kodlama profiliniz olamaz.
type Required Akışın, bu kodlama profili tarafından açıklanan kodlama türü. İçerik türleri şunlardır: media, iframe, subtitles.
container_type Required Bu kodlama profili tarafından kullanılan kapsayıcı biçimi. Kapsayıcı biçimleri: mpeg2ts, fmp4cmaf, hls_packed_audio
video_settings Optional Kodlama profili türü iframe ise gereklidir. Aksi takdirde, yalnızca medya türü video içeriyorsa izin verilir. Aşağıdaki ayrıntılara göz atın
audio_settings Optional Kodlama profilinde ses varsa gereklidir. Yalnızca tür medyaysa izin verilir. Aşağıdaki ayrıntılara göz atın
subtitle_settings Optional Kodlama profilinde altyazı varsa gereklidir. Aşağıdaki ayrıntılara göz atın
Video ayarları
codec Required RFC6381 codec dizesi.

Örnek: avc1.4d000c

bitrate Required Bu profilin maksimum video bit hızını bayt/saniye cinsinden temsil eden tam sayı.
frames_per_second Required Videonun kayan nokta FPS'sidir.
resolution Required Piksel cinsinden video "width" ve "height" değerlerini içeren JSON olarak kodlanmış bir değerdir.

Örnek: {"width": 640, "height": 320}

Ses ayarları
codec Required RFC6381 codec dizesi.

Örnek: mp4a.40.5

bitrate Required Bu profilin maksimum ses bit hızını bayt/saniye cinsinden temsil eden tam sayı.

Örnek: 300000

channels Required Düşük frekanslı kanallar da dahil olmak üzere ses kanallarının sayısını temsil eden bir tam sayıdır.
sample_rate Required Ses örnekleme hızını hertz cinsinden temsil eden tam sayı.

Örnek: 4800

Altyazı ayarları
format Required Bant içi altyazılar tarafından kullanılan dosya biçimi. webvtt veya ttml değerleri desteklenir.
language Optional RFC5646 dil dizesi olarak altyazı dili. Sağlanması halinde bu değer yalnızca DASH oluşturma işlemi için kullanılır.

Örnek: en-us

DAI seçenekleri
dash_profile Optional Reklam kapsülü manifestlerine uygulanacak MPEG-DASH profili. Bu ayar yalnızca DASH manifestleri için kullanılır. live veya on-demand değerlerine izin verilir. Varsayılan değer on-demand değeridir.

live değeri, MPEG-DASH profiline karşılık gelir "urn:mpeg:dash:profile:isoff-live:2011".

on-demand değeri, MPEG-DASH profiline karşılık gelir urn:mpeg:dash:profile:isoff-on-demand:2011.

ad_pod_timeout Optional Reklamları seçmek ve reklam kapsülleri oluşturmak için harcanacak maksimum süre (kayan nokta saniye cinsinden). Bu süre geçtikten sonra Ad Manager, ad_pods yanıtında seçili olan tüm reklamları döndürür ve işlemeyi durdurur.
sam_id Optional Akış etkinliği izleyicisinde oturum aramak için kullanılabilecek alternatif bir hata ayıklama anahtarı belirtir.

Yanıt

Yanıt parametreleri
valid_for Bu reklam kapsülü oynatma listelerinin, dhms (gün, saat, dakika, saniye) biçiminde geçerli olduğu süre.
valid_until Bu reklam kapsülü oynatma listelerinin ISO8601 tarih ve saat dizesi olarak geçerli olacağı yyyy-MM-dd'T'hh:mm:ss.sssssssss[+|-]hh:mm biçiminde geçerli tarih ve saat.
ad_pods Bu akış için seçilen reklam kapsüllerinin listesi.
Reklam kapsülü
manifest_uris Yalnızca HLS akışları için. Kodlama profili kimliklerinin HLS manifest URI'leriyle eşleşmesi.
mpd_uri Yalnızca DASH akışları için. DASH MPD'nin URI'sı.
type Reklam kapsülünün türü. Reklam kapsülü türleri şunlardır: pre, mid veya post.
start Yalnızca videonun ortasında gösterilen reklam kapsülleri için. Kayan nokta cinsinden, akışta bu reklam kapsülünün eklenmesi gereken konum.
duration Bu reklam kapsülünün kayan nokta saniye cinsinden süresi.
midroll_index Yalnızca videonun ortasında gösterilen reklam kapsülleri için. Videonun ortasında gösterilen geçerli reklam kapsülünün dizini. Dizine ekleme işlemi 1 ile başlar.

Örnek istek (cURL)

curl -X POST \
     -d '@request-body.json' \
     -H 'Content-Type: application/json' \
  https://dai.google.com/ondemand/pods/api/v1/network/21775744923/streams/6e69425c-0ac5-43ef-b070-c5143ba68541:CHS/adpods

Örnek istek gövdesi

Bu, yukarıdaki cURL çağrısında referans verilen request-body.json öğesinin içeriğidir.

{
  "encoding_profiles": [
   {
     "profile_name": "1080p",
     "type": "media",
     "container_type": "mpeg2ts",
     "video_settings": {
       "codec": "avc1.4d000c",
       "bitrate": 5000000,
       "frames_per_second": 30.0,
       "resolution": {
         "width": 1920,
         "height": 1080
       }
     },
     "audio_settings": {
       "codec": "mp4a.40.5",
       "bitrate": 300000,
       "channels": 2,
       "sample_rate": 48000
     }
   },
   {
     "profile_name": "360p",
     "type": "media",
     "container_type": "mpeg2ts",
     "video_settings": {
       "codec": "avc1.4d000d",
       "bitrate": 1000000,
       "frames_per_second": 30.0,
       "resolution": {
         "width": 640,
         "height": 360
       }
     },
     "audio_settings": {
       "codec": "mp4a.40.5",
       "bitrate": 64000,
       "channels": 2,
       "sample_rate": 48000
     }
   },
   {
     "profile_name": "subtitles-webvtt",
     "type": "subtitles",
     "subtitle_settings": {
       "format": "webvtt"
     }
   }
 ],
 "ad_tag": "https://pubads.g.doubleclick.net/gampad/ads?...",
 "manifest_type": "hls"
}

Örnek yanıt

{
  "valid_for": "8h0m0s",
  "valid_until": "2023-03-24T08:30:26.839717986-07:00",
  "ad_pods": [
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/0/profile/1080p.m3u8",
        "360p": "https://{...}/pod/0/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/0/profile/subtitles-en.vtt"
      },
      "type": "pre",
      "duration": 10.0
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/1/profile/1080p.m3u8",
        "360p": "https://{...}/pod/1/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/1/profile/subtitles-en.vtt"
      },
      "type": "mid",
      "start": 15.0,
      "duration": 15.0,
      "midroll_index": 1
    },
    {
      "manifest_urls":{
        ]"1080p": "https://{...}/pod/2/profile/1080p.m3u8",
        "360p": "https://{...}/pod/2/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/0/profile/subtitles-en.vtt""
      },
      "type": "post",
      "duration": 10.0
    }
  ]
}

Reklam kapsüllerini içerikte birleştirme

Reklam kapsüllerini içerik akışlarınıza birleştirme süreci uygulamanıza, akış biçimine ve biçimin spesifikasyonlarından hangi özellikleri uygulamayı seçtiğinize bağlı olarak değişir. Aşağıdaki iş akışları, bu sürecin nasıl ele alınacağına dair önerilerdir. Uygulamanızın tam ayrıntıları, iş gereksinimlerinize ve içerik akışlarınıza bağlı olarak değişiklik gösterebilir.

HLS akışları

Akışı HLS biçiminde birleştiriyorsanız içerik akışınız, her kodlama profili için bir tane olmak üzere, ayrı akış manifestlerine yönlendiren bağlantıların yer aldığı bir çok değişkenli oynatma listesi olur. Reklam kapsüllerinizin, bu varyant manifestlerin her birine eklenmesi gerekir. Bunu yapmanın bir yolu, tüm varyant manifestlerini hazırlayıp barındırma için bir İçerik Yayınlama Ağı'na (CDN) iletmektir. Son çok değişkenli oynatma listesi, CDN tarafından barındırılan bu manifestlere bir bağlantı kümesidir.

Kodlama profilleri üzerinde yineleme

Her kodlama profili için Ad Manager'ın yanıtından ilişkili tüm reklam kapsülü manifestlerini, ilişkili başlangıç zamanlarıyla birlikte toplayın. Videodan önce gösterilen reklam kapsülleri için başlangıç zamanını 0 olarak ayarlayın. Videodan sonra gösterilen reklamlar için içeriğin süresini reklam kapsülünün başlangıç zamanı olarak kullanın. Çok değişkenli oynatma listesinde her kodlama profilinin ses ve video ayarlarıyla eşleşen varyant akışını belirleyin.

Örnek reklam kapsülleri dizisi
"ad_pods": [
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/0/profile/1080p.m3u8",
        "360p": "https://{...}/pod/0/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/0/profile/subitles-en.vtt"
      },
      "type": "pre",
      "duration": 10.0
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/1/profile/1080p.m3u8",
        "360p": "https://{...}/pod/1/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/1/profile/subitles-en.vtt"
      },
      "type": "mid",
      "start": 15.0,
      "duration": 15.0,
      "midroll_index": 1
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/2/profile/1080p.m3u8",
        "360p": "https://{...}/pod/2/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/2/profile/subitles-en.vtt"
      },
      "type": "post",
      "duration": 10.0
    }
  ]
Örnek çok değişkenli içerik oynatma listesi
#EXTM3U
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs0",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="https://{...}/subitles-en.vtt"
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://{...}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://{...}/360p.m3u8
Toplanan örnek varyant verileri
Encoding profile: "1080p"
Profile settings: {...}
Content manifest: https://{...}/1080p.m3u8
Ad pods (start time -> manifest):
    0 -> https://{...}/pod/0/profile/1080p.m3u8
   15 -> https://{...}/pod/1/profile/1080p.m3u8
  600 -> https://{...}/pod/2/profile/1080p.m3u8

Her varyant manifestine reklam ekle

Her varyant akışı için içerik manifestinin segmentlerini inceleyerek geçen içerik süresinin toplamını koruyun. Bir reklam kapsülünün başlangıç konumuna geldiğinizde reklam kapsülünün manifest dosyasından segmentlerin listesini çıkarın, segment listesini iki #EXT-X-DISCONTINUITY etiketiyle sarmalayın ve listeyi içerik manifestindeki geçerli konuma ekleyin. Tüm reklam kapsülleri ve varyant akışları işlenene kadar bu işleme devam edin.

Ortaya çıkan manifestler HLS standardına uygun olmalıdır. Bu nedenle, içerik manifestinizin içerdiği spesifikasyona bağlı olarak, medya adım sırası numaralarını, içerik süresini, süreksizlik sıra numaralarını ve yeni reklam segmentlerini dikkate almak için güncellenmesi gereken diğer etiketleri düzeltmek için birleştirilmiş manifest üzerinden son bir geçiş yapmanız gerekebilir. Standartla olan tutarsızlıklar düzeltildikten sonra kullanıcıya özel her bir varyant manifestini barındırma için CDN'nize aktarın.

Content manifest dosyanız şifrelenmişse geçerli reklam kapsülünün başlangıcından önce bulunan son şifreleme anahtarını bir #EXT-X-KEY etiketinde depolamanız gerekir. Ardından, her reklam kapsülünün ilk segmentinden önce şifrelemeyi kaldırmak için #EXT-X-KEY:METHOD=NONE etiketini eklemeniz gerekir. Son olarak, içerik şifrelemesini geri yüklemek için depolanan #EXT-X-KEY etiketinin bir kopyasını her reklam kapsülünden sonra gelen ilk içerik segmentinin önüne eklemeniz gerekir.

Toplanan örnek varyant verileri
Encoding profile: "1080p"
Content manifest: https://{...}/1080p.m3u8
Ad pods (start time -> manifest):
    0 -> https://dai.google.com/{...}pod/0/profile/1080p.m3u8
   15 -> https://dai.google.com/{...}pod/1/profile/1080p.m3u8
  600 -> https://dai.google.com/{...}pod/2/profile/1080p.m3u8
Örnek içerik manifesti

Bu, toplanan varyant verilerinde listelenen https://{...}/1080p.m3u8 manifestinin içeriğidir.

#EXTM3U
{...}
#EXTINF:5.000,
https://{...}/1080p/content-segment-0.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-1.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-2.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-3.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-4.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-5.ts
{...}
Örnek reklam kapsülü manifesti

Bu, toplanan varyant verilerinde listelenen https://dai.google.com/{...}/pod/1/profile/1080p.m3u8 manifestinin içeriğidir.

#EXTM3U
{...}
#EXTINF:5.000,
https://dai.google.com/{...}/0.ts
#EXTINF:5.000,
https://dai.google.com/{...}/1.ts
#EXTINF:5.000,
https://dai.google.com/{...}/2.ts
Birleştirilmiş varyant manifesti örneği

Bu, CDN'ye iletilen ve https://cdn.{...}/{userid}/1080p.m3u8 adresinde barındırılan birleştirilmiş varyant manifestidir.

#EXTM3U
{...}
#EXTINF:5.000,
https://{...}/1080p/content-segment-0.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-1.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
https://dai.google.com/{...}/0.ts
#EXTINF:5.000,
https://dai.google.com/{...}/1.ts
#EXTINF:5.000,
https://dai.google.com/{...}/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
https://{...}/1080p/content-segment-3.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-4.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-5.ts
{...}

Çok değişkenli oynatma listesi oluştur

Tamamlanan her varyant manifesti için CDN adreslerini, eşleşen kodlama profili ayrıntılarıyla birlikte toplayın ve sonuçları yeni bir çok değişkenli manifestte bir araya getirin. Bu kullanıcıya özel manifest, 1. adımda aldığınız manifest isteğine yanıt olarak döndürülür.

Örnek son çok değişkenli oynatma listesi
#EXTM3U
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs0",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="https://cdn.{...}-subitles-en.vtt"
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/{userid}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://cdn.{...}/{userid}/360p.m3u8

MPEG DASH akışları

MPEG DASH biçiminde bir akışı birleştiriyorsanız yalnızca tek bir dosya oluşturmanız gerekir. Bu, DASH akışlarının birleştirilmesini HLS'den daha kolay hale getirebilir.

Düzgün şekilde hazırlanmış bir MPEG DASH medya sunumu açıklama (MPD) dosyası, her biri birden fazla temsil içeren birkaç noktadan oluşmalıdır. Her temsil, kodlama profillerinizden biriyle eşleşmelidir. Ad Manager'dan döndürülen her reklam kapsülü, aynı zamanda eşleşen gösterimlere sahip bir dizi nokta içeren bir MPD dosyasıdır.

Bu MPD dosyalarını birleştirmek için her reklam kapsülünün başlangıç zamanını not alarak başlayın. Videodan önce gösterilen reklam için videodan önce gösterilen reklam kapsül dönemlerini herhangi bir içerik döneminden önce ekleyin. Videodan sonra gösterilen reklamlar için tüm içerik dönemlerinden sonra videodan sonra gösterilen reklam kapsülü dönemlerini ekleyin. İşlenen tüm içerik dönemleri için geçen oynatma süresini takip ederek içerik MPD'sindeki dönemler boyunca yineleme yapın. Reklam kapsülünün başlangıç zamanına karşılık gelen dönemler arasında bir sınıra ulaştığınızda, noktaları bu sınıra videonun ortasında gösterilen reklam kapsülünün MPD dosyasından ekleyin.

Birleştirilmiş nihai MPD dosyası, MPEG_DASH spesifikasyonlarına tamamen uygun olmalıdır. Bu nedenle, dönem başlangıç zamanlarını düzelterek, medya sunumu süresini yeni eklenen reklam dönemlerini hesaba katacak şekilde düzelterek ve birleştirme işleminden kaynaklanabilecek diğer tüm çakışmaları gidererek son dosyayı bir kez daha yinelemeniz gerekebilir.

Örnek içerik MPD'si

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H10M00.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Example Stream</Title>
  </ProgramInformation>
  <Period duration="PT0H0M15.000S" id="content-period-1">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-2">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-3">
    ...
  </Period>
  ...
</MPD>

Örnek reklam kapsülü JSON dosyası

[{
  "mpd_uri": "https://{...}pod/1.mpd",
  "type": "mid",
  "start": 15.0,
  "duration": 15.0,
  "midroll_index": 1
}]

Örnek reklam kapsülü MPD'si

Bu, yukarıdaki reklam kapsülü JSON dosyasının mpd_uri içeriğidir.

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H0M15.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Ad Pod 1</Title>
  </ProgramInformation>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-2">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-3">
    ...
  </Period>
  ...
</MPD>

Birleştirilmiş MPD örneği

Bunu ilk akış manifesti isteğine yanıt olarak kullanın.

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H10M15.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Example Stream</Title>
  </ProgramInformation>
  <Period duration="PT0H0M15.000S" id="content-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-2">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-3">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-2">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-3">
    ...
  </Period>
  ...
</MPD>

Ek kaynaklar