İ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 isteğinde bulunabilir ve uygulamalarınızda reklam oynatmayı yönetebilir.
IMA DAI SDK'ları ile uygulamalar, VOD veya canlı içerik için reklam ve içerik videosu 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ılavuz, CAF için IMA DAI SDK'sını kullanarak bir DAI kapsül yayınlama akışının nasıl oynatılacağını gösterir.
Bu kılavuzu kullanmadan önce Chromecast Application Framework'ün Web Receiver protokolü hakkında bilgi edinin. Bu kılavuzda, CAF gönderenini taklit etmek için Cast Command and Control aracı kullanımının yanı sıra mesaj kesiciler ve mediaInformation nesneleri gibi CAF alıcı kavramları hakkında temel düzeyde 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ışmanız 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ı başlıklı makaleyi inceleyin.
IMA DAI Kapsül Yayınlamaya Genel Bakış
IMA CAF DAI SDK'sını kullanarak kapsül yayınlama özelliğini uygulama işlemi iki ana bileşenden oluşur. Bu bileşenler bu kılavuzda gösterilmektedir:
StreamRequest
: Google'ın reklam sunucularına yönelik bir akış isteğini tanımlayan nesne. İsteklerde bir ağ kodu, özel öğe anahtarı ve isteğe bağlı bir API anahtarı ile diğer isteğe bağlı parametreler belirtilir.StreamManager
: İzleme ping'lerini tetikleme ve akış etkinliklerini yayıncıya yönlendirme gibi video akışı ile IMA DAI SDK arasındaki iletişimi yöneten bir nesne.
Ön koşullar
- Kayıtlı test cihazlarının bulunduğu bir Cast Geliştirici Konsolu hesabı.
- Cast Geliştirici Konsolu'na kaydedilmiş 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 Yayınlama 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ı.
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
akışları için gereklidir.
CONTENT_STREAM_MIMETYPE |
||||||||||
streamType
|
Bu değer için kullanılan dize değişmezi veya sabiti, gönderen platformuna göre değişir. | ||||||||||
customData
|
customData alanı, ek zorunlu alanların anahtar/değer deposunu içerir. Bu örnekte, DAI akışı parametrelerinizi içerir. Üretim uygulamasında, bunun yerine Cast alıcı uygulamanızın bu parametreleri sunucu tarafı isteğiyle almak için kullanacağı bir tanımlayıcıyı 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 load
request 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ö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.
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 load
request 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 load
request 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ı
Bu değerleri Cast Command and Control aracında 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 aşağıdaki 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, diğer 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ı Kılavuzu'nda gösterildiği gibi özel bir web alıcı oluşturun.
Alıcınızın kodu şu şekilde 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 Player Manager'ı alın
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. Alıcıyı başlatmadan önce alıcı bağlamını ve Player Manager'ı sabitler olarak komut dosyası etiketinde 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 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 dayalı bir Pod Serving 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 alın.
Yayın isteğiniz başarılı olursa yayının kimliğini almak için streamManager.getStreamId()
kullanın. Video Teknik İş Ortağınız (VTP) veya özel manifest düzenleyiciniz, bu akış kimliğini kullanarak bir manifest URL'si alma talimatları sağlar.
Manifest URL'nizi aldıktan sonra mevcut contentUrl
öğesini yeni manifestUrl
ile değiştirin.
Son olarak, değiştirilen akış manifestosunu döndürmeden önce loadStreamMetadata
yöntemini streamManager
üzerinde ç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 bir pod yayını akışında reklam isteme ve görüntüleme işlemlerini başarıyla tamamladığınızda, pod yayını oturumu tamamlandıktan sonra tüm kaynakları temizlemenizi öneririz. Akış oynatmayı durdurmak, tüm reklam izlemeyi durdurmak ve yüklenen tüm akış öğelerini serbest bırakmak için StreamManager.destroy()
işlevini çağırın.