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. Sie können ein
mit dem
LiveStreamEventService API
oder die
Google Ad Manager-Weboberfläche:
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 sein für alle Ereignisse im Netzwerk eindeutig ist.adTags
– Primäre Anzeigen-Tag-URL, die vom Ad Manager-Trafficking generiert wurde zu optimieren.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 DAIEncodingProfile IDs für dieses Ereignis aktiviert.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
Die Manifestbearbeitung muss einen API-Endpunkt bereitstellen, um das Manifest zu überwachen von der Videoplayer-Client-App gesendet. Dieser Endpunkt muss mindestens eine Stream-ID aus der Client-Player-App abrufen und eine Streammanifest. Anhand der Stream-ID wird die Streamingsitzung der Anzeige identifiziert. Administrator.
Sie müssen auch einige andere Informationen erfassen, um die entsprechenden z. B. eine Content-ID.
Beispiel eines potenziellen Endpunkts einer Manifest-Anfrage
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. Entweder:
|
Abfrageparameter | |
---|---|
stream_id |
Die Ad Manager-Stream-ID aus der Videoplayer-App des Clients. |
Contentstream abrufen
Die Inhalte werden anhand der Content ID ausgewählt, die in der Manifestanfrage erfasst wurde. einen Stream, um Anzeigen mit Anzeigen zusammenzufügen.
Anzeigensegmente in den Contentstream einfügen
Die URLs für das Zusammenfügen von Anzeigensegmenten unterscheiden sich je nach Streamformat.
HLS-Streams
HLS-Streams werden normalerweise als Manifest mit mehreren Varianten bereitgestellt, das ein eine Reihe von Links zu Variantenmanifesten, die den einzelnen Codierungen entsprechen. Profilen.
Hinweis: Der Einfachheit halber wird in diesem Leitfaden davon ausgegangen, dass deine HLS-Medien in einem -Format, das Audio und Video in dieselbe Segmentdatei muxt.
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 unverarbeitetes 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 per Proxy weitergeleitetes 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
Behalten Sie bei der Verarbeitung des Variantenmanifests den Beginn, die Dauer und Index der nächsten anstehenden Werbeunterbrechung, bis das dynamische Manifest verarbeitet wird enthält Segmente, die durch den Anzeigeninhalt 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 Sie von Google gehostete Werbeunterbrechungen von Ihren Inhaltssegmenten trennen möchten, müssen Sie
#EXT-X-DISCONTINUITY
-Tags am Anfang und am Ende jeder Werbeunterbrechung. 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 Ihre Inhalte verschlüsselt sind,
Sie müssen die Verschlüsselung auch entfernen, indem Sie #EXT-X-KEY:METHOD=NONE
angeben
vor dem ersten Anzeigensegment jeder Werbeunterbrechung und fügen es
Werbeunterbrechung.
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 Diskontinuitäten
#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
: Segment-Offset, der durch Hinzufügen des vorherigen Werts die Dauer des Segments zum Segmentversatz in Millisekundenlast
: Boolescher Wert, der das letzte Segment in einem Anzeigen-Pod identifiziert. Standardeinstellungen auf false setzen.
Anzeigensegment-URLs 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/{pod_id}/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_id
|
Die ID für die Werbeunterbrechung. Muss eine Ganzzahl sein, die bei beginnt
1 und wird für jede Werbeunterbrechung um eins erhöht.
<ph type="x-smartling-placeholder"></ph> Dieser Wert muss für alle Nutzer gleich sein, die dieselbe Werbeunterbrechung in über das aktuelle Ereignis informieren. |
profile_name
|
ID für das angeforderte Profil |
segment_number
|
Der Index dieses Segments im aktuellen Anzeigen-Pod, beginnend bei null. Wenn Sie einen MP4-Container verwenden, kann das Initialisierungssegment angefordert werden, indem Sie segment_number auf "init" setzen. |
Abfrageparameter | ||
---|---|---|
stream_id
|
Erforderlich | Der stream_id -Parameter des Nutzers, der von Stream Create zurückgegeben wird
|
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
|
auth-token
|
Erforderlich | Eine signierte, URL-codierte HMAC-Token für diesen Anzeigen-Pod. |
last
|
Optional | Ein boolescher Wert, der das letzte Segment in der Werbeunterbrechung angibt. 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/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 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 Eine einzelne Datei, in der Inhalte als eine Reihe von Punkten dargestellt werden
Vorlage für den Zeitraum anfordern
Fordern Sie eine Vorlage für den Zeitraum von 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 – Anfrage
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 für alle Zuschauersitzungen verwenden. | 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 nicht angegeben ist, sollte dieses Makro ersetzt werden.
mit einem leeren String.
|
start="PT2H33M30S" |
$$period-duration$$ |
Die Dauer des gesamten Anzeigenzeitraums. Ein optionales Attribut, das
wird durch duration="###" ersetzt, wobei ### der Wert
Dauer des Anzeigenzeitraums im DASH-Standardformat für die Dauer. Wenn die
keine Zeitspanne angegeben ist, muss dieses Makro durch ein
Leerer String.
|
duration="PT15S" |
$$pod-duration$$ |
Die erwartete Dauer der Anzeigen, für die für diesen Pod entschieden wird, 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 benötigt werden, muss dieses Makro durch ein leeres . |
&cust_params=section%3Dblog%26anotherKey%3Dvalue1%2Cvalue2
|
$$scte35$$ |
Dieses Makro muss durch einen scte35-Wert ersetzt werden, der für diese Werbeunterbrechung eindeutig ist. falls eines angegeben wird. 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>
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>
Zeitraum in das DASH-Manifest einfügen
Ersetzen Sie abschließend den entsprechenden Punkt in Ihrem Rohmanifest durch den neuen ausgefüllten Anzeigenzeitraum und geben Sie das endgültige zusammengefügte Manifest an die anfragende Video-Client für die Wiedergabe.
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 zusammengesetztes 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! Es wird jetzt ein DASH-Livestream mit Anzeigensegmenten bereitgestellt. Pod Serving API für die dynamische Anzeigenbereitstellung.
Zusätzliche Ressourcen
- Pod-Auslieferung mit dem IMA SDK: <ph type="x-smartling-placeholder">
- Wiedergabe der Pod-Auslieferung mit der dynamischen Anzeigenbereitstellung API