Manifestbearbeitung für Livestreams

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 auf POD_SERVING_REDIRECT festgelegt werden.
  • streamingFormat: Legen Sie entsprechend HLS oder DASH fest.
  • segmentUrlAuthenticationKeyIds: mindestens ein HMAC-Schlüssel, der zum Signieren von Anfragen für Anzeigensegmente verwendet wird
  • daiEncodingProfileIds: Eine Liste der DAIEncodingProfile-IDs, die für dieses Ereignis aktiviert sind.
  • startDateTime: Startdatum und -zeit des Ereignisses
  • endDateTime: Das geplante Enddatum und die Uhrzeit für diesen Termin. Dieses Attribut ist erforderlich, wenn unlimitedEndDateTimeis false and ignored ifunlimitedEndDateTimeis 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:
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

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 so fehlt, wird angenommen, dass die vorherigen Segmente alle dieselbe Dauer haben, und der Segmentversatz wird aus segment_number und sd berechnet.

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}&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}

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

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&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! Sie schalten jetzt einen DASH-Livestream mit Anzeigensegmenten, die von der DAI Pod Serving API bereitgestellt werden.

Zusätzliche Ressourcen