Manifestbearbeitung für Livestreams

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

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

Voraussetzung: Livestream-Ereignisse in Google Ad Manager konfigurieren

Bevor Sie Anfragen über die API zur Pod-Auslieferung stellen, müssen Sie eine Anzeige erstellen Manager-Livestream-Ereignis für jeden von dir verarbeiteten Stream. 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 auf POD_SERVING_REDIRECT festgelegt sein.
  • streamingFormat: Lege den Wert auf HLS oder DASH fest.
  • segmentUrlAuthenticationKeyIds – mindestens eins HMAC-Schlüssel zum Signieren von Anfragen für Anzeigensegmente verwendet wird.
  • daiEncodingProfileIds – eine Liste der DAIEncodingProfile IDs für dieses Ereignis aktiviert.
  • startDateTime: Startdatum und -zeit des Ereignisses
  • endDateTime: Datum und Uhrzeit des geplanten Ereignisses. Dieses Attribut ist erforderlich, wenn unlimitedEndDateTimeis false and ignored ifunlimitedEndDateTimeis true.unlimitedEndDateTime` boolesch ist. Siehe oben.

Anfragen für Streamingmanifeste erhalten

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

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 Millisekunden
  • last: 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 so fehlt, wird angenommen, dass alle vorherigen Segmente dieselbe Dauer haben und der Segmentversatz wird anhand segment_number und sd.

pd Erforderlich, außer bei Ereignissen, für die Werbeunterbrechungen ohne Dauer aktiviert sind Die Dauer der Werbeunterbrechung in Millisekunden. Auch als ad_pod_duration
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}&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id={a-stream-id}&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;scte35=$$scte35$$&amp;auth_token=$$token$$" startNumber="1" presentationTimeOffset="0">
  <SegmentTimeline>
    <S t="0" d="5" r="$$number-of-repeated-segments$$"/>
  </SegmentTimeline>
  </SegmentTemplate>
  <AdaptationSet id="0" width="1280" height="720" frameRate="30" contentType="video" subsegmentAlignment="true" startWithSAP="1">
    <InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
    <Representation mimeType="video/mp4" codecs="avc1.640029" id="a943ff679a2f3e71d9181a21b7542122g" bandwidth="3200000"/>
    <Representation mimeType="video/mp4" codecs="avc1.640029" id="abbbd80q4w5ce2fs28308rd1f4g4bat0" bandwidth="1500000"/>
  </AdaptationSet>
  <AdaptationSet id="1" contentType="audio"> <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="a87ff679a2f3e71d9181a67b7542122c" bandwidth="95000"/>

    <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="eccbc87e4b5ce2fe28308fd9f2a7baf3" bandwidth="127000"/>
  </AdaptationSet>
</Period>",
"segment_duration_ms":5000}

Periodenvorlage ausfüllen

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

Macro Beschreibung Beispiel
$$pod-id$$ Der Index des Anzeigen-Pods, den dieser Zeitraum darstellt. Dieser Wert muss für denselben Pod 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&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>

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&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! Es wird jetzt ein DASH-Livestream mit Anzeigensegmenten bereitgestellt. Pod Serving API für die dynamische Anzeigenbereitstellung.

Zusätzliche Ressourcen