Die Pod Serving API bietet Zugriff auf codierte und konditionierte Anzeigensegmente, die so vorbereitet sind, dass sie direkt in eine für den Nutzer sichtbare HLS- oder MPEG-DASH-Medienplaylist eingefügt werden können. Für MPEG-DASH bietet die Pod Serving API auch eine Manifestvorlage mit zusätzlichen Informationen und Kontext für diese Anzeigensegmente.
In diesem Leitfaden geht es um die Implementierung eines grundlegenden Servers zur Manifestbearbeitung für die Pod-Bereitstellung für Livestreams.
Voraussetzung: Livestream-Ereignisse in Google Ad Manager konfigurieren
Bevor Sie Anfragen über die Pod Serving API senden, müssen Sie für jeden verarbeiteten Stream ein Ad Manager-Livestream-Ereignis erstellen. Sie können ein Livestream-Ereignis über den LiveStreamEventService API
oder die Google Ad Manager-Weboberfläche erstellen.
Damit ein Livestream-Ereignis mit der Pod Serving API verwendet werden kann, müssen Sie mehrere Attribute des Ereignisses angeben:
customAssetKey
: eine benutzerdefinierte Kennung, die für dieses Ereignis verwendet werden soll. Muss für alle Ereignisse im Netzwerk eindeutig sein.adTags
: Die URL des primären Anzeigen-Tags, die mit dem Trafficking-Workflow in Ad Manager generiert wird.dynamicAdInsertionType
: Muss aufPOD_SERVING_REDIRECT
festgelegt werden.streamingFormat
: Legen Sie entsprechendHLS
oderDASH
fest.segmentUrlAuthenticationKeyIds
: mindestens ein HMAC-Schlüssel, der zum Signieren von Anfragen für Anzeigensegmente verwendet wirddaiEncodingProfileIds
: Eine Liste der DAIEncodingProfile-IDs, die für dieses Ereignis aktiviert sind.startDateTime
: Startdatum und -zeit des EreignissesendDateTime
: Das geplante Enddatum und die Uhrzeit für diesen Termin. Dieses Attribut ist erforderlich, wennunlimitedEndDateTime
is false and ignored if
unlimitedEndDateTimeis true.
unlimitedEndDateTime` – boolescher Wert ist. Siehe oben.
Stream-Manifestanfragen erhalten
Die Manifestbearbeitung muss einen API-Endpunkt bereitstellen, um Manifestanfragen von der Videoplayer-Client-App zu erfassen. Dieser Endpunkt muss mindestens eine Stream-ID aus der Client-Player-App erfassen und ein kombiniertes Stream-Manifest zurückgeben. Die Stream-ID wird verwendet, um die Streamingsitzung für Ad Manager zu identifizieren.
Außerdem musst du einige weitere Informationen erfassen, um den entsprechenden Contentstream zu identifizieren, z. B. eine Content ID.
Beispiel eines potenziellen Endpunkts für Manifestanfragen
GET /api/video/{asset_key}/manifest.{format}
Host: {your_domain}
Pfadparameter | |||||
---|---|---|---|---|---|
asset_key |
Eine hypothetische ID, die dem angeforderten Livestream in Ihrem System entspricht. | ||||
format |
Hypothetischer Parameter, der dem Streamformat entspricht. Eine der folgenden Möglichkeiten:
|
Abfrageparameter | |
---|---|
stream_id |
Die Ad Manager-Stream-ID aus der Videoplayer-App des Clients. |
Contentstream abrufen
Verwenden Sie die Content ID aus der Manifestanfrage, um den Contentstream auszuwählen, der mit Anzeigen kombiniert werden soll.
Anzeigensegmente an Contentstream senden
Die hinzugefügten URLs von Anzeigensegmenten unterscheiden sich je nach Streamformat.
HLS-Streams
HLS-Streams werden in der Regel als Manifest für mehrere Varianten bereitgestellt, das eine Reihe von Links zu Variantenmanifesten enthält, die den einzelnen Codierungsprofilen entsprechen.
Hinweis: Der Einfachheit halber wird in diesem Leitfaden davon ausgegangen, dass Ihre HLS-Medien in einem Format codiert sind, das Audio und Video in dieselbe Segmentdatei muxt.
Proxy-Playlists mit mehreren Varianten
Sie müssen jede Playlist-URL mit Varianten in der ursprünglichen Playlist mit mehreren Varianten durch einen anderen Endpunktaufruf an die Manipulator ersetzen, damit das vom Player ausgewählte Variantenmanifest verarbeitet wird.
Bei den verbleibenden Schritten zum Stitching von HLS wird davon ausgegangen, dass ein einzelnes Variantenmanifest verarbeitet wird.
Beispiel eines potenziellen Endpunkts für Variantenanfragen
GET /api/video/{asset_key}/variant/{variant_id}.m3u8
Host: {your_domain}
Pfadparameter | |
---|---|
asset_key |
Eine hypothetische ID, die dem angeforderten Livestream in Ihrem System entspricht. |
variant |
Ein hypothetischer Parameter, der eine Kennung für die spezifische Variante enthält, die verarbeitet wird. |
Abfrageparameter | |
---|---|
stream_id |
Die Ad Manager-Stream-ID aus der Client-Videoplayer-App, die hier verwendet wird, um eine Nutzersitzung mit der Manifestbearbeitung zu identifizieren. |
Beispiel für ein nicht verarbeitetes 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 Manifest für mehrere Varianten per Proxy
#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 identifizieren und Unterbrechungen einfügen
Behalten Sie bei der Verarbeitung des Variantenmanifests die Startzeit, die Dauer und den Index der nächsten anstehenden Werbeunterbrechung im Blick, bis das verarbeitete dynamische Manifest Segmente enthält, die durch den Anzeigeninhalt ersetzt werden.
Werbeunterbrechungen können je nach Encoder auf unterschiedliche Weise von Inhaltssegmenten getrennt werden. Eine gängige Methode zum Festlegen einer Werbeunterbrechung besteht darin, den Anzeigensegmenten ein #EXT-X-CUE-OUT
-Tag voranzustellen und danach ein #EXT-X-CUE-IN
-Tag zu setzen.
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 Diskontinuitäts-Tags nicht im endgültigen Manifest vorkommen, schlägt die Wiedergabe fehl.
Die eingefügten Anzeigensegment-URIs sind unverschlüsselt. Wenn Ihr Inhalt verschlüsselt ist, müssen Sie die Verschlüsselung außerdem entfernen. Geben Sie dazu vor dem ersten Anzeigensegment jeder Werbeunterbrechung #EXT-X-KEY:METHOD=NONE
an und fügen Sie die Verschlüsselung 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 Diskontinuitäten eingefügt
#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 Sie einige zusätzliche Werte erfassen:
segment_number
: Segmentindex im Anzeigen-Pod, beginnend mit null. Oder „init“ für das MP4-Initialisierungssegment.segment_duration
: Dauer des aktuellen Segments in Millisekunden. Dieser Wert sollte für alle Segmente mit Ausnahme des letzten Segments im Pod gleich sein.segment_offset
: Segmentversatz, der berechnet wird, indem die Dauer des vorherigen Segments zu seinem Segmentversatz in Millisekunden addiert wird.last
: boolescher Wert, der das letzte Segment in einem Anzeigen-Pod identifiziert Die Standardeinstellung ist „false“.
URLs für Anzeigensegmente erstellen
Ersetzen Sie jedes Segment in der Werbeunterbrechung durch eine URL im folgenden Format:
/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)
Pfadparameter | |
---|---|
network_code
|
Der Ad Manager 360-Netzwerkcode für dieses Netzwerk. |
custom_asset_key
|
Der benutzerdefinierte Livestream-Asset-Schlüssel, der in der LiveStreamEventService API oder auf der Livestream-Seite in der Ad Manager 360-Weboberfläche angegeben wird. |
pod_id
|
ID für die Werbeunterbrechung. Muss eine Ganzzahl sein, die bei 1 beginnt und für jede Werbeunterbrechung um eins erhöht wird.
Dieser Wert muss für alle Nutzer, die im aktuellen Ereignis dieselbe Werbeunterbrechung sehen, gleich sein. |
profile_name
|
ID des angeforderten Profils, |
segment_number
|
Der Index dieses Segments im aktuellen Anzeigen-Pod, beginnend bei null. Wenn Sie einen MP4-Container verwenden, kann das Initialisierungssegment angefordert werden. Dazu setzen Sie segment_number auf „init“. |
Abfrageparameter | ||
---|---|---|
stream_id
|
Erforderlich | Der Parameter stream_id des Nutzers, der von der Anfrage zum Erstellen von Streams zurückgegeben wurde.
|
sd
|
Erforderlich | segment_duration
|
so
|
Optional | segment_offset
Wenn |
pd
|
Erforderlich, außer bei Ereignissen, bei denen Werbeunterbrechungen ohne Dauer aktiviert sind | Dauer der Werbeunterbrechung in Millisekunden Wird 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 das letzte Segment der Werbeunterbrechung angibt Die Standardeinstellung ist "false". |
Die Werte der Abfrageparameter müssen korrekt codiert sein, damit sie URL-sicher sind. Dies ist besonders wichtig für das Feld auth-token
, da es /
-, +
- und =
-Zeichen enthalten kann.
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/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
Glückwunsch! Sie stellen jetzt einen Livestream mit Anzeigensegmenten bereit, die von der DAI Pod Serving API bereitgestellt werden.
DASH-Streams
DASH-Streams werden als MPD-Datei bereitgestellt, die alle Streamcodierungen in einer einzigen Datei enthält, wobei der Inhalt als eine Reihe von Zeiträumen dargestellt wird.
Vorlage für den Anfragezeitraum
Fordern Sie eine Periodenvorlage von Google Ad Manager an. Diese Vorlage wird für die Werbeunterbrechung verwendet, sobald die darin enthaltenen Makros eingefügt wurden.
Du solltest diese Vorlage nur einmal pro Streamsitzung anfordern und zur Wiederverwendung für jede Werbeunterbrechung im Cache speichern.
Endpunktvorlage für Zeitraumvorlage hjf
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 Asset-Schlüssel des Livestream-Ereignisses in Google Ad Manager. |
Abfrageparameter | |
---|---|
stream_id |
Die Ad Manager-Stream-ID aus dem Videoplayer des Clients. |
Antwort (JSON) | |
---|---|
dash_period_template |
Der XML-String der Periodenvorlage. |
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}
Zeitraumvorlage ausfüllen
Die Zeitraumvorlage enthält mehrere Makros, die du für jede Werbeunterbrechung ersetzen musst. Alle Makros müssen ersetzt werden. Nicht verwendete Makros müssen durch einen leeren String ("") ersetzt werden.
Macro | Beschreibung | Beispiel |
---|---|---|
$$pod-id$$ |
Der Index des Anzeigen-Pods, den dieser Zeitraum darstellt. Dieser Wert muss in allen Zuschauersitzungen für denselben Pod übereinstimmen. | 1 |
$$period-start$$ |
Die Zeit, zu der der Zeitraum in der aktuellen MPD-Datei beginnt. Ein optionales Attribut, das durch start="###" ersetzt werden sollte, wobei ### der Präsentationszeitpunkt ist, zu dem die Werbeunterbrechung beginnt. Wenn die Startzeit des Zeitraums nicht angegeben ist, muss das Makro durch einen leeren String ersetzt werden.
|
start="PT2H33M30S" |
$$period-duration$$ |
Die Dauer des gesamten Anzeigenzeitraums. Ein optionales Attribut, das durch duration="###" ersetzt werden muss, wobei ### die Dauer des Anzeigenzeitraums im DASH-Standardformat für die Dauer ist. Ist die Dauer des Zeitraums nicht angegeben, muss das Makro durch einen leeren String ersetzt werden.
|
duration="PT15S" |
$$pod-duration$$ |
Erwartete Dauer der Anzeigen, die für diesen Pod ausgewählt werden sollen, in Millisekunden. | 15000 |
$$number-of-repeated-segments$$ |
Dieser Wert wird berechnet, indem die Dauer der Anzeigenperiode (in Millisekunden) durch den Wert von segment_duration_ms geteilt und auf die nächste ganze Zahl aufgerundet wird. | 3 |
$$cust_params$$ |
Dieses Makro kann durch die benutzerdefinierten Targeting-Parameter ersetzt werden, die für die aktuelle Werbeunterbrechung eindeutig sind, sofern angegeben. Der Wert muss so formatiert sein, wie in diesem Ad Manager-Hilfeartikel beschrieben. 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 scte35-Wert ersetzt werden, der für diese Werbeunterbrechung eindeutig ist, sofern angegeben. Wenn keine scte35-Informationen erforderlich sind, sollte dieses Makro durch einen leeren String ersetzt werden. |
/DAqAAAAAAAA///wDwVAAAT2f0/+ecF1mQABC/8ACgAIQ1VFSQAAAAsuZVlR
|
$$token$$ |
Ein signiertes, URL-codiertes 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 Rohdatenzeitraum, 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>
ausgefüllter Anzeigenzeitraum
<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>
Gefüllte Periode in das DASH-Manifest einfügen
Ersetzen Sie schließlich den entsprechenden Zeitraum in Ihrem Rohmanifest durch den neu ausgefüllten Anzeigenzeitraum und geben Sie das endgültige Stitching-Manifest zur Wiedergabe an den anfragenden Videoclient zurück.
Beispiel für ein Manifest mit Rohinhalten
<?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 zusammengefügte Manifest-Datei
<?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! Sie schalten jetzt einen DASH-Livestream mit Anzeigensegmenten, die von der DAI Pod Serving API bereitgestellt werden.
Zusätzliche Ressourcen
- Pod-Auslieferung mit dem IMA SDK:
- Pod-Auslieferung mit der DAI API