Reklam araları
Web Sender SDK, belirli bir medya akışında reklam araları ve tamamlayıcı reklamlar için destek sağlar.
Reklam aralarının işleyiş şekli hakkında daha fazla bilgi için Web alıcısında reklam aralarına genel bakış başlıklı makaleyi inceleyin.
Aranın hem gönderende hem de alıcıda belirtilmesi mümkün olsa da platformlar arasında tutarlı davranış sergilenmesi için aranın Web Receiver ve Android TV Receiver'da belirtilmesi önerilir.
Web'de, BreakClip
ve Break
kullanarak bir yükleme komutunda reklam aralarını belirtin:
let breakClip1 = new BreakClip('bc0');
breakClip1.title = 'Clip title'
breakClip1.posterUrl = 'https://www.some.url';
breakClip1.duration = 60;
breakClip.whenSKippable = 5;
let breakClip2 = ...
let breakClip3 = ...
let break1 = new Break('b0', ['bc0', 'bc1', 'bc2'], 10);
let mediaInfo = new chrome.cast.media.MediaInfo(<contentId>, '<contentType');
...
mediaInfo.breakClips = [breakClip1, breakClip2, breakClip3];
mediaInfo.breaks = [break1];
let request = new chrome.cast.media.LoadRequest(mediaInfo);
cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request)
Parça API'lerini kullanma
Parça, metin (altyazı) nesnesi veya ses ya da video akışı nesnesi olabilir. Parça API'leri, uygulamanızda bu nesnelerle çalışmanıza olanak tanır.
Track
nesnesi, SDK'daki bir parçayı temsil eder. Bir kanal yapılandırabilir ve buna benzersiz bir kimlik atayabilirsiniz. Örneğin:
var englishSubtitle = new chrome.cast.media.Track(1, // track ID
chrome.cast.media.TrackType.TEXT);
englishSubtitle.trackContentId = 'https://some-url/caption_en.vtt';
englishSubtitle.trackContentType = 'text/vtt';
englishSubtitle.subtype = chrome.cast.media.TextTrackType.SUBTITLES;
englishSubtitle.name = 'English Subtitles';
englishSubtitle.language = 'en-US';
englishSubtitle.customData = null;
var frenchSubtitle = new chrome.cast.media.Track(2, // track ID
chrome.cast.media.TrackType.TEXT);
frenchSubtitle.trackContentId = 'https://some-url/caption_fr.vtt';
frenchSubtitle.trackContentType = 'text/vtt';
frenchSubtitle.subtype = chrome.cast.media.TextTrackType.SUBTITLES;
frenchSubtitle.name = 'French Subtitles';
frenchSubtitle.language = 'fr';
frenchSubtitle.customData = null;
var frenchAudio = new chrome.cast.media.Track(3, // track ID
chrome.cast.media.TrackType.AUDIO);
frenchAudio.trackContentId = 'trk0001';
frenchAudio.trackContentType = 'audio/mp3';
frenchAudio.subtype = null;
frenchAudio.name = 'French Audio';
frenchAudio.language = 'fr';
frenchAudio.customData = null;
Bir medya öğesinde birden fazla parça olabilir. Örneğin, birden fazla altyazı (her biri farklı bir dil için) veya birden fazla alternatif ses akışı (farklı diller için) olabilir.
MediaInfo
bir medya öğesini modelleyen sınıftır. Bir Track
nesne koleksiyonunu bir medya öğesiyle ilişkilendirmek için tracks
özelliğini güncellersiniz. Bu ilişkilendirme, medya alıcıya yüklenmeden önce yapılmalıdır:
var tracks = [englishSubtitle, frenchSubtitle, frenchAudio];
var mediaInfo = new chrome.cast.media.MediaInfo(mediaURL);
mediaInfo.contentType = 'video/mp4';
mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();
mediaInfo.customData = null;
mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;
mediaInfo.textTrackStyle = new chrome.cast.media.TextTrackStyle();
mediaInfo.duration = null;
mediaInfo.tracks = tracks;
Etkin parçaları medya
activeTrackIds
isteğinde ayarlayabilirsiniz.
Medya öğesi yüklendikten sonra, medya öğesiyle ilişkilendirilmiş bir veya daha fazla parçayı EditTracksInfoRequest(opt_activeTrackIds, opt_textTrackStyle)
'ı çağırıp opt_activeTrackIds
içinde etkinleştirilecek parçaların kimliklerini ileterek de etkinleştirebilirsiniz. Her iki parametrenin de isteğe bağlı olduğunu ve etkin parçaları veya stilleri kendi tercihinize göre ayarlayabileceğinizi unutmayın. Örneğin, Fransızca altyazıyı (2
) ve Fransızca sesi (3
) etkinleştirme adımlarını aşağıda bulabilirsiniz:
var activeTrackIds = [2, 3];
var tracksInfoRequest = new chrome.cast.media.EditTracksInfoRequest(activeTrackIds);
media.editTracksInfo(tracksInfoRequest, successCallback, errorCallback);
Mevcut medyadan tüm ses veya video parçalarını kaldırmak için mediaInfo.tracks=null
(boş bir dizi) ayarlayın ve medyayı yeniden yükleyin.
Mevcut medyadan tüm metin parçalarını kaldırmak için (ör. altyazıları kapatmak) aşağıdakilerden birini yapın:
var activeTrackIds = [2, 3];
(daha önce gösterilmişti) öğesini yalnızca ses parçası olan [3] öğesini içerecek şekilde güncelleyin.mediaInfo.tracks=null
olarak ayarlayın. Metin altyazıları (track.hidden
) kapatmak için medyayı yeniden yüklemeniz gerekmez. Daha önce etkinleştirilmiş birtrackId
içermeyen biractiveTracksId
dizisi göndermek metin parçasını devre dışı bırakır.
Metin parçalarına stil uygulama
TextTrackStyle
bir metin parçasının stil bilgilerini kapsayan nesnedir. TextTrackStyle
nesnesi oluşturduktan veya mevcut bir nesneyi güncelledikten sonra, editTrackInfo
yöntemini çağırarak bu nesneyi şu anda oynatılan medya öğesine uygulayabilirsiniz:
var textTrackStyle = new chrome.cast.media.TextTrackStyle();
var tracksInfoRequest = new chrome.cast.media.EditTracksInfoRequest(textTrackStyle);
media.editTracksInfo(tracksInfoRequest, successCallback, errorCallback);
Geri arama sonuçlarıyla (başarı veya hata) isteğin durumunu takip edebilir ve göndereni buna göre güncelleyebilirsiniz.
Uygulamalar, kullanıcıların metin parçalarının stilini sistemin veya uygulamanın kendisinin sağladığı ayarları kullanarak güncellemesine izin vermelidir.
Aşağıdaki metin parçası stil öğelerini şekillendirebilirsiniz:
- Ön plan (metin) rengi ve opaklığı
- Arka plan rengi ve şeffaflık
- Kenar türü
- Kenar rengi
- Yazı tipi ölçeği
- Yazı Tipi Ailesi
- Yazı Tipi Stili
Örneğin, metin rengini% 75 opaklıkta kırmızı olarak ayarlamak için aşağıdaki kodu kullanın:
var textTrackStyle = new chrome.cast.media.TextTrackStyle();
textTrackStyle.foregroundColor = '#80FF0000';
Ses düzeyi kontrolü
Alıcı sesini ayarlamak için RemotePlayer
ve RemotePlayerController
simgelerini kullanabilirsiniz.
function changeVolume(newVolume) {
player.volumeLevel = newVolume;
playerController.setVolumeLevel();
// Update sender UI to reflect change
}
Gönderen uygulama, ses düzeyini kontrol etmek için aşağıdaki yönergelere uymalıdır:
- Gönderen uygulamasının, alıcıyla senkronize olması gerekir. Böylece gönderen kullanıcı arayüzü, her zaman alıcıya göre ses seviyesini bildirir. Gönderendeki ses seviyesini korumak için
RemotePlayerEventType.VOLUME_LEVEL_CHANGED
veRemotePlayerEventType.IS_MUTED_CHANGED
geri aramalarını kullanın. Daha fazla bilgi için Durum güncellemeleri bölümüne bakın. - Gönderen uygulamaları, ses düzeyini belirli ve önceden tanımlanmış bir düzeye ayarlamamalı veya uygulama alıcıda yüklendiğinde ses düzeyini gönderen cihazın zil sesi/medya ses düzeyine ayarlamamalıdır.
Tasarım Kontrol Listesi'ndeki Gönderen ses düzeyi kontrolleri bölümüne bakın.
Alıcıya medya mesajları gönderme
Media Messages
, gönderenden alıcıya gönderilebilir. Örneğin, alıcıya SKIP_AD
iletisi göndermek için:
// Get a handle to the skip button element
const skipButton = document.getElementById('skip');
skipButton.addEventListener("click", function() {
if (castSession) {
const media = castSession.getMediaSession();
castSession.sendMessage('urn:x-cast:com.google.cast.media', {
type: 'SKIP_AD',
requestId: 1,
mediaSessionId: media.mediaSessionId
});
}
});
Gelişmelerin paylaşılması
Aynı alıcıya birden fazla gönderen bağlandığında, değişiklikler diğer gönderenler tarafından başlatılmış olsa bile her gönderenin alıcıdaki değişikliklerden haberdar olması önemlidir.
Bu amaçla, uygulamanız RemotePlayerController
üzerinde gerekli tüm dinleyicileri kaydetmelidir.
Mevcut medyanın
TextTrackStyle
değişirse bağlı tüm gönderenlere bildirim gönderilir
ve mevcut medya oturumunun ilgili özellikleri (ör. MediaInfo
alanının
activeTrackIds
ve textTrackStyle
) geri çağırmalarda gönderenlere gönderilir. Bu durumda, alıcı SDK'sı yeni stilin önceki stilden farklı olup olmadığını doğrulamaz ve bağlı tüm gönderenleri buna bakılmaksızın bilgilendirir.
İlerleme göstergesi
Gönderende ilerleme göstergesiyle oynatma konumunu göstermek çoğu uygulama için zorunludur. Cast API'leri, bu ve diğer senaryolarda bant genişliği tüketimini optimize eden Cast medya protokolünü kullanır. Bu nedenle, kendi durum senkronizasyonunuzu uygulamanız gerekmez. API'leri kullanarak medya oynatma için ilerleme göstergesinin doğru şekilde uygulanmasıyla ilgili bilgileri CastVideos-chrome örnek uygulamasında bulabilirsiniz.
CORS koşulları
Google Cast, uyarlanabilir medya akışı için CORS başlıklarının bulunmasını gerektirir. Ancak basit MP4 medya akışları, parça içeriyorsa CORS gerektirir. Parçaları herhangi bir medyada etkinleştirmek istiyorsanız hem parça akışlarınız hem de medya akışlarınız için CORS'u etkinleştirmeniz gerekir. Bu nedenle, sunucunuzdaki basit mp4 medyanız için CORS başlıklarınız yoksa ve ardından basit bir altyazı parçası eklerseniz sunucunuzu uygun CORS başlıklarını içerecek şekilde güncellemediğiniz sürece medyayı yayınlayamazsınız.
Şu başlıklara ihtiyacınız var: Content-Type
, Accept-Encoding
ve Range
.
Son iki başlığın (Accept-Encoding
ve Range
) daha önce ihtiyaç duymamış olabileceğiniz ek başlıklar olduğunu unutmayın.
"*" joker karakterleri, Access-Control-Allow-Origin
başlığı için kullanılamaz. Sayfada korumalı medya içeriği varsa joker karakter yerine alan adı kullanması gerekir.
Web sayfasını yeniden yüklemeden oturuma devam etme
Mevcut bir CastSession
oturumuna devam etmek için
requestSessionById(sessionId)
ile katılmaya çalıştığınız oturumun sessionId
kullanın.
sessionId
, arama yapıldıktan sonra getSessionId()
kullanılarak etkin CastSession
üzerinde loadMedia()
bulunabilir.
Önerilen yaklaşım şudur:
- Oturumu başlatmak için
loadMedia()
numaralı telefonu arayın. sessionId
öğesini yerel olarak depolama- Gerektiğinde
requestSessionById(sessionId)
kullanarak oturuma yeniden katılın.
let sessionId;
function rejoinCastSession() {
chrome.cast.requestSessionById(sessionId);
// Add any business logic to load new content or only resume the session
}
document.getElementById('play-button').addEventListener(("click"), function() {
if (sessionId == null) {
let castSession = cast.framework.CastContext.getInstance().getCurrentSession();
if (castSession) {
let mediaInfo = createMediaInfo();
let request = new chrome.cast.media.LoadRequest(mediaInfo);
castSession.loadMedia(request)
sessionId = CastSession.getSessionId();
} else {
console.log("Error: Attempting to play media without a Cast Session");
}
} else {
rejoinCastSession();
}
});
Sonraki adımlar
Web gönderen uygulamanıza ekleyebileceğiniz özellikler burada sona eriyor. Artık başka bir platform için gönderen uygulaması (Android veya iOS) oluşturabilir ya da alıcı uygulaması oluşturabilirsiniz.