Livestreams abspielen, die bei der Google Cloud Video Stitcher API registriert sind
In dieser Anleitung wird beschrieben, wie Sie mit dem IMA DAI SDK für CAF-Webempfänger einen Livestream für ein Ereignis anfordern und abspielen, das bei der Google Cloud Video Stitcher API registriert ist, und wie Sie während der Wiedergabe eine Werbeunterbrechung einfügen.
Diese Anleitung erweitert das grundlegende Beispiel der dynamischen Anzeigenbereitstellung mit Komplettservice und bietet Unterstützung für Streams, die über die Google Cloud Video Stitcher API registriert wurden.
Prüfen Sie, bevor Sie fortfahren, ob Ihr Streamingformat von CAF-Webempfängern unterstützt wird.
Informationen zur Integration in andere Plattformen oder zur Verwendung der clientseitigen IMA SDKs finden Sie unter Interactive Media Ads SDKs.
Hintergrund
Bevor Sie diese Anleitung verwenden, machen Sie sich mit dem Webempfängerprotokoll des Chromecast Application Framework vertraut.
In dieser Anleitung wird vorausgesetzt, dass Sie mit CAF-Empfängerkonzepten wie Nachrichtenabfangenden und MediaInformation
-Objekten und der Verwendung des Cast-Befehls- und Steuerelements zum Emulieren eines CAF-Senders vertraut sind.
Anwendungskomponenten und -architektur
Die Implementierung der Livestream-Wiedergabe mit der Google Cloud Video Stitcher API mit dem IMA CAF DAI SDK umfasst zwei Hauptkomponenten, die in dieser Anleitung erläutert werden:
VideoStitcherLiveStreamRequest
: Ein Objekt, das eine Streamanfrage an die Google-Server definiert. Die Anfrage gibt eine Instanz der Cloud Video Stitcher API, eine Live-Konfigurations-ID und andere optionale Parameter an.StreamManager
: Ein Objekt, das die Kommunikation zwischen dem Videostream und dem IMA DAI SDK steuert, z. B. das Auslösen von Tracking-Pings und das Weiterleiten von Streamereignissen an den Publisher.
Vorbereitung
Für das IMA SDK benötigen Sie folgende Variablen:
Live-Konfigurations-ID: Dies ist die ID der Live-Konfiguration, die Sie beim Erstellen der Live-Konfiguration der Video Stitcher API angegeben haben.
LIVE_CONFIG_ID
Standort: Die Google Cloud-Region, in der die Live Config erstellt wurde.
LOCATION
Projektnummer: Die Google Cloud-Projektnummer, für die die Video Stitcher API verwendet wird.
PROJECT_NUMBER
OAuth-Token: Das kurzlebige OAuth-Token eines Dienstkontos mit der Nutzerrolle „Video Stitcher“. Weitere Informationen finden Sie unter Kurzlebige Anmeldedaten für Dienstkonten erstellen.
OAUTH_TOKEN
Netzwerkcode: Google Ad Manager-Netzwerkcode für die Anzeigenanfrage
NETWORK_CODE
Benutzerdefinierter Asset-Schlüssel: Benutzerdefinierter Asset-Schlüssel in Google Ad Manager, der beim Erstellen einer Konfiguration für ein Livestream-Ereignis mit der Video Stitcher API generiert wird
CUSTOM_ASSET_KEY
Für einen benutzerdefinierten Übertragungsempfänger ist Folgendes erforderlich:
Ein Cast Developer Console-Konto mit Testgeräten in einer Zulassungsliste.
Eine gehostete Webempfänger-App, die in Ihrer Cast Developer Console registriert ist und so geändert werden kann, dass sie den in diesem Leitfaden bereitgestellten Code hostet.
Eine sendende App, die für die Verwendung Ihrer Webempfänger-App konfiguriert ist. In diesem Beispiel wird in diesem Beispiel das Cast-Befehl und -Steuerungstool als Absender verwendet.
Absender vorbereiten, Streamdaten an den Empfänger zu übergeben
Konfigurieren Sie zuerst die Absenderanwendung so, dass eine Ladeanfrage an Ihren Webempfänger gesendet wird. Sie enthält die folgenden Felder im MediaInformation
-Objekt Ihrer Plattform.
Feld | Inhalt | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
contentId
|
Eine eindeutige Kennzeichnung für dieses Medienelement, wie in der Cast-Referenzdokumentation definiert. Diese ID sollte nicht für mehrere Elemente in derselben Medienwarteschlange verwendet werden.
|
||||||||||||||
contentUrl
|
Optionale Sicherungsstream-URL, die wiedergegeben wird, wenn der Stream für die dynamische Anzeigenbereitstellung nicht geladen werden kann.
|
||||||||||||||
contentType
|
Optionaler MIME-Typ der URL des Back-up-Streams, der wiedergegeben wird, wenn der Stream für die dynamische Anzeigenbereitstellung nicht geladen werden kann.
|
||||||||||||||
streamType
|
Das für diesen Wert verwendete String-Literal oder die Konstante variiert je nach Absenderplattform.
|
||||||||||||||
customData
|
Das Feld
|
Hier sind einige Codebeispiele, die Ihnen den Einstieg erleichtern:
Web
Zum Konfigurieren dieser Werte in einem Cast-Websender müssen Sie zuerst ein MediaInfo
-Objekt mit den erforderlichen Daten erstellen und dann eine Ladeanfrage an den Webempfänger senden.
// Create mediaInfo object
const mediaInfo = new chrome.cast.media.MediaInfo("CONTENT_ID");
mediaInfo.contentUrl = "BACKUP_STREAM_URL";
mediaInfo.contentType = "BACKUP_STREAM_MIMETYPE";
mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;
mediaInfo.customData = {
liveConfigID: "LIVE_CONFIG_ID",
region: "LOCATION",
projectNumber: "PROJECT_NUMBER",
oAuthToken: "OAUTH_TOKEN",
networkCode: "NETWORK_CODE",
customAssetKey: "CUSTOM_ASSET_KEY"
};
// Make load request to cast web receiver
const castSession = cast.framework.CastContext.getInstance().getCurrentSession();
const request = new chrome.cast.media.LoadRequest(mediaInfo);
castSession.loadMedia(request).then(
() => { console.log('Load succeed'); },
(errorCode) => { console.log('Error code: ' + errorCode); });
Android
Zum Konfigurieren dieser Werte in einem Cast-Websender müssen Sie zuerst ein MediaInfo
-Objekt mit den erforderlichen Daten erstellen und dann eine Ladeanfrage an den Webempfänger senden.
JSONObject customData = new JSONObject()
.put("liveConfigID", "LIVE_CONFIG_ID")
.put("region", "LOCATION")
.put("projectNumber", "PROJECT_NUMBER")
.put("oAuthToken", "OAUTH_TOKEN")
.put("networkCode", "NETWORK_CODE")
.put("customAssetKey", "CUSTOM_ASSET_KEY");
MediaInfo mediaInfo = MediaInfo.Builder("CONTENT_ID")
.setContentUrl("BACKUP_STREAM_URL")
.setContentType("BACKUP_STREAM_MIMETYPE")
.setStreamType(MediaInfo.STREAM_TYPE_LIVE)
.setCustomData(customData)
.build();
RemoteMediaClient remoteMediaClient = mCastSession.getRemoteMediaClient();
remoteMediaClient.load(new MediaLoadRequestData.Builder().setMediaInfo(mediaInfo).build());
iOS (Obj-C)
Zum Konfigurieren dieser Werte in einem Cast-Websender müssen Sie zuerst ein GCKMediaInformation
-Objekt mit den erforderlichen Daten erstellen und dann eine Ladeanfrage an den Webempfänger senden.
NSURL url = [NSURL URLWithString:@"BACKUP_STREAM_URL"];
NSDictionary *customData = @{
@"liveConfigID": @"LIVE_CONFIG_ID",
@"region": @"LOCATION",
@"projectNumber": @"PROJECT_NUMBER",
@"oAuthToken": @"OAUTH_TOKEN",
@"networkCode": @"NETWORK_CODE",
@"customAssetKey": @"CUSTOM_ASSET_KEY"
};
GCKMediaInformationBuilder *mediaInfoBuilder =
[[GCKMediaInformationBuilder alloc] initWithContentID: @"CONTENT_ID"];
mediaInfoBuilder.contentURL = url;
mediaInfoBuilder.contentType = @"BACKUP_STREAM_MIMETYPE";
mediaInfoBuilder.streamType = GCKMediaStreamTypeLive;
mediaInfoBuilder.customData = customData;
self.mediaInformation = [mediaInfoBuilder build];
GCKRequest *request = [self.sessionManager.currentSession.remoteMediaClient loadMedia:self.mediaInformation];
if (request != nil) {
request.delegate = self;
}
iOS (Swift)
Zum Konfigurieren dieser Werte in einem Cast-Websender müssen Sie zuerst ein GCKMediaInformation
-Objekt mit den erforderlichen Daten erstellen und dann eine Ladeanfrage an den Webempfänger senden.
let url = URL.init(string: "BACKUP_STREAM_URL")
guard let mediaURL = url else {
print("invalid mediaURL")
return
}
let customData = [
"liveConfigID": "LIVE_CONFIG_ID",
"region": "LOCATION",
"projectNumber": "PROJECT_NUMBER",
"oAuthToken": "OAUTH_TOKEN",
"networkCode": "NETWORK_CODE",
"customAssetKey": "CUSTOM_ASSET_KEY"
]
let mediaInfoBuilder = GCKMediaInformationBuilder.init(contentId: "CONTENT_ID")
mediaInfoBuilder.contentURL = mediaUrl
mediaInfoBuilder.contentType = "BACKUP_STREAM_MIMETYPE"
mediaInfoBuilder.streamType = GCKMediaStreamType.Live
mediaInfoBuilder.customData = customData
mediaInformation = mediaInfoBuilder.build()
guard let mediaInfo = mediaInformation else {
print("invalid mediaInformation")
return
}
if let request = sessionManager.currentSession?.remoteMediaClient?.loadMedia(mediaInfo) {
request.delegate = self
}
CAC-Tool
Klicken Sie zum Konfigurieren dieser Werte im Cast-Befehl und -Steuerelement auf den Tab "Medien laden" und setzen Sie den benutzerdefinierten Anfragetyp auf LOAD. Ersetzen Sie dann die JSON-Daten im Textbereich durch diese JSON-Datei:
{
"media": {
"contentId": "CONTENT_ID",
"contentUrl": "BACKUP_STREAM_URL",
"contentType": "BACKUP_STREAM_MIMETYPE",
"streamType": "LIVE",
"customData": {
"liveConfigID": "LIVE_CONFIG_ID",
"region": "LOCATION",
"projectNumber": "PROJECT_NUMBER",
"oAuthToken": "OAUTH_TOKEN",
"networkCode": "NETWORK_CODE",
"customAssetKey": "CUSTOM_ASSET_KEY"
}
}
}
Diese benutzerdefinierte Ladeanfrage kann an den Empfänger gesendet werden, um die restlichen Schritte zu testen.
Benutzerdefinierten CAF-Webempfänger erstellen
Erstellen Sie einen benutzerdefinierten Web Receiver, wie im CAF SDK Custom Web Receiver Guide beschrieben.
Der Code des Empfängers sollte wie folgt aussehen:
<html>
<head>
<script
src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js">
</script>
</head>
<body>
<cast-media-player></cast-media-player>
<script>
const castContext = cast.framework.CastReceiverContext.getInstance()
castContext.start();
</script>
</body>
</html>
IMA DAI SDK importieren und Player-Manager abrufen
Fügen Sie ein Skript-Tag hinzu, um das IMA DAI SDK für CAF in Ihren Webempfänger zu importieren, nachdem das Skript CAF geladen hat. Speichern Sie dann im folgenden Skript-Tag den Empfängerkontext und den Player-Manager als Konstanten, bevor Sie den Empfänger starten.
<html>
<head>
<script
src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
<script src="//imasdk.googleapis.com/js/sdkloader/cast_dai.js"></script>
</head>
<body>
<cast-media-player></cast-media-player>
<script>
const castContext = cast.framework.CastReceiverContext.getInstance();
const playerManager = castContext.getPlayerManager();
castContext.start();
</script>
</body>
</html>
IMA Stream Manager initialisieren
Initialisieren Sie den IMA Stream Manager.
<html>
<head>
<script type="text/javascript"
src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
<script src="//imasdk.googleapis.com/js/sdkloader/cast_dai.js"></script>
</head>
<body>
<cast-media-player></cast-media-player>
<script>
const castContext = cast.framework.CastReceiverContext.getInstance();
const playerManager = castContext.getPlayerManager();
const streamManager = new google.ima.cast.dai.api.StreamManager();
castContext.start();
</script>
</body>
</html>
Stream Manager-Load-Interceptor erstellen
Bevor Ihre Medienelemente an CAF übergeben werden, erstellen Sie Ihre Streamanfrage in einem LOAD-Nachrichtenabfanger.
const castContext = cast.framework.CastReceiverContext.getInstance();
const playerManager = castContext.getPlayerManager();
const streamManager = new google.ima.cast.dai.api.StreamManager();
/**
* Creates a livestream request object for the Video Stitcher API.
* @param {!LoadRequestData} castRequest The request object from the cast sender
* @return {StreamRequest} an IMA stream request
*/
const createStreamRequest = (castRequest) => { /* ... */};
/**
* Initates a DAI stream request for the final stream manifest.
* @param {!LoadRequestData} castRequest The request object from the cast sender
* @return {Promise<LoadRequestData>} a promise that resolves to an updated castRequest, containing the DAI stream manifest
*/
const createDAICastRequest = (castRequest) => {
return streamManager.requestStream(castRequest, createStreamRequest(castRequest))
.then((castRequestWithStreamData) => {
console.log('Successfully made DAI stream request.');
return castRequestWithStreamData;
})
.catch((error) => {
console.log('Failed to make DAI stream request.');
// CAF will automatically fallback to the content URL
// that it can read from the castRequest object.
return castRequest;
});
};
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD, createDAICastRequest);
castContext.start();
Streamanfrage erstellen
Schließen Sie die Funktion createStreamRequest
ab, um basierend auf der CAF-Ladeanfrage eine Livestreamanfrage an die Video Stitcher API zu erstellen.
/**
* Creates a livestream request object for the Video Stitcher API.
* @param {!LoadRequestData} castRequest The request object from the cast sender
* @return {StreamRequest} an IMA stream request
*/
const createStreamRequest = (castRequest) => {
const streamRequest = new google.ima.cast.dai.api.VideoStitcherLiveStreamRequest();
const customData = castRequest.media.customData;
streamRequest.liveStreamEventId = customData.liveConfigID;
streamRequest.region = customData.region;
streamRequest.projectNumber = customData.projectNumber;
streamRequest.oAuthToken = customData.oAuthToken;
streamRequest.networkCode = customData.networkCode;
streamRequest.customAssetKey = customData.customAssetKey;
return streamRequest;
};