Manifestbearbeitung für Livestreams

Die Pod Serving API bietet Zugriff auf codierte und konditionierte Anzeigensegmente. Sie werden so vorbereitet, dass sie direkt in eine für Nutzer sichtbare HLS eingefügt werden können. oder eine MPEG-DASH-Medienplaylist. Für MPEG-DASH bietet die Pod Serving API auch eine Manifestvorlage, um zusätzliche Informationen und Kontext für diese Anzeige bereitzustellen Segmente.

In diesem Leitfaden geht es um die Implementierung einer grundlegenden Manifestbearbeitung für die Pod-Auslieferung Server für Livestreams.

Voraussetzung: Livestream-Ereignisse in Google Ad Manager konfigurieren

Bevor Sie Anfragen über die API zur Pod-Auslieferung stellen, müssen Sie eine Anzeige erstellen Manager-Livestream-Ereignis für jeden von dir verarbeiteten Stream. Du kannst Livestream-Ereignisse über die LiveStreamEventService API oder die Google Ad Manager-Weboberfläche erstellen.

Damit eine Livestream-Veranstaltung mit der Pod Serving API verwendet werden kann, müssen Sie können verschiedene Attribute Ihres Ereignisses ausgefüllt werden:

  • customAssetKey: Eine benutzerdefinierte Kennung, die für dieses Ereignis verwendet werden soll. Muss für alle Ereignisse im Netzwerk eindeutig sein.
  • adTags: URL des primären Anzeigen-Tags, die im Ad Manager-Trafficking-Workflow generiert wurde.
  • dynamicAdInsertionType: Muss auf POD_SERVING_REDIRECT festgelegt sein.
  • streamingFormat: Lege den Wert auf HLS oder DASH fest.
  • segmentUrlAuthenticationKeyIds – mindestens eins HMAC-Schlüssel zum Signieren von Anfragen für Anzeigensegmente verwendet wird.
  • daiEncodingProfileIds: Eine Liste der für dieses Ereignis aktivierten DAIEncodingProfile-IDs.
  • startDateTime: Startdatum und -zeit des Ereignisses
  • endDateTime: Datum und Uhrzeit des geplanten Ereignisses. Dieses Attribut ist erforderlich, wenn unlimitedEndDateTimeis false and ignored ifunlimitedEndDateTimeis true.unlimitedEndDateTime` boolesch ist. Siehe oben.

Anfragen für Streamingmanifeste erhalten

Dein Manifest-Manipulator muss einen API-Endpunkt bereitstellen, um auf Manifestanfragen von der Videoplayer-Client-App zu warten. Dieser Endpunkt muss mindestens eine Stream-ID von der Client-Player-App erfassen und ein zusammengefügtes Stream-Manifest zurückgeben. Die Stream-ID wird verwendet, um die Streamingsitzung in Ad Manager zu identifizieren.

Sie müssen auch einige andere Informationen sammeln, um die entsprechenden z. B. eine Content-ID.

Beispiel für einen potenziellen Endpunkt für Manifestanfragen

GET /api/video/{asset_key}/manifest.{format}
Host: {your_domain}
Pfadparameter
asset_key Eine hypothetische ID, die dem angeforderten Livestream in deinem System entspricht.
format Ein hypothetischer Parameter, der dem Streamformat entspricht. Eine der folgenden Optionen:
mpd Für MPEG-DASH-Streams
m3u8 Für HLS-Streams
Abfrageparameter
stream_id Die Ad Manager-Stream-ID aus der Videoplayer-App des Clients.

Contentstream abrufen

Verwende die Content-ID, die aus der Manifestanfrage erfasst wurde, um den Inhaltsstream auszuwählen, der mit Anzeigen zusammengeführt werden soll.

Anzeigensegmente in den Inhaltsstream einfügen

Die URLs für zusammengeführte Anzeigensegmente unterscheiden sich je nach Streamformat.

HLS-Streams

HLS-Streams werden in der Regel als mehrvariantes Manifest bereitgestellt, das eine Reihe von Links zu Variantenmanifesten enthält, die den einzelnen Codierungsprofilen entsprechen.

Hinweis: Der Einfachheit halber wird in dieser Anleitung davon ausgegangen, dass deine HLS-Medien in einem Format codiert sind, bei dem Audio und Video in dieselbe Segmentdatei gemuxt werden.

Proxy-Playlists mit mehreren Varianten

Du musst jede Playlist-URL in der ursprünglichen Variante ersetzen Playlist mit einem weiteren Endpunktaufruf an den Manipulator, der die Manifest der ausgewählten Variante.

Bei den verbleibenden Schritten zum Zusammenfügen von HLS wird davon ausgegangen, dass ein einzelnes Variantenmanifest wird verarbeitet.

Beispiel eines potenziellen Variantenanfrageendpunkts
GET /api/video/{asset_key}/variant/{variant_id}.m3u8
Host: {your_domain}
Pfadparameter
asset_key Eine hypothetische ID, die dem angeforderten Livestream in deinem System entspricht.
variant Ein hypothetischer Parameter, der eine Kennung für die jeweilige Variante enthält verarbeitet wird.
Abfrageparameter
stream_id Die Ad Manager-Stream-ID aus der Videoplayer-App des Clients. die hier verwendet werden, eine Nutzersitzung mit der Manifestbearbeitung identifizieren.
Beispiel für ein unbehandeltes Manifest mit mehreren Varianten
#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
Beispiel für ein Proxy-Manifest mit mehreren Varianten
#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

Segmente für Werbeunterbrechungen ermitteln und Diskontinuitäten einfügen

Behalte beim Verarbeiten des Variantenmanifests den Beginn, die Dauer und den Index der nächsten Werbeunterbrechung im Auge, bis das verarbeitete dynamische Manifest Segmente enthält, die durch die Anzeigeninhalte ersetzt werden.

Werbeunterbrechungen können auf unterschiedliche Weise von Contentsegmenten abgegrenzt werden. an deinem Encoder. Eine gängige Methode zum Abgrenzen einer Werbeunterbrechung ist das Voranstellen der Anzeige mit einem #EXT-X-CUE-OUT-Tag und danach mit einem #EXT-X-CUE-IN-Tag.

Wenn du von Google gehostete Werbeunterbrechungen von deinen Inhaltssegmenten trennen möchtest, musst du am Anfang und Ende jeder Werbeunterbrechung #EXT-X-DISCONTINUITY-Tags einfügen. Wenn diese Diskontinuity-Tags erscheinen nicht im endgültigen Manifest, die Wiedergabe schlägt fehl.

Die eingefügten URIs für das Anzeigensegment sind unverschlüsselt. Wenn deine Inhalte verschlüsselt sind, musst du die Verschlüsselung auch entfernen. Gib dazu vor dem ersten Anzeigensegment jeder Werbeunterbrechung #EXT-X-KEY:METHOD=NONE an und füge sie nach der Werbeunterbrechung wieder hinzu.

Beispielmanifest (Original)
#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
Manifest mit eingefügten Unterbrechungen
#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

Anzeigen-Pod-Segmente verarbeiten

Für jedes Segment in einem Anzeigen-Pod müssen einige zusätzliche Werte erfasst werden:

  • segment_number: Segmentindex innerhalb des Anzeigen-Pods, beginnend mit null. Oder „init“ für das MP4-Initialisierungssegment.
  • segment_duration: Dauer des aktuellen Segments in Millisekunden. Dieses Wert sollte für alle Segmente mit Ausnahme des letzten im Pod gleich sein.
  • segment_offset: Segmentoffset, der berechnet wird, indem der Segmentoffset in Millisekunden zum Segmentoffset des vorherigen Segments addiert wird
  • last: Boolescher Wert, der das letzte Segment in einem Anzeigen-Pod identifiziert. Standardeinstellung: „false“.

URLs für Anzeigensegmente erstellen

Ersetzen Sie jedes Segment in der Werbeunterbrechung durch eine URL in folgendem Format:

/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)
Pfadparameter
network_code Das ist der Ad Manager 360-Netzwerkcode für das Netzwerk.
custom_asset_key Der im LiveStreamEventService angegebene Schlüssel für das benutzerdefinierte Livestream-Asset API oder auf der Livestream-Seite in der Weboberfläche von Ad Manager 360 aufrufen.
pod_identifier

Die folgenden Formate werden unterstützt:

pod/{integer}

Die numerische Kennung für die aktuelle Werbeunterbrechung. Anzeigen-Pod-IDs werden für jedes Werbeunterbrechungsereignis inkrementell zugewiesen, beginnend mit 1.

ad_break_id/{string}

Die String-ID der aktuellen Werbeunterbrechung.

profile_name Kennung für das angeforderte Profil,
segment_number Der Index dieses Segments im aktuellen Anzeigen-Pod, beginnend bei null.
Bei Verwendung eines MP4-Containers kann das ‑Segment angefordert werden, indem „segment_number“ auf „init“ gesetzt wird.
Abfrageparameter
stream_id Erforderlich Der stream_id-Parameter des Nutzers, der von der Stream-Erstellungsanfrage zurückgegeben wurde.
sd Erforderlich segment_duration
so Optional segment_offset

Wenn so fehlt, wird angenommen, dass alle vorherigen Segmente dieselbe Dauer haben und der Segmentversatz wird anhand segment_number und sd.

pd Erforderlich, außer bei Ereignissen, für die Werbeunterbrechungen ohne Dauer aktiviert sind Die Dauer der Werbeunterbrechung in Millisekunden. Auch als ad_pod_duration bezeichnet.
auth-token Erforderlich Ein signiertes, URL-codiertes HMAC-Token für diesen Anzeigen-Pod.
last Optional Boolescher Wert, der angibt, ob es sich um das letzte Segment in der Werbeunterbrechung handelt. Die Standardeinstellung ist "false".

Die Werte der Suchparameter müssen ordnungsgemäß codiert werden, damit sie URL-sicher sind. Dies ist ist für das Feld auth-token besonders wichtig, da es / enthalten könnte. + und = Zeichen.

Beispielmanifest (nach dem Ersetzen des Segments)
#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

Glückwunsch! Sie zeigen jetzt einen Livestream mit Anzeigensegmenten von die DAI Pod Serving API.

DASH-Streams

DASH-Streams werden als MPD-Datei bereitgestellt, die alle Streamcodierungen in einer einzigen Datei enthält. Die Inhalte werden als Reihe von Zeiträumen dargestellt.

Vorlage für den angefragten Zeitraum

Fordern Sie eine Zeitraumvorlage in Google Ad Manager an. Diese Vorlage wird zu Ihrem Zeitraum für die Werbeunterbrechung, nachdem die darin enthaltenen Makros mit Daten gefüllt wurden.

Sie sollten diese Vorlage nur einmal pro Streamsitzung anfordern und sie für in jeder Werbeunterbrechung wiederverwenden.

Zeitraumvorlage – Anfrageendpunkt
GET /linear/pods/v1/dash/network/{network_code}/custom_asset/{custom_asset}/pods.json
Host: dai.google.com
Content-Type: application/json
Pfadparameter
network_code Der Ad Manager 360-Netzwerkcode des Publishers.
custom_asset Der benutzerdefinierte Assetschlüssel des Livestream-Ereignisses in Google Ad Manager.
Abfrageparameter
stream_id Die Ad Manager-Stream-ID aus dem Videoplayer des Kunden
Antwort (JSON)
dash_period_template Der XML-String der Vorlage für den Zeitraum.
segment_duration_ms Die Dauer der einzelnen Anzeigenmediensegmente in der Vorlage für den Bindestrich-Zeitraum in Millisekunden.
Beispielanfrage (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
Beispielantwort
{"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}

Periodenvorlage ausfüllen

Die Zeitraum-Vorlage enthält mehrere Makros, die Sie für jede Anzeige ersetzen müssen. Pause einfügen. Alle Makros müssen ersetzt werden. Nicht verwendete Makros müssen durch ein Leerer String ("").

Macro Beschreibung Beispiel
$$pod-id$$ Der Index des Anzeigen-Pods, den dieser Zeitraum darstellt. Dieser Wert muss für denselben Pod in allen Zuschauersitzungen übereinstimmen. 1
$$period-start$$ Der Zeitpunkt, zu dem der Zeitraum in der aktuellen MPD-Datei beginnt. Optionales Attribut der durch start="###" ersetzt werden soll, wobei ### ist der Beginn der Präsentation, zu der die Werbeunterbrechung beginnt. Wenn Der Beginn des Zeitraums ist nicht angegeben. Dieses Makro muss ersetzt werden. mit einem leeren String. start="PT2H33M30S"
$$period-duration$$ Die Dauer des gesamten Anzeigenzeitraums. Ein optionales Attribut, das durch duration="###" ersetzt werden sollte. ### ist die Dauer des Anzeigenzeitraums im standardmäßigen DASH-Dauerformat. Wenn die Dauer des Zeitraums nicht angegeben ist, sollte dieses Makro durch einen leeren String ersetzt werden. duration="PT15S"
$$pod-duration$$ Die voraussichtliche Dauer der Anzeigen, für die eine Entscheidung für diesen Anzeigen-Pod getroffen werden soll, in Millisekunden. 15000
$$number-of-repeated-segments$$ Dieser Wert wird berechnet, indem die Dauer des Anzeigenzeitraums geteilt wird (in Millisekunden) durch den Wert von segment_duration_ms und gerundet auf die nächste ganze Zahl. 3
$$cust_params$$ Dieses Makro kann durch benutzerdefinierte Targeting-Parameter ersetzt werden, die aktuelle Werbeunterbrechung. bereitgestellt. Der Wert muss folgendes Format haben: in diesem Ad Manager-Leitfaden Hilfeartikel: Wenn keine benutzerdefinierten Parameter erforderlich sind, sollte dieses Makro durch einen leeren String ersetzt werden. &cust_params=section%3Dblog%26anotherKey%3Dvalue1%2Cvalue2
$$scte35$$ Dieses Makro muss durch einen eindeutigen scte35-Wert für diese Werbeunterbrechung ersetzt werden, sofern ein solcher Wert angegeben ist. Wenn keine scte35-Informationen benötigt werden, sollte dieses Makro durch einen leeren String ersetzt werden. /DAqAAAAAAAA///wDwVAAAT2f0/+ecF1mQABC/8ACgAIQ1VFSQAAAAsuZVlR
$$token$$ Eine signierte, URL-codierte HMAC-Token Dieses Token ist erforderlich. custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D6a8c44c72e4718ff63ad2284edf2a8b9e319600b430349d31195c99b505858c9
Vorlage für Rohzeitraum, die Makros enthält
<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>
Zeitraum, in dem Anzeigen ausgeliefert wurden
<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>

Zeitraum in das DASH-Manifest einfügen

Ersetzen Sie abschließend den entsprechenden Zeitraum in Ihrem Rohmanifest durch den neu ausgefüllten Anzeigenzeitraum und geben Sie das endgültige zusammengeführte Manifest zur Wiedergabe an den anfragenden Videoclient zurück.

Beispiel für das Manifest der Rohinhalte
<?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>
Beispiel für ein zusammengeführtes Manifest
<?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>

Glückwunsch! Du überträgst jetzt einen DASH-Livestream mit Anzeigensegmenten, die von der DAI Pod Serving API bereitgestellt werden.

Zusätzliche Ressourcen