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 birleştirilebilecek şekilde hazırlanan uyarlanabilir bit hızına sahip video reklam kapsüllerine erişim sağlar.

Bu rehber, VOD akışları için temel bir Kapsül Yayınlama manifest değiştirme sunucusu uygulamaya 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ç nokta, en azından istemci oynatıcı uygulamasından bir akış kimliği toplamalıdır. Bu akış kimliği, reklam kapsülü isteklerinizde Ad Manager yayın oturumunu tanımlamak için kullanılır.

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. Aşağıdakilerden 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.

İstek reklam kapsülü manifestleri

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ğinizde ne zaman ve nereye eklenmesi gerektiği hakkında bilgileri 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ından alınan 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. Ayrıntılar için aşağıya bakın

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

ad_tag Required VMAP reklamları istemek için kullanılan bir 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.
dai_options Optional Manifestlerin oluşturulma biçimini kontrol eden ek seçenekler. Ayrıntılar için aşağıya bakı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 Bu kodlama profili tarafından açıklanan akışın 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 şunlardır: 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. Ayrıntılar için aşağıya bakın
subtitle_settings Optional Kodlama profilinde altyazı varsa gereklidir. Ayrıntılar için aşağıya bakı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 bir tam sayı.
frames_per_second Required Videonun kayan nokta FPS'sidir.
resolution Required Piksel cinsinden video "width" ve "height" değerlerini içeren JSON kodlu bir değer.

Ö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 bir tam sayı.

Örnek: 300000

channels Required Düşük frekanslı kanallar da dahil olmak üzere ses kanallarının sayısını temsil eden tam sayı.
sample_rate Required Hertz ses örnekleme hızını temsil eden tam sayı.

Örnek: 4800

Altyazı ayarları
format Required Grup içi altyazıların kullandığı dosya biçimi. webvtt veya ttml değerleri desteklenir.
language Optional RFC5646 dil dizesi olarak altyazı dili. Sağlanması durumunda bu değer yalnızca DASH oluşturma 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.

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

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

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 oturumları 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 yyyy-MM-dd'T'hh:mm:ss.sssssssss[+|-]hh:mm biçiminde, ISO8601 tarih ve saat dizesi olarak geçerli olacağı 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şlenmesi.
mpd_uri Yalnızca DASH akışları için. DASH MPD'sinin URI'si.
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 saniye 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 başvurulan request_body.json içeriğinin 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ızla 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 kesin ayrıntıları, işletmenizin ihtiyaçlarına ve içerik akışlarınıza göre 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 ayrı akış manifestlerine yönlendiren bağlantılardan oluşan 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ırlamak ve bunları 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 manifestlerin bağlantıları grubudur.

Kodlama profilleri üzerinde yinele

Her kodlama profili için Ad Manager'ın yanıtından ilişkili tüm reklam kapsülü manifestlerini ve ilişkili başlangıç zamanlarını 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
Örnek toplanan 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 ekleyin

Her varyant akışı için içerik manifestinin segmentlerini gözden geçirin ve geçen içerik süresini toplamını koruyun. Bir reklam kapsülünün başlangıç konumuna geldiğinizde reklam kapsülünün manifest dosyasından segment listesini çıkarın, segment listesini iki #EXT-X-DISCONTINUITY etiketiyle sarmalayın ve listeyi içerik manifestinde 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 spesifikasyonun özelliklerine bağlı olarak, medya dizisi 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 onarıldıktan sonra kullanıcıya özel her varyant manifestini barındırma için CDN'nize aktarın.

Content manifest'iniz şifrelenmişse mevcut 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 her reklam kapsülünden sonra ilk içerik segmentinden önce depolanan #EXT-X-KEY etiketinin bir kopyasını eklemeniz gerekir.

Örnek toplanan 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, elde edilen birleştirilmiş varyant manifesti olur, CDN'ye aktarılır ve https://cdn.{...}/{userid}/1080p.m3u8 adresinde barındırılır.

#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şturma

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 derleyin. Bu kullanıcıya özel manifest, 1. adımda aldığınız manifest isteğine yanıt olarak döndürülür.

Örnek nihai ç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'ye kıyasla 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 nokta dizisi içeren bir MPD dosyasıdır.

Bu MPD dosyalarını birleştirmek için her reklam kapsülünün başlangıç zamanlarını not ederek 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, videodan sonra gösterilen reklam kapsülü dönemlerini tüm içerik dönemlerinden sonra ekleyin. İşlenen tüm içerik dönemleri için geçen oynatma süresini takip ederek içerik MPD'sindeki dönemler boyunca tekrarlayı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, videonun ortasında gösterilen reklam kapsülünün eşleşen MPD dosyasındaki noktaları bu sınıra ekleyin.

Birleştirilmiş nihai MPD dosyası, MPEG_DASH teknik özelliklerine tam olarak uygun olmalıdır. Bu nedenle, dönem başlangıç zamanlarını düzeltmek, medya sunumu süresini yeni eklenen reklam dönemlerini hesaba katacak şekilde düzeltmek ve birleştirme işleminde ortaya çıkabilecek diğer çakışmaları gidermek için 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'u

[{
  "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'sindeki mpd_uri içeriğinin 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ış manifest isteğine yanıtınız olarak sunun.

<?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