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 aufPOD_SERVING_REDIRECT
festgelegt sein.streamingFormat
: Lege den Wert aufHLS
oderDASH
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 EreignissesendDateTime
: Datum und Uhrzeit des geplanten Ereignisses. Dieses Attribut ist erforderlich, wennunlimitedEndDateTime
is false and ignored if
unlimitedEndDateTimeis 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:
|
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 wirdlast
: 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 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 |
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}&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id={a-stream-id}&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&scte35=$$scte35$$&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&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id=ç√&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&scte35=$$scte35$$&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&sd=5000&pd=30000&cust_params=&auth-token=&scte35=" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&pd=30000&cust_params=&auth-token=&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&sd=5000&pd=30000&cust_params=&auth-token=&scte35=$$scte35$$" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&pd=30000&cust_params=&auth-token=&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
- Pod-Auslieferung mit dem IMA SDK:
- Wiedergabe der Pod-Auslieferung mit der dynamischen Anzeigenbereitstellung API