İlgilendiğiniz DAI çözümünü seçme
DAI yayınlayan kapsül
IMA SDK'ları, multimedya reklamları web sitelerinize ve uygulamalarınıza entegre etmeyi basitleştirir.
IMA SDK'ları, VAST uyumlu herhangi bir reklam sunucusundan reklam isteyebilir ve uygulamalarınızda reklam oynatmayı yönetebilir.
IMA DAI SDK'ları sayesinde uygulamalar VOD veya canlı içerik için reklam ve içerik videosu için akış isteğinde bulunur. SDK, daha sonra birleştirilmiş bir video akışı döndürür, böylece uygulamanızda reklam ve içerik videosu arasında geçişi yönetmeniz gerekmez.
Bu kılavuzda, CAF için IMA DAI SDK'sı kullanılarak Canlı DAI Kapsül Yayınlama akışının nasıl oynatılacağı gösterilmektedir.
Bu kılavuzu kullanmadan önce Chromecast Uygulama Çerçevesi'nin Web Alıcısı protokolü hakkında bilgi edinin. Bu kılavuzda, mesaj önleyiciler ve mediaInformation nesneleri gibi CAF alıcısı kavramlarının temel düzeyde olduğu ve bir CAF göndereni emülasyonu için Yayınlama Komut ve Denetim aracını kullanma konusunda bilgi sahibi olunduğu varsayılır.
IMA DAI kapsül yayınını kullanmak için kapsül yayınlayan iş ortağıyla çalışıyor olmanız ve bir Ad Manager 360 Advanced hesabına sahip olmanız gerekir. Ad Manager hesabınız varsa daha fazla bilgi için hesap yöneticinize başvurun. Ad Manager'a kaydolma hakkında bilgi edinmek için Ad Manager Yardım Merkezi'ni ziyaret edin.
Diğer platformlarla entegrasyon veya IMA istemci tarafı SDK'larını kullanma hakkında bilgi için Interactive Media Ads SDK'ları bölümüne bakın.
IMA DAI Kapsül Yayınlamaya genel bakış
IMA CAF DAI SDK kullanarak kapsül yayınını uygulamak, bu kılavuzda gösterilen iki ana bileşenden oluşur:
StreamRequest
: Google'ın reklamcılık sunucularına akış isteğini tanımlayan bir nesnedir. İstekler bir Ağ Kodu, Özel Öğe Anahtarı, isteğe bağlı bir API anahtarı ve diğer isteğe bağlı parametreleri belirtir.StreamManager
: Video akışı ile IMA DAI SDK'sı arasındaki iletişimi (izleme ping'lerini etkinleştirme ve akış etkinliklerini yayıncıya iletme gibi) işleyen bir nesne.
Ön koşullar
- Kayıtlı test cihazlarına sahip bir Cast Developer Console hesabı.
- Cast Developer Console'unuza kayıtlı, bu kılavuzda sağlanan kodu barındırmak için değiştirilebilen, barındırılan bir web alıcısı uygulaması.
- Web alıcı uygulamanızı kullanacak şekilde yapılandırılmış bir gönderme uygulaması. Bu örnekte, gönderen olarak Cast Komut ve Denetim aracını kullanın.
Gönderenin MediaInfo nesnelerini yapılandırma
Öncelikle, gönderen uygulamanızın MediaInfo
nesnesini aşağıdaki alanları içerecek şekilde yapılandırın:
Alan | İçindekiler | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
contentId
|
Bu medya öğesi için benzersiz tanımlayıcı.
CONTENT_ID |
||||||||||
contentUrl
|
İsteğe bağlı. DAI akışı yüklenemiyorsa oynatılacak yedek akış URL'si.
BACKUP_STREAM_URL |
||||||||||
contentType
|
İsteğe bağlı. İçerik yedek akışlarının mime türü. Yalnızca DASH akışları için gereklidir.
CONTENT_STREAM_MIMETYPE |
||||||||||
streamType
|
Bu değer için kullanılan dize sabit değeri veya sabit değeri, gönderen platformuna göre değişir. | ||||||||||
customData
|
customData alanı, ek zorunlu alanların anahtar/değer deposunu içerir.
|
Başlamanıza yardımcı olacak bazı kod örneklerini aşağıda bulabilirsiniz:
Web
Bir Cast web göndericisinde bu değerleri yapılandırmak için ilk olarak gerekli verilerle bir MediaInfo
nesnesi oluşturun, ardından web alıcısına bir yükleme isteği gönderin.
// Create mediaInfo object
const mediaInfo = new chrome.cast.media.MediaInfo("CONTENT_ID");
mediaInfo.contentUrl = "BACKUP_STREAM_URL";
mediaInfo.contentType = "CONTENT_STREAM_MIMETYPE";
mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;
mediaInfo.customData = {
manifestUrl: "MANIFEST_URL",
networkCode: "NETWORK-CODE",
customAssetKey: "CUSTOM_ASSET_KEY",
apiKey: "API_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
Bu değerleri bir Cast web göndericisinde yapılandırmak için ilk olarak gerekli verilerle bir MediaInfo nesnesi oluşturun, ardından web alıcısına bir yükleme isteği gönderin.
JSONObject customData = new JSONObject()?
.put("manifestUrl", "MANIFEST_URL")
.put("networkCode", "NETWORK-CODE")
.put("customAssetKey", "CUSTOM_ASSET_KEY")
.put("apiKey", "API_KEY");
MediaInfo mediaInfo = MediaInfo.Builder("CONTENT_ID")
.setContentUrl("BACKUP_STREAM_URL")
.setContentType("CONTENT_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)
Bir Cast web göndericisinde bu değerleri yapılandırmak için ilk olarak gerekli verilerle bir GCKMediaInformation
nesnesi oluşturun, ardından web alıcısına bir yükleme isteği gönderin.
NSURL url = [NSURL URLWithString:@"BACKUP_STREAM_URL"];
NSDictionary *customData = @{
@"manifestUrl": @"MANIFEST_URL",
@"networkCode": @"NETWORK-CODE",
@"customAssetKey": @"CUSTOM_ASSET_KEY",
@"apiKey": @"API_KEY"};
mediaInfoBuilder.customData = customData;
GCKMediaInformationBuilder *mediaInfoBuilder =
[[GCKMediaInformationBuilder alloc] initWithContentID: @"CONTENT_ID"];
mediaInfoBuilder.contentURL = url;
mediaInfoBuilder.contentType = @"CONTENT_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)
Bir Cast web göndericisinde bu değerleri yapılandırmak için ilk olarak gerekli verilerle bir GCKMediaInformation
nesnesi oluşturun, ardından web alıcısına bir yükleme isteği gönderin.
let url = URL.init(string: "BACKUP_STREAM_URL")
guard let mediaURL = url else {
print("invalid mediaURL")
return
}
let customData = [
"liveConfigID": "MANIFEST_URL",
"networkCode": "NETWORK-CODE",
"customAssetKey": "CUSTOM_ASSET_KEY",
"region": "API_KEY"
]
let mediaInfoBuilder = GCKMediaInformationBuilder.init(contentId: "CONTENT_ID")
mediaInfoBuilder.contentURL = mediaUrl
mediaInfoBuilder.contentType = @"CONTENT_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 aracı
Bu değerleri Yayın Komut ve Denetimi aracında yapılandırmak için Medya Yükleme sekmesini tıklayın ve özel yükleme isteği türünü YÜKLE olarak ayarlayın. Ardından metin alanındaki JSON verilerini şu JSON ile değiştirin:
{
"media": {
"contentId": "CONTENT_ID",
"contentUrl": "BACKUP_STREAM_URL",
"contentType": ""CONTENT_STREAM_MIMETYPE"",
"streamType": "LIVE",
"customData": {
"liveConfigID": "MANIFEST_URL",
"networkCode": "NETWORK-CODE",
"customAssetKey": "CUSTOM_ASSET_KEY",
"oAuthToken": "API_KEY"
}
}
}
Bu özel yükleme isteği, kalan adımları test etmek için alıcıya gönderilebilir.
Temel bir CAF alıcısı oluşturma
CAF SDK Özel Web Alıcısı Kılavuzu'nda gösterildiği gibi, özel bir web alıcısı oluşturun.
Alıcının kodu aşağıdaki gibi görünmelidir:
<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>
// ...
</script>
</body>
</html>
IMA DAI SDK'sını içe aktarın ve Oynatıcı Yöneticisi'ni edinin
CAF için IMA DAI SDK'sını web alıcınıza, komut dosyasının CAF'sini yükledikten hemen sonra içe aktarmak üzere bir komut dosyası etiketi ekleyin. Komut dosyası etiketinde, alıcı bağlamını ve oynatıcı yöneticisini alıcıyı başlatmadan önce sabit değerler olarak kaydedin.
<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'ı başlatma
IMA Stream Manager'ı başlatın.
<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>
Akış Yöneticisi Yük Önleyicisini Oluşturma
Medya öğeleriniz CAF'ye iletilmeden önce, akış isteğinizi bir YÜKLE mesajı önleyicide oluşturun.
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 a pod serving stream.
* @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((castRequestWithPodStreamData) => {
console.log('Successfully made DAI stream request.');
// ...
return castRequestWithPodStreamData;
})
.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();
Akış isteğini oluşturun
CAF yükleme isteğine göre kapsül yayınlama akışı oluşturmak için createStreamRequest
işlevini tamamlayın.
/**
* Creates a livestream request object for a pod serving stream.
* @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.PodStreamRequest();
const customData = castRequest.media.customData;
streamRequest.customAssetKey = customData.customAssetKey;
streamRequest.networkCode = customData.networkCode;
streamRequest.apiKey = customData.apiKey;
return streamRequest;
};
İçerik URL'sini manifest URL'si ve akış kimliğiyle değiştirin
Akış isteğiniz başarılı olursa akışın kimliğini almak için streamManager.getStreamId()
kullanın ve [[STREAMID]]
yerine bu kimliği manifestUrl'nize ekleyin. Ardından, CAF'nin canlı yayını birleştirilmiş reklam kapsülleriyle oynatması için mevcut contentUrl
değerini yeni manifestUrl
ile değiştirin.
/**
* 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((castRequestWithPodStreamData) => {
console.log('Successfully made DAI stream request.');
const media = castRequestWithPodStreamData.media;
const manifestUrl = media.customData.manifestUrl || "";
if (manifestUrl) {
console.log('Replacing the contentURL with the manifest URL and stream ID');
const streamId = streamManager.getStreamId();
castRequestWithPodStreamData.media.contentUrl = manifestUrl.replace('[[STREAMID]]', streamId);
return castRequestWithPodStreamData;
})
.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;
});
};
Artık Cast Uygulama Çerçevesi ve CAF için IMA DAI SDK'sı ile kapsül yayınlama akışlarını isteyebilir ve oynatabilirsiniz.