IMA SDK'ları, multimedya reklamları web sitelerinize ve uygulamalarınıza entegre etmeyi kolaylaştırır.
IMA SDK'ları, herhangi bir VAST uyumlu 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 akış isteği gönderir. 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'yı kullanarak 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, CAF alıcı kavramları (ör. mesaj dinleyiciler ve mediaInformation nesneleri) hakkında temel bilgilere sahip olduğunuz ve CAF gönderenini taklit etmek için Cast Command and Control aracını kullanmayı bildiğiniz varsayılmaktadır.
IMA DAI Kapsül Yayınlama'yı kullanmak için bir kapsül yayınlama iş ortağıyla çalışıyor ve Ad Manager 360 Advanced hesabınızın olması gerekir. Ad Manager hesabınız varsa daha fazla bilgi için hesap yöneticinizle iletişime geçin. 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 edinmek için Interactive Media Ads SDK'ları bölümüne bakın.
IMA DAI Kapsül Yayınlama'ya genel bakış
IMA CAF DAI SDK'yı kullanarak kapsül yayınlamayı uygulamak, bu kılavuzda gösterilen iki ana bileşeni içerir:
StreamRequest: Google'ın reklam sunucularına yönelik bir akış isteğini tanımlayan nesne. İstekler bir ağ kodu, özel öğe anahtarı ve isteğe bağlı bir API anahtarının yanı sıra diğer isteğe bağlı parametreleri belirtir.StreamManager: Video akışı ile IMA DAI SDK'sı arasındaki iletişimi yöneten bir nesne. Örneğin, izleme ping'lerini tetikler ve akış etkinliklerini yayıncıya iletir.
Ön koşullar
- Kayıtlı test cihazlarının bulunduğu bir Cast Developer Console hesabı.
- Cast Developer Console'unuza kayıtlı olan ve bu kılavuzda sağlanan kodu barındıracak şekilde değiştirilebilen barındırılan bir web alıcı uygulaması.
- Web alıcı uygulamanızı kullanacak şekilde yapılandırılmış bir gönderen uygulama. Bu örnekte, gönderen olarak Cast Command and Control 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 bir tanımlayıcı.
CONTENT_ID |
||||||||||
contentUrl
|
İsteğe bağlıdır. DAI yayını yüklenemezse oynatılacak yedek yayın URL'si.
BACKUP_STREAM_URL |
||||||||||
contentType
|
İsteğe bağlıdır. İçerik yedekleme 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 değişmezi veya sabit, gönderen platforma göre değişir. | ||||||||||
customData
|
customData alanı, gerekli diğer alanların anahtar/değer deposunu içerir. Bu örnekte, DAI akış parametrelerinizi içerir. Üretim uygulamasında, bunun yerine, yayın alıcı uygulamanızın bu parametreleri sunucu tarafı isteğiyle almak için kullanacağı bir tanımlayıcı iletebilirsiniz.
|
Başlamanıza yardımcı olacak bazı kod örnekleri:
Web
Bu değerleri bir Cast web göndericisinde yapılandırmak için önce gerekli verileri içeren 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 = {
daiStreamType: "DAI_STREAM_TYPE",
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 önce gerekli verileri içeren bir MediaInfo nesnesi oluşturun, ardından web alıcısına bir yükleme isteği gönderin.
JSONObject customData = new JSONObject()?
.put("daiStreamType", "DAI_STREAM_TYPE")
.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)
Bu değerleri bir Cast web göndericisinde yapılandırmak için önce gerekli verileri içeren 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 = @{
@"daiStreamType": @"DAI_STREAM_TYPE",
@"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)
Bu değerleri bir Cast web göndericisinde yapılandırmak için önce gerekli verileri içeren 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 = [
"daiStreamType": "DAI_STREAM_TYPE",
"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ı
Cast Command and Control aracında bu değerleri yapılandırmak için Load Media (Medya Yükle) sekmesini tıklayın ve özel yükleme isteği türünü LOAD (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": {
"daiStreamType": "DAI_STREAM_TYPE",
"networkCode": "NETWORK-CODE",
"customAssetKey": "CUSTOM_ASSET_KEY",
"oAuthToken": "API_KEY"
}
}
}
Bu özel yükleme isteği, adımların geri kalanını test etmek için alıcıya gönderilebilir.
Temel 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ızı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'yı içe aktarma ve Player Manager'ı edinme
CAF için IMA DAI SDK'sını web alıcınıza aktarmak üzere CAF'yi yükleyen komut dosyasından hemen sonra bir komut dosyası etiketi ekleyin. Komut dosyası etiketinde, alıcıyı başlatmadan önce alıcı bağlamını ve oynatıcı yöneticisini sabit olarak depolayın.
<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>
Stream Manager Load Interceptor'ı oluşturma
Medya öğeleriniz CAF'ye iletilmeden önce akış isteğinizi bir LOAD mesajı yakalayıcıda 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şturma
CAF yükleme isteğine göre kapsül sunma 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 customData = castRequest.media.customData;
let streamRequest;
if (customData.daiStreamType == "LIVE") {
streamRequest = new google.ima.cast.dai.api.PodStreamRequest();
streamRequest.customAssetKey = customData.customAssetKey;
streamRequest.networkCode = customData.networkCode;
streamRequest.apiKey = customData.apiKey;
} else if (customData.daiStreamType == "VOD") {
streamRequest = new google.ima.cast.dai.api.PodVodStreamRequest();
streamRequest.networkCode = customData.networkCode;
streamRequest.apiKey = customData.apiKey;
}
return streamRequest;
};
Birleştirilmiş manifesti VTP'nizden alma
Yayın isteğiniz başarılı olursa yayının kimliğini almak için streamManager.getStreamId() kullanın. Video Teknoloji İş Ortağınız (VTP) veya özel manifest düzenleyiciniz, bu akış kimliğini kullanarak manifest URL'sini alma talimatlarını sağlar.
Manifest URL'nizi aldıktan sonra mevcut contentUrl değerini yeni manifestUrl değeriyle değiştirin.
Son olarak, değiştirilen akış manifestini döndürmeden önce
streamManager
üzerinde
loadStreamMetadata
yöntemini çağırarak IMA SDK'ya akış meta verilerini güvenli bir şekilde isteyebileceğini bildirin. Bu çağrı yalnızca VOD
akışları için gereklidir.
/**
* 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.');
// This is a sample VTP integration. Consult your VTP documentation
// for how to retrieve an ad-stitched stream manifest URL.
const manifestTemplate = "https://.../manifest.m3u8?gam_stream_id=[[STREAMID]]";
const streamId = streamManager.getStreamId();
const manifestUrl = manifestTemplate.replace('[[STREAMID]]', streamId)
// Assign your manifestUrl to the request's content URL.
castRequestWithPodStreamData.media.contentUrl = manifestUrl;
// After generating the manifest URL, VOD streams must notify the
// IMA SDK that it is safe to request ad pod metadata.
// This is only necessary for VOD streams. It is a no-op for
// livestreams, so no conditional is needed.
streamManager.loadStreamMetadata();
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;
});
};
IMA DAI öğelerini temizleme
IMA DAI SDK ile kapsül sunma akışında reklam isteme ve gösterme işlemlerini başarıyla tamamladığınızda, kapsül sunma oturumu tamamlandıktan sonra tüm kaynakları temizlemenizi öneririz. Canlı yayın oynatmayı durdurmak, tüm reklam izlemeyi durdurmak ve yüklenen tüm canlı yayın öğelerini serbest bırakmak için StreamManager.destroy() yöntemini çağırın.