Bu sayfada, Özel Web Alıcısı uygulamasında kullanılabilen özelliklerin kod snippet'leri ve açıklamaları yer almaktadır.
- Web Recipientr ile sağlanan yerleşik oynatıcı kullanıcı arayüzünü temsil eden bir
cast-media-player
öğesi. background-image
,splash-image
vefont-family
gibi çeşitli kullanıcı arayüzü öğelerinin stilini belirlemek içincast-media-player
öğesi için CSS benzeri özel stil.- Web Alıcı çerçevesini yüklemek için kullanılan komut dosyası öğesi.
- Mesajlara müdahale etmek ve etkinlikleri işlemek için JavaScript kodu.
- Otomatik oynatma için sıraya geç.
- Oynatmayı yapılandırma seçenekleri.
- Web Alıcısı bağlamını ayarlama seçenekleri.
- Web Alıcısı uygulaması tarafından desteklenen komutları ayarlama seçenekleri.
- Web Alıcısı uygulamasını başlatmak için bir JavaScript çağrısı.
Uygulama yapılandırması ve seçenekleri
Uygulamayı yapılandırma
CastReceiverContext
, geliştiriciye sunulan en dış sınıftır. Temel kitaplıkların yüklenmesini ve Web Receiver SDK'sının başlatılmasını yönetir. SDK, uygulama geliştiricilerin SDK'yı CastReceiverOptions
aracılığıyla yapılandırmasına olanak tanıyan API'ler sağlar.
Bu yapılandırmalar, uygulama lansmanı başına bir kez değerlendirilir ve start
çağrısındaki isteğe bağlı parametre ayarlanırken SDK'ya iletilir.
Aşağıdaki örnekte, bir gönderen bağlantısının hâlâ aktif olarak bağlı olup olmadığının belirlenmesi için varsayılan davranışın nasıl geçersiz kılınacağı gösterilmektedir. Web Alıcısı bir gönderenle maxInactivity
saniye boyunca iletişim kuramadığında bir SENDER_DISCONNECTED
etkinliği gönderilir. Aşağıdaki yapılandırma, bu zaman aşımını geçersiz kılar. Bu, IDLE
durumunda hiç bağlı gönderen olmadığında Web Alıcısı uygulamasının Chrome Remote Hata Ayıklayıcı oturumunu kapatmasını engellediği için sorunlarda hata ayıklarken yararlı olabilir.
const context = cast.framework.CastReceiverContext.getInstance();
const options = new cast.framework.CastReceiverOptions();
options.maxInactivity = 3600; // Development only
context.start(options);
Oynatıcıyı yapılandırma
Web Receiver SDK'sı içerik yüklerken DRM bilgileri, yapılandırmaları yeniden deneme ve istek işleyicileri gibi oynatma değişkenlerini cast.framework.PlaybackConfig
kullanarak yapılandırmak için bir yol sağlar.
Bu bilgiler PlayerManager
tarafından işlenir ve oynatıcılar oluşturulurken değerlendirilir. Web Receiver SDK'sına her yeni yükleme iletildiğinde oynatıcılar oluşturulur. Oynatıcı oluşturulduktan sonra PlaybackConfig
üzerinde yapılan değişiklikler sonraki içerik yüklemesinde değerlendirilir. SDK, PlaybackConfig
üzerinde değişiklik yapmak için aşağıdaki yöntemleri sunar.
CastReceiverContext
başlatılırken varsayılan yapılandırma seçeneklerini geçersiz kılmak içinCastReceiverOptions.playbackConfig
.- Mevcut yapılandırmayı almak için
PlayerManager.getPlaybackConfig()
. - Mevcut yapılandırmayı geçersiz kılmak için
PlayerManager.setPlaybackConfig()
. Bu ayar, sonraki tüm yüklemeler için veya tekrar geçersiz kılınana kadar uygulanır. PlayerManager.setMediaPlaybackInfoHandler()
aracını kullanın. İşleyici, oyuncu oluşturulmadan hemen önce çağrılır. Burada yapılan değişiklikler kalıcı değildir vegetPlaybackConfig()
sorgularına dahil edilmez. Sonraki medya öğesi yüklendiğinde bu işleyici tekrar çağrılır.
Aşağıdaki örnekte, CastReceiverContext
başlatılırken PlaybackConfig
öğesinin nasıl ayarlanacağı gösterilmektedir. Yapılandırma, manifest almak için giden istekleri geçersiz kılar. İşleyici, CORS Access-Control isteklerinin çerezler veya yetkilendirme başlıkları gibi kimlik bilgileri kullanılarak yapılması gerektiğini belirtir.
const playbackConfig = new cast.framework.PlaybackConfig();
playbackConfig.manifestRequestHandler = requestInfo => {
requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});
Aşağıdaki örnekte, PlayerManager
içinde sağlanan getter ve setter öğelerini kullanarak PlaybackConfig
öğesinin nasıl geçersiz kılınacağı gösterilmektedir. Bu ayar, oynatıcıyı 1 segment yüklendikten sonra içerik oynatmaya devam edecek şekilde yapılandırır.
const playerManager =
cast.framework.CastReceiverContext.getInstance().getPlayerManager();
const playbackConfig = (Object.assign(
new cast.framework.PlaybackConfig(), playerManager.getPlaybackConfig()));
playbackConfig.autoResumeNumberOfSegments = 1;
playerManager.setPlaybackConfig(playbackConfig);
Aşağıdaki örnekte, medya oynatma bilgi işleyici kullanılarak belirli bir yükleme isteği için PlaybackConfig
öğesinin nasıl geçersiz kılınacağı gösterilmektedir. İşleyici, licenseUrl
öğesini geçerli öğenin contentId
öğesinden elde etmek için getLicenseUrlForMedia
yöntemini uygulayan bir uygulamayı çağırır.
playerManager.setMediaPlaybackInfoHandler((loadRequestData, playbackConfig) => {
const mediaInformation = loadRequestData.media;
playbackConfig.licenseUrl = getLicenseUrlForMedia(mediaInformation.contentId);
return playbackConfig;
});
Etkinlik işleyici
Web Receiver SDK'sı, Web Alıcısı uygulamanızın oynatıcı etkinliklerini işlemesine olanak tanır. Etkinlik işleyici, işleyiciyi tetiklemesi gereken etkinlikleri belirten bir cast.framework.events.EventType
parametresi (veya bu parametrelerden oluşan bir dizi) alır. Hata ayıklama için yararlı olabilecek önceden yapılandırılmış cast.framework.events.EventType
dizilerini, cast.framework.events.category
bölümünde bulabilirsiniz.
Etkinlik parametresi, etkinlik hakkında ek bilgiler sağlar.
Örneğin, bir mediaStatus
değişikliğinin ne zaman yayınlandığını öğrenmek istiyorsanız etkinliği işlemek için aşağıdaki mantığı kullanabilirsiniz:
const playerManager =
cast.framework.CastReceiverContext.getInstance().getPlayerManager();
playerManager.addEventListener(
cast.framework.events.EventType.MEDIA_STATUS, (event) => {
// Write your own event handling code, for example
// using the event.mediaStatus value
});
İletileri müdahale etme
Web Receiver SDK'sı, Web Alıcısı uygulamanızın mesajlara müdahale etmesine ve bu mesajlarda özel kod yürütmesine olanak tanır. Mesaj müdahale aracı, ne tür mesajlara müdahale edilmesi gerektiğini belirten bir cast.framework.messages.MessageType
parametresi alır.
Müdahale aracı, değiştirilen istek veya değiştirilen istek değeriyle çözümlenen bir Promise döndürmelidir. null
döndürüldüğünde varsayılan mesaj işleyicinin çağrılması engellenir. Daha fazla ayrıntı için Medya yükleme bölümüne bakın.
Örneğin, yükleme isteği verilerini değiştirmek isterseniz verileri engellemek ve değiştirmek için aşağıdaki mantığı kullanabilirsiniz:
const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD, loadRequestData => {
const error = new cast.framework.messages.ErrorData(
cast.framework.messages.ErrorType.LOAD_FAILED);
if (!loadRequestData.media) {
error.reason = cast.framework.messages.ErrorReason.INVALID_PARAM;
return error;
}
if (!loadRequestData.media.entity) {
return loadRequestData;
}
return thirdparty.fetchAssetAndAuth(loadRequestData.media.entity,
loadRequestData.credentials)
.then(asset => {
if (!asset) {
throw cast.framework.messages.ErrorReason.INVALID_REQUEST;
}
loadRequestData.media.contentUrl = asset.url;
loadRequestData.media.metadata = asset.metadata;
loadRequestData.media.tracks = asset.tracks;
return loadRequestData;
}).catch(reason => {
error.reason = reason; // cast.framework.messages.ErrorReason
return error;
});
});
context.start();
Hata işleme
Mesaj engelleyicide hatalar ortaya çıktığında Web Alıcı uygulamanız uygun cast.framework.messages.ErrorType
ve cast.framework.messages.ErrorReason
döndürmelidir.
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD, loadRequestData => {
const error = new cast.framework.messages.ErrorData(
cast.framework.messages.ErrorType.LOAD_CANCELLED);
if (!loadRequestData.media) {
error.reason = cast.framework.messages.ErrorReason.INVALID_PARAM;
return error;
}
...
return fetchAssetAndAuth(loadRequestData.media.entity,
loadRequestData.credentials)
.then(asset => {
...
return loadRequestData;
}).catch(reason => {
error.reason = reason; // cast.framework.messages.ErrorReason
return error;
});
});
Mesaj müdahalesi ve etkinlik işleyici
Mesaj müdahalesi ile etkinlik işleyici arasındaki bazı önemli farklar şunlardır:
- Etkinlik işleyici, istek verilerini değiştirmenize izin vermez.
- Analizleri veya özel bir işlevi tetiklemek için en iyi yöntem bir etkinlik işleyicidir.
playerManager.addEventListener(cast.framework.events.category.CORE,
event => {
console.log(event);
});
- Mesaj müdahalesi bir mesajı dinlemenize, müdahale etmenize ve istek verilerini değiştirmenize olanak tanır.
- Mesaj müdahalesinin, veri isteğinde bulunmayla ilgili özel mantığı işlemek için kullanılması en iyi yöntemdir.
Medya yükleniyor
MediaInformation
, cast.framework.messages.MessageType.LOAD
mesajına medya yüklemek için entity
, contentUrl
ve contentId
gibi çok sayıda özellik sunar.
entity
, hem gönderen hem de alıcı uygulamalarınız için uygulamanızda kullanmanız önerilen özelliktir. Mülk, bir oynatma listesi veya belirli bir medya içeriği olabilen bir derin bağlantı URL'sidir.
contentUrl
, oynatılabilir bir URL için tasarlanmıştır ve kullanılabilir olduğunda kullanılabilir.
contentId
, değerin medya URL'si, gerçek kimlik veya özel arama için anahtar parametresi olup olmamasıyla ilgili belirsizlik nedeniyle kullanımdan kaldırılmıştır.
Gerçek kimlik veya anahtar parametreleri depolamak için entity
, medya URL'si için de contentUrl
kullanılması önerilir. Bunun bir örneği, LOAD
isteğinde entity
öğesinin bulunduğu ve oynatılabilir contentUrl
öğesinin alındığı aşağıdaki snippet'te gösterilmiştir:
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD, loadRequestData => {
...
if (!loadRequestData.media.entity) {
// Copy the value from contentId for legacy reasons if needed
loadRequestData.media.entity = loadRequestData.media.contentId;
}
return thirdparty.fetchAssetAndAuth(loadRequestData.media.entity,
loadRequestData.credentials)
.then(asset => {
loadRequestData.media.contentUrl = asset.url;
...
return loadRequestData;
});
});
Cihaz özellikleri
getDeviceCapabilities
yöntemi, bağlı yayın cihazı ve ona bağlı video veya ses cihazı hakkında cihaz bilgilerini sağlar. getDeviceCapabilities
yöntemi; Google Asistan, Bluetooth ve bağlı ekran ve ses cihazları için destek bilgileri sağlar.
Bu yöntem, belirtilen numaralandırmanın cihaz özelliklerini elde etmek için belirtilen enum'lardan birini geçirerek sorgulayabileceğiniz bir nesne döndürür. Sıralamalar cast.framework.system.DeviceCapabilities
içinde tanımlanır.
Bu örnekte, Web Alıcısı cihazın IS_HDR_SUPPORTED
ve IS_DV_SUPPORTED
tuşlarıyla HDR ve DolbyVision'ı (DV) oynatıp oynatamayacağını sırasıyla kontrol eder.
const context = cast.framework.CastReceiverContext.getInstance();
context.addEventListener(cast.framework.system.EventType.READY, () => {
const deviceCapabilities = context.getDeviceCapabilities();
if (deviceCapabilities &&
deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_HDR_SUPPORTED]) {
// Write your own event handling code, for example
// using the deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_HDR_SUPPORTED] value
}
if (deviceCapabilities &&
deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_DV_SUPPORTED]) {
// Write your own event handling code, for example
// using the deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_DV_SUPPORTED] value
}
});
context.start();
Kullanıcı etkileşimini işleme
Bir kullanıcı; gönderen uygulamaları (Web, Android ve iOS), Asistan özellikli cihazlardaki sesli komutları, akıllı ekranlardaki dokunma kontrolleri ve Android TV cihazlarındaki uzaktan kumandaları kullanarak Web Alıcısı uygulamanızla etkileşimde bulunabilir. Cast SDK'sı, Web Alıcısı uygulamasının bu etkileşimleri işlemesini, uygulama kullanıcı arayüzünü kullanıcı işlemi durumları ile güncellemesini ve isteğe bağlı olarak arka uç hizmetlerini güncellemek için değişiklikleri göndermesini sağlayan çeşitli API'ler sağlar.
Desteklenen medya komutları
Kullanıcı arayüzü kontrolleri durumları, iOS ve Android gönderen genişletilmiş kumandaları, dokunmatik cihazlarda çalışan alıcı ve uzaktan kumanda uygulamaları ve Android TV cihazlarındaki alıcı uygulamaları için MediaStatus.supportedMediaCommands
aracılığıyla belirlenir. Mülkte belirli bir bit tabanlı Command
etkinleştirildiğinde, söz konusu işlemle ilgili düğmeler etkinleştirilir. Değer ayarlanmazsa düğme devre dışı bırakılır. Bu değerler Web Alıcısı'nda şu şekilde değiştirilebilir:
- Özel
Commands
özelliğini ayarlamak içinPlayerManager.setSupportedMediaCommands
kullanma addSupportedMediaCommands
ile yeni bir komut eklemeremoveSupportedMediaCommands
kullanarak mevcut bir komutu kaldırma.
playerManager.setSupportedMediaCommands(cast.framework.messages.Command.SEEK |
cast.framework.messages.Command.PAUSE);
Alıcı, güncellenen MediaStatus
dosyasını hazırladığında supportedMediaCommands
özelliğindeki değişiklikler dahil edilir. Durum yayınlandığında, bağlı gönderen uygulamaları kullanıcı arayüzündeki düğmeleri uygun şekilde günceller.
Desteklenen medya komutları ve dokunmatik cihazlar hakkında daha fazla bilgi için Accessing UI controls
rehberine bakın.
Kullanıcı işlemi durumlarını yönetme
Kullanıcılar kullanıcı arayüzüyle etkileşimde bulunduğunda veya sesli komut gönderdiklerinde, oynatılan öğeyle ilgili içeriğin ve özelliklerin oynatılmasını kontrol edebilirler. Oynatmayı kontrol eden istekler SDK tarafından otomatik olarak işlenir. Oynatılmakta olan öğenin LIKE
komutu gibi özelliklerini değiştiren istekler alıcı uygulamanın bunları işlemesini gerektirir. SDK, bu tür istekleri işlemek için bir dizi API sağlar. Bu isteklerin desteklenmesi için aşağıdakiler yapılmalıdır:
- Medya öğesi yüklerken
MediaInformation
öğesiniuserActionStates
kullanıcının tercihleriyle ayarlayın. USER_ACTION
iletiye müdahale edin ve istenen işlemi belirleyin.- Kullanıcı arayüzünü güncellemek için
MediaInformation
UserActionState
uygulamasını güncelleyin.
Aşağıdaki snippet LOAD
isteğine müdahale eder ve LoadRequestData
MediaInformation
parametresini doldurur. Bu durumda, kullanıcı yüklenen
içeriği beğenir.
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD, (loadRequestData) => {
const userActionLike = new cast.framework.messages.UserActionState(
cast.framework.messages.UserAction.LIKE);
loadRequestData.media.userActionStates = [userActionLike];
return loadRequestData;
});
Aşağıdaki snippet, USER_ACTION
mesajına müdahale eder ve istenen değişiklikle arka ucu çağırma işlemini gerçekleştirir. Ardından, alıcıdaki UserActionState
öğesini güncellemek için bir çağrı yapar.
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.USER_ACTION,
(userActionRequestData) => {
// Obtain the media information of the current content to associate the action to.
let mediaInfo = playerManager.getMediaInformation();
// If there is no media info return an error and ignore the request.
if (!mediaInfo) {
console.error('Not playing media, user action is not supported');
return new cast.framework.messages.ErrorData(messages.ErrorType.BAD_REQUEST);
}
// Reach out to backend services to store user action modifications. See sample below.
return sendUserAction(userActionRequestData, mediaInfo)
// Upon response from the backend, update the client's UserActionState.
.then(backendResponse => updateUserActionStates(backendResponse))
// If any errors occurred in the backend return them to the cast receiver.
.catch((error) => {
console.error(error);
return error;
});
});
Aşağıdaki snippet, bir arka uç hizmetine yapılan çağrıyı simüle eder. İşlev, kullanıcının istediği değişiklik türünü görmek için UserActionRequestData
öğesini kontrol eder ve yalnızca işlem arka uç tarafından destekleniyorsa bir ağ çağrısı yapar.
function sendUserAction(userActionRequestData, mediaInfo) {
return new Promise((resolve, reject) => {
switch (userActionRequestData.userAction) {
// Handle user action changes supported by the backend.
case cast.framework.messages.UserAction.LIKE:
case cast.framework.messages.UserAction.DISLIKE:
case cast.framework.messages.UserAction.FOLLOW:
case cast.framework.messages.UserAction.UNFOLLOW:
case cast.framework.messages.UserAction.FLAG:
case cast.framework.messages.UserAction.SKIP_AD:
let backendResponse = {userActionRequestData: userActionRequestData, mediaInfo: mediaInfo};
setTimeout(() => {resolve(backendResponse)}, 1000);
break;
// Reject all other user action changes.
default:
reject(
new cast.framework.messages.ErrorData(cast.framework.messages.ErrorType.INVALID_REQUEST));
}
});
}
Aşağıdaki snippet, UserActionRequestData
öğesini alır ve UserActionState
öğesini MediaInformation
öğesine ekler veya buradan kaldırır. MediaInformation
öğesinin UserActionState
öğesinin güncellenmesi, istenen işlemle ilişkilendirilen düğmenin durumunu değiştirir. Bu değişiklik; akıllı ekran kontrolleri kullanıcı arayüzü, uzaktan kumanda uygulaması ve Android TV kullanıcı arayüzüne yansıtılmıştır. Ayrıca, iOS ve Android gönderenleri için genişletilmiş denetleyicinin kullanıcı arayüzünü güncellemek amacıyla giden MediaStatus
mesajları üzerinden yayınlanır.
function updateUserActionStates(backendResponse) {
// Unwrap the backend response.
let mediaInfo = backendResponse.mediaInfo;
let userActionRequestData = backendResponse.userActionRequestData;
// If the current item playing has changed, don't update the UserActionState for the current item.
if (playerManager.getMediaInformation().entity !== mediaInfo.entity) {
return;
}
// Check for existing userActionStates in the MediaInformation.
// If none, initialize a new array to populate states with.
let userActionStates = mediaInfo.userActionStates || [];
// Locate the index of the UserActionState that will be updated in the userActionStates array.
let index = userActionStates.findIndex((currUserActionState) => {
return currUserActionState.userAction == userActionRequestData.userAction;
});
if (userActionRequestData.clear) {
// Remove the user action state from the array if cleared.
if (index >= 0) {
userActionStates.splice(index, 1);
}
else {
console.warn("Could not find UserActionState to remove in MediaInformation");
}
} else {
// Add the UserActionState to the array if enabled.
userActionStates.push(
new cast.framework.messages.UserActionState(userActionRequestData.userAction));
}
// Update the UserActionState array and set the new MediaInformation
mediaInfo.userActionStates = userActionStates;
playerManager.setMediaInformation(mediaInfo, true);
return;
}
Sesli komutlar
Aşağıdaki medya komutları, şu anda Asistan özellikli cihazlar için Web Alıcı SDK'sında desteklenmektedir. Bu komutların varsayılan uygulamaları cast.framework.PlayerManager
sayfasında bulunmaktadır.
Komut | Açıklama |
---|---|
Play | Çalmayı duraklatma durumundan oynatın veya devam ettirin. |
Duraklat | Şu anda oynatılan içeriği duraklatın. |
Önceki | Medya sıranızdaki önceki medya öğesine atlayın. |
İleri | Medya sıranızdaki sonraki medya öğesine atlayın. |
Durdur | Şu anda oynatılan medyayı durdurun. |
Hiçbiri Tekrarlama | Sıradaki son öğenin oynatılması tamamlandıktan sonra sıradaki medya öğelerinin tekrarlanmasını devre dışı bırak. |
Tek Parça Tekrarla | Şu anda oynatılan medyayı süresiz olarak tekrarla. |
Tümünü Tekrarla | Sıradaki son öğe oynatıldığında, sıradaki tüm öğeleri yineleyin. |
Tümünü Tekrarla ve Karıştır | Sıradaki son öğenin oynatılması tamamlandıktan sonra sırayı karıştırın ve sıradaki tüm öğeleri tekrarlayın. |
Karıştır | Medya sıranızdaki medya öğelerini karıştırın. |
Altyazılar AÇIK / KAPALI | Medyanız için altyazı özelliğini etkinleştirin / devre dışı bırakın. Etkinleştirme / Devre Dışı Bırakma, dile göre de kullanılabilir. |
Mutlak zamana sar | Belirtilen mutlak zamana atlar. |
Geçerli saate göreli zamana sar. | Geçerli oynatma süresine göre, belirtilen dönemde ileri veya geri atlar. |
Tekrar Oyna | Oynatılmakta olan medyayı yeniden başlatın veya hiçbir şey oynatılmıyorsa son oynatılan medya öğesini oynatın. |
Oynatma hızını ayarla | Medya oynatma hızını değiştirin. Bu, varsayılan olarak işlenmelidir. Gelen ücret isteklerini geçersiz kılmak için SET_PLAYBACK_RATE mesaj müdahale aracını kullanabilirsiniz. |
Sesli desteklenen medya komutları
Sesli komutun Asistan özellikli bir cihazda medya komutu tetiklemesini önlemek için öncelikle desteklemeyi planladığınız desteklenen medya komutlarını ayarlamanız gerekir. Ardından CastReceiverOptions.enforceSupportedCommands
özelliğini etkinleştirerek bu komutları zorunlu kılmanız gerekir. Cast SDK'sı gönderenlerdeki ve dokunmatik cihazlardaki kullanıcı arayüzü, bu yapılandırmaları yansıtacak şekilde değişecektir. İşaret etkinleştirilmemişse gelen
sesli komutlar yürütülür.
Örneğin, gönderen uygulamalarınızdan ve dokunmatik özellikli cihazlarınızda PAUSE
uygulamasına izin verirseniz alıcınızı bu ayarları yansıtacak şekilde de yapılandırmanız gerekir. Yapılandırıldığında, gelen sesli komutlar desteklenen komutlar listesine dahil edilmezse atlanır.
Aşağıdaki örnekte, CastReceiverContext
başlatılırken CastReceiverOptions
öğesini sağlıyoruz. PAUSE
komutu için destek ekledik ve oynatıcıyı yalnızca bu komutu destekleyecek şekilde zorunlu kıldık. Artık bir sesli komut SEEK
gibi başka bir işlem isterse reddedilir. Komutun henüz desteklenmediğine dair kullanıcı bilgilendirilir.
const context = cast.framework.CastReceiverContext.getInstance();
context.start({
enforceSupportedCommands: true,
supportedCommands: cast.framework.messages.Command.PAUSE
});
Kısıtlamak istediğiniz her komut için ayrı bir mantık uygulayabilirsiniz. enforceSupportedCommands
işaretini kaldırın. Kısıtlamak istediğiniz her komut için gelen mesajı kesebilirsiniz. Burada, Asistan özellikli cihazlara verilen SEEK
komutlarının Web Alıcısı uygulamanızda arama tetiklememesi için SDK tarafından sağlanan isteği yakalarız.
Uygulamanızın desteklemediği medya komutları için NOT_SUPPORTED
gibi uygun bir hata nedeni döndürün.
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.SEEK,
seekData => {
// Block seeking if the SEEK supported media command is disabled
if (!(playerManager.getSupportedMediaCommands() & cast.framework.messages.Command.SEEK)) {
let e = new cast.framework.messages.ErrorData(cast.framework.messages.ErrorType
.INVALID_REQUEST);
e.reason = cast.framework.messages.ErrorReason.NOT_SUPPORTED;
return e;
}
return seekData;
});
Ses etkinliğinden arka plan yapma
Cast platformu, kullanıcının konuşmasını dinleme veya yanıt verme gibi Asistan etkinliği nedeniyle uygulamanızın sesini arka plana alırsa etkinlik başladığında
FocusState
Web Alıcısı uygulamasına NOT_IN_FOCUS
mesajı gönderilir. Etkinlik sona erdiğinde IN_FOCUS
içeren başka bir mesaj gönderilir.
Uygulamanıza ve oynatılan medyaya bağlı olarak, FocusState
NOT_IN_FOCUS
olduğunda FOCUS_STATE
mesaj türüne müdahale ederek medyayı duraklatmak isteyebilirsiniz.
Örneğin, Asistan bir kullanıcı sorgusuna yanıt veriyorsa sesli kitap çalmayı duraklatmak iyi bir kullanıcı deneyimidir.
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.FOCUS_STATE,
focusStateRequestData => {
// Pause content when the app is out of focus. Resume when focus is restored.
if (focusStateRequestData.state == cast.framework.messages.FocusState.NOT_IN_FOCUS) {
playerManager.pause();
} else {
playerManager.play();
}
return focusStateRequestData;
});
Sesle belirtilen altyazı dili
Kullanıcı, altyazıların dilini açıkça belirtmediğinde, altyazılar için kullanılan dil, komutun konuşulduğu dille aynı olur.
Bu senaryolarda gelen mesajın isSuggestedLanguage
parametresi, ilişkili dilin kullanıcı tarafından önerilip önerilmediğini veya açıkça istenip istenmediğini belirtir.
Örneğin isSuggestedLanguage
, "Ok Google, altyazıları aç" komutu için true
olarak ayarlanmıştır çünkü dil, komutun konuşulduğu dile göre belirlenir. Dil açıkça istenirse (ör. "Ok Google, İngilizce altyazıları aç") isSuggestedLanguage
ayarı false
olarak ayarlanır.
Meta veri ve ses yayınlama
Sesli komutlar varsayılan olarak Web Alıcısı tarafından işlense de, içeriğinizin meta verilerinin eksiksiz ve doğru olduğundan emin olmanız gerekir. Bu, sesli komutların Asistan tarafından düzgün bir şekilde işlenmesini ve meta verilerin Google Home uygulaması gibi yeni arayüz türlerinde ve Google Home Hub gibi akıllı ekranlarda düzgün bir şekilde görünmesini sağlar.
Akış aktarma
Oturum durumunun korunması, akış aktarımının temelini oluşturur. Bu aşamada kullanıcılar, mevcut ses ve video akışlarını sesli komutlar, Google Home uygulaması veya akıllı ekranlar kullanarak cihazlar arasında taşıyabilir. Medyanın oynatılması bir cihazda (kaynak) durdurulur ve başka bir cihazda (hedef) devam eder. En yeni donanım yazılımına sahip her yayın cihazı, akış aktarımında kaynak veya hedef olarak kullanılabilir.
Akış aktarımı için etkinlik akışı:
- Kaynak cihazda:
- Medya oynatmayı durduruyor.
- Web Alıcısı uygulaması, geçerli medya durumunu kaydetmek için bir komut alır.
- Web Alıcısı uygulaması kapatıldı.
- Hedef cihazda:
- Web Alıcısı uygulaması yüklendi.
- Web Alıcısı uygulaması, kayıtlı medya durumunu geri yüklemek için bir komut alır.
- Medya oynatılmaya devam ediyor.
Medya durumu öğeleri şunları içerir:
- Şarkının, videonun veya medya öğesinin belirli konumu ya da zaman damgası.
- Daha geniş bir sırada (ör. şarkı listesi veya sanatçı radyosu) olmalıdır.
- Kimliği doğrulanan kullanıcı.
- Oynatma durumu (örneğin, oynatılıyor veya duraklatıldı).
Akış aktarımı etkinleştiriliyor
Web Alıcınız için akış aktarımını uygulamak üzere:
supportedMediaCommands
alanınıSTREAM_TRANSFER
komutuyla güncelleyin:playerManager.addSupportedMediaCommands( cast.framework.messages.Command.STREAM_TRANSFER, true);
- İsteğe bağlı olarak
SESSION_STATE
veRESUME_SESSION
mesaj engelleyicilerini Oturum durumunu koruma bölümünde açıklandığı gibi geçersiz kılın. Bunları yalnızca, özel verilerin oturum anlık görüntüsünün parçası olarak depolanması gerekiyorsa geçersiz kılın. Aksi takdirde, oturum durumlarını korumak için uygulanan varsayılan uygulama, akış aktarımını destekler.
Oturum durumu korunuyor
Web Alıcı SDK'sı, mevcut medya durumunun anlık görüntüsünü alarak, durumu bir yükleme isteğine dönüştürerek ve yükleme isteğiyle oturumu devam ettirerek oturum durumlarını korumak için Web Alıcısı uygulamalarının varsayılan bir uygulamasını sağlar.
Web Alıcısı tarafından oluşturulan yükleme isteği, gerekirse SESSION_STATE
mesaj müdahale aracında geçersiz kılınabilir. Yükleme isteğine özel veriler eklemek istiyorsanız bunları loadRequestData.customData
içine koymanızı öneririz.
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.SESSION_STATE,
function (sessionState) {
// Override sessionState.loadRequestData if needed.
const newCredentials = updateCredentials_(sessionState.loadRequestData.credentials);
sessionState.loadRequestData.credentials = newCredentials;
// Add custom data if needed.
sessionState.loadRequestData.customData = {
'membership': 'PREMIUM'
};
return sessionState;
});
Özel veriler, RESUME_SESSION
mesaj müdahale aracındaki loadRequestData.customData
adresinden alınabilir.
let cred_ = null;
let membership_ = null;
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.RESUME_SESSION,
function (resumeSessionRequest) {
let sessionState = resumeSessionRequest.sessionState;
// Modify sessionState.loadRequestData if needed.
cred_ = sessionState.loadRequestData.credentials;
// Retrieve custom data.
membership_ = sessionState.loadRequestData.customData.membership;
return resumeSessionRequest;
});
İçeriği önceden yükleme
Web Alıcısı, sıradaki mevcut oynatma öğesinden sonra medya öğelerinin önceden yüklenmesini destekler.
Önceden yükleme işlemi, yaklaşan öğelerin birkaç segmentini önceden indirir. Spesifikasyon, QueueItem nesnesindeki preloadTime değeri üzerinden yapılır (sağlanmazsa varsayılan olarak 20 saniyedir). Süre, geçerli olarak oynatılan öğenin sonuna göre saniye cinsinden ifade edilir . Yalnızca pozitif değerler geçerlidir. Örneğin, değer 10 saniyeyse bu öğe, önceki öğe bitmeden 10 saniye önce önceden yüklenir. Önceden yükleme süresi currentItem özelliğinde kalan süreden uzunsa önceden yükleme mümkün olan en kısa sürede gerçekleşir. Böylece, rowItem için çok büyük bir önceden yükleme değeri belirtilirse, mevcut öğe ne zaman oynatıldığında bir sonraki öğe önceden yükleniyormuş gibi bir etki sağlanabilir. Bununla birlikte, bu değer oynatılan öğenin bant genişliğini ve akış performansını etkileyebileceği için ayarı ve bu seçimi geliştiriciye bırakırız.
Önceden yükleme varsayılan olarak HLS, DASH ve Smooth akış içeriği için çalışır.
Yayın cihazları yalnızca bir medya öğesini desteklediğinden ve mevcut bir içerik öğesi oynatılırken önceden yükleme yapmak için kullanılamayacaktan MP3 gibi normal MP4 video ve ses dosyaları önceden yüklenmez.
Özel mesajlar
Mesaj alışverişi, Web Alıcısı uygulamaları için temel etkileşim yöntemidir.
Bir gönderen, gönderenin çalıştırdığı platforma (Android, iOS, Web) yönelik gönderen API'lerini kullanarak Web Alıcısı'na mesaj gönderir. Etkinlik işleyicilere iletilen etkinlik nesnesi (bir mesajın manifestidir), verilerin belirli etkinlik türünün özelliklerini aldığı bir veri öğesine (event.data
) sahiptir.
Bir Web Alıcısı uygulaması, belirli bir ad alanındaki mesajları dinlemeyi seçebilir. Bu şekilde Web Alıcısı uygulamasının söz konusu ad alanı protokolünü desteklediği söylenir. Bu durumda, uygun protokolü kullanmak için bu ad alanı üzerinde iletişim kurmak isteyen bağlı gönderenlerin sorumluluğundadır.
Tüm ad alanları bir dizeyle tanımlanır ve "urn:x-cast:
" ile başlamalı ve ardından herhangi bir dizeyle devam etmelidir. Örneğin,
"urn:x-cast:com.example.cast.mynamespace
".
Aşağıda, Web Alıcısı'nın bağlı gönderenlerden gelen özel mesajları dinlemesi için bir kod snippet'i verilmiştir:
const context = cast.framework.CastReceiverContext.getInstance();
const CUSTOM_CHANNEL = 'urn:x-cast:com.example.cast.mynamespace';
context.addCustomMessageListener(CUSTOM_CHANNEL, function(customEvent) {
// handle customEvent.
});
context.start();
Benzer şekilde, Web Alıcısı uygulamaları da bağlı gönderenlere ileti göndererek gönderenleri Web Alıcısı'nın durumu hakkında bilgilendirebilir. Bir Web Alıcısı uygulaması, CastReceiverContext
üzerinde sendCustomMessage(namespace, senderId, message)
kullanarak mesaj gönderebilir.
Web Alıcısı, alınan bir iletiye yanıt olarak veya bir uygulama durumu değişikliği nedeniyle bireysel bir gönderene mesaj gönderebilir. Bir Web Alıcısı, noktadan noktaya mesajlaşmanın (64 kb sınırıyla) yanı sıra, bağlı tüm gönderenlere de mesaj yayınlayabilir.
Ses cihazları için yayınlama
Yalnızca ses oynatma konusunda destek için Ses cihazları için Google Cast kılavuzuna bakın.
Android TV
Bu bölümde, Google Web Alıcısı'nın girişlerinizi oynatma olarak nasıl kullandığı ve Android TV uyumluluğu açıklanmaktadır.
Uygulamanızı uzaktan kumandayla entegre etme
Android TV cihazında çalışan Google Web Alıcısı, Medya Oynatma Mesajları bölümünde açıklandığı gibi cihazın kontrol girişlerinden (ör. uzaktan kumanda) gelen girişleri urn:x-cast:com.google.cast.media
ad alanı için tanımlanan medya oynatma mesajları olarak çevirir. Uygulamanızın, Android TV'nin kontrol girişlerinden temel oynatma kontrolüne izin vermesi için medya oynatma işlevini kontrol ederken bu mesajları desteklemesi gerekir.
Android TV uyumluluğu ile ilgili yönergeler
Aşağıda, uygulamanızın Android TV ile uyumlu olmasını sağlamak için kaçınmanız gereken bazı öneriler ve yaygın tuzaklar verilmiştir:
- Kullanıcı aracısı dizesinin hem "Android" hem de "CrKey"i içerdiğini unutmayın. Bazı siteler "Android" etiketini algıladığı için yalnızca mobil cihazlara yönelik bir siteye yönlendirme yapabilir. Kullanıcı aracısı dizesindeki "Android"in her zaman bir mobil kullanıcıyı belirttiğini varsaymayın.
- Android'in medya yığını, verileri getirmek için şeffaf GZIP kullanabilir. Medya verilerinizin
Accept-Encoding: gzip
özelliğine yanıt verebildiğinden emin olun. - Android TV HTML5 medya etkinlikleri Chromecast'ten farklı zamanlamalarda tetiklenebilir. Bu durum, Chromecast'te gizlenmiş sorunların ortaya çıkmasına neden olabilir.
- Medyayı güncellerken
timeupdate
,pause
vewaiting
gibi<audio>/<video>
öğeleri tarafından tetiklenen medyayla ilgili etkinlikleri kullanın.progress
,suspend
vestalled
gibi ağ iletişimi etkinlikleri platforma bağlı olduğu için bu etkinlikleri kullanmaktan kaçının. Alıcınızda medya etkinliklerini işleme hakkında daha fazla bilgi için Medya etkinlikleri konusuna bakın. - Alıcı sitenizin HTTPS sertifikalarını yapılandırırken ara CA sertifikalarını eklediğinizden emin olun. Doğrulamak için Qualsys SSL test sayfasına bakın: Sitenizin güvenilir sertifika yolunda "extra download" etiketli bir CA sertifikası varsa bu sertifika Android tabanlı platformlarda yüklenmeyebilir.
- Chromecast, alıcı sayfasını 720p grafik düzleminde görüntülerken, Android TV gibi diğer yayınlama platformları sayfayı 1080p çözünürlüğe kadar görüntüleyebilir. Alıcı sayfanızın farklı çözünürlüklerde sorunsuz bir şekilde ölçeklendirildiğinden emin olun.