İlgilendiğiniz DAI çözümünü seçin
Kapsül Yayınlama DAI
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 yayın isteği gönderir. Ardından SDK, birleştirilmiş bir video akışı döndürür. Böylece uygulamanızda reklam ve içerik videosu arasında geçiş yapmanız gerekmez.
Bu kılavuzda, CAF için IMA DAI SDK'sı kullanılarak 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ünü öğrenin. Bu kılavuzda, CAF gönderenini taklit etmek için mesaj tutucular ve mediaInformation nesneleri gibi CAF alıcı kavramları hakkında temel düzeyde bilgi sahibi olduğunuz ve Cast Komut ve Kontrol Aracı'nı kullanma konusunda bilgi sahibi olduğunuz varsayılmaktadır.
IMA DAI Kapsül Yayınlama'yı kullanmak için bir Kapsül Yayınlama iş ortağıyla çalışıyor olmanız ve Ad Manager 360 Gelişmiş hesabınız 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ı başlıklı makaleyi inceleyin.
IMA DAI Kapsül Yayınlama'ya genel bakış
IMA CAF DAI SDK'sını kullanarak kapsül yayınlama özelliğini uygulamak, bu kılavuzda gösterilen iki ana bileşenden oluşur:
StreamRequest
: Google'ın reklam sunucularına bir akış isteği tanımlayan bir nesne. İstekler; bir ağ kodu, özel öğe anahtarı ve isteğe bağlı 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 (ör. izleme ping'lerini gönderme ve yayın etkinliklerini yayıncıya yönlendirme).
Ön koşullar
- Kayıtlı test cihazları olan bir Cast Geliştirici Konsolu hesabı.
- Cast Developer Console'unuza kayıtlı 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 uygulaması. Bu örnekte, gönderen olarak Cast Komut ve Kontrol 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 öğesinin benzersiz tanımlayıcısıdır.
CONTENT_ID |
||||||||||
contentUrl
|
İsteğe bağlı. DAI yayını yüklenemezse oynatılacak yedek yayın URL'si.
BACKUP_STREAM_URL |
||||||||||
contentType
|
İsteğe bağlı. İçerik yedekleme akışlarının mime türü. Yalnızca DASH yayınları için gereklidir.
CONTENT_STREAM_MIMETYPE |
||||||||||
streamType
|
Bu değer için kullanılan dize değişmezi veya sabit değer, gönderen platformuna göre değişir. | ||||||||||
customData
|
customData alanı, ek zorunlu alanların anahtar/değer mağazasını içerir. Bu örnekte DAI akış parametrelerinizi içerir. Bunun yerine, üretim uygulamasında yayınlama alıcı uygulamanızın bu parametreleri sunucu tarafı istekle almak için kullanacağı bir tanımlayıcı iletebilirsiniz.
|
Başlamanıza yardımcı olacak bazı kod örneklerini aşağıda bulabilirsiniz:
Web
Bu değerleri bir Cast web göndereninde 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); });
Yapay Zeka
Bu değerleri bir Cast web göndereninde yapılandırmak için önce gerekli verileri içeren bir MediaInfo nesnesi oluşturun, ardından web alıcısına 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öndereninde 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öndereninde 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ı
Yayınlama Komut ve Kontrol Aracı'nda bu değerleri yapılandırmak için Medya Yükle sekmesini tıklayın ve özel yükleme istek türünü LOAD 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 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 aktarma ve Oynatıcı Yöneticisi'ni alma
Komut dosyası CAF'yi yükledikten hemen sonra, CAF için IMA DAI SDK'sını web alıcınıza içe aktarmak üzere bir komut dosyası etiketi ekleyin. Alıcıyı başlatmadan önce alıcı bağlamını ve oynatıcı yöneticisini komut dosyası etiketinde sabit olarak saklayı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 Akış Yöneticisi'ni 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 Yük Engelleyicisi'ni oluşturma
Medya öğeleriniz CAF'ye iletilmeden önce akış isteğinizi bir LOAD mesajı alıcısı içinde 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 bir Pod 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 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;
};
VTP'nizden birleştirilmiş manifest'i alma
Akış isteğiniz başarılı olursa akış kimliğini almak için streamManager.getStreamId()
değerini kullanın. Video Teknik İş Ortağınız (VTP) veya özel manifest düzenleyiciniz, bu yayın kimliğini kullanarak manifest URL'si alma talimatlarını sağlar.
Manifest URL'nizi aldıktan sonra mevcut contentUrl
yerine yeni manifestUrl
değerini girin.
Son olarak, değiştirilmiş yayın manifestini döndürmeden önce IMA SDK'ya yayın meta verilerini güvenli bir şekilde isteyebileceğini bildirmek için streamManager
üzerinde loadStreamMetadata
yöntemini çağırın. Bu çağrı yalnızca seç-izle yayınlar 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'sını kullanarak bir Pod Yayınlama akışında reklam isteğinde bulunma ve görüntüleme işlemlerini başarıyla tamamladığınızda, Pod Yayınlama oturumu tamamlandıktan sonra tüm kaynakları temizlemenizi öneririz. Akış oynatmayı durdurmak, tüm reklam izlemeyi durdurmak ve yüklü tüm akış öğelerini serbest bırakmak için StreamManager.destroy()
çağrısı yapın.