Bu sayfada, bir Özel Web Alıcı uygulaması için kullanılabilen özelliklerin açıklamaları ve kod snippet'leri yer alır.
- Web Alıcısı 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 bir komut dosyası öğesi.
- Mesajlara müdahale etmek ve etkinlikleri işlemek için JavaScript kodu.
- Otomatik oynatma için sıra.
- Oynatmayı yapılandırma seçenekleri.
- Web Alıcı bağlamını ayarlama seçenekleri.
- Web Alıcı 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ştiricinin karşılaştığı en dıştaki sınıftır. Temel kitaplıkların yüklenmesini ve Web Receiver SDK'nın başlatılmasını yönetir. SDK, uygulama geliştiricilerinin SDK'yı CastReceiverOptions
üzerinden yapılandırmasına olanak tanıyan API'ler sunar.
Bu yapılandırmalar, uygulama lansmanı başına bir kez değerlendirilir ve start
çağrısında isteğe bağlı parametre ayarlanırken SDK'ya iletilir.
Aşağıdaki örnekte, bir gönderen bağlantısının hâlâ etkin bir şekilde bağlı olup olmadığını belirlemek için varsayılan davranışın nasıl geçersiz kılınacağı gösterilmektedir. Web Alıcısı, gönderenle maxInactivity
saniye boyunca iletişim kuramazsa 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çbir bağlı gönderen olmadığında Web Alıcı uygulamasının Chrome Uzaktan Hata Ayıklayıcı oturumunu kapatmasını engellediğinden sorunlar 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, içerik yüklerken DRM bilgileri, yeniden deneme yapılandırmaları ve cast.framework.PlaybackConfig
kullanarak istek işleyicileri gibi oynatma değişkenlerini yapılandırmak için bir yöntem sunar.
Bu bilgiler PlayerManager
tarafından işlenir ve oynatıcılar oluşturulurken değerlendirilir. Web Receiver SDK'ya yeni bir yükleme aktarıldığında oynatıcılar oluşturulur. Oynatıcı oluşturulduktan sonra PlaybackConfig
üzerinde yapılacak değişiklikler sonraki içerik yüklemesinde değerlendirilir. SDK, PlaybackConfig
öğesini değiştirmek için aşağıdaki yöntemleri sağlar.
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. - Yalnızca mevcut yapılandırmaların üzerine yüklenmekte olan medya öğesine ek yapılandırmalar uygulamak için
PlayerManager.setMediaPlaybackInfoHandler()
. İşleyici, oyuncu oluşturulmadan hemen önce çağrılır. Burada yapılan değişiklikler kalıcı değildir vegetPlaybackConfig()
ile ilgili sorgulara 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 alıcı ve belirleyici kullanılarak PlaybackConfig
öğesinin nasıl geçersiz kılınacağı gösterilmektedir. Bu ayar, oynatıcıyı 1 segment yüklendikten sonra içerik oynatmayı devam ettirecek ş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şleyicisi kullanılarak belirli bir yükleme isteği için PlaybackConfig
öğesinin nasıl geçersiz kılınacağı gösterilmektedir. İşleyici, geçerli öğenin contentId
öğesinden licenseUrl
değerini almak için uygulamanın uygulanan getLicenseUrlForMedia
yöntemini çağırır.
playerManager.setMediaPlaybackInfoHandler((loadRequestData, playbackConfig) => {
const mediaInformation = loadRequestData.media;
playbackConfig.licenseUrl = getLicenseUrlForMedia(mediaInformation.contentId);
return playbackConfig;
});
Etkinlik işleyici
Web Buyer SDK'sı, Web Alıcı uygulamanızın oynatıcı etkinliklerini işlemesini sağlar. Etkinlik işleyici, işleyiciyi tetiklemesi gereken etkinlikleri belirten bir cast.framework.events.EventType
parametresini (veya bu parametrelerden oluşan bir dizi) alır. Hata ayıklama için faydalı olan önceden yapılandırılmış cast.framework.events.EventType
dizilerini cast.framework.events.category
konumunda 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
});
Mesaj müdahalesi
Web Buyer SDK'sı, Web Alıcı uygulamanızın mesajlara müdahale etmesine ve bu mesajlar üzerinde özel kod çalıştırmasına olanak tanır. Mesaj müdahalesi, hangi mesaj türüne müdahale edilmesi gerektiğini belirten bir cast.framework.messages.MessageType
parametresi alır.
Müdahale, değiştirilen isteği veya değiştirilen istek değeriyle çözümlenen bir Vaat döndürür. null
değerinin döndürülmesi, varsayılan mesaj işleyicinin çağrılmasını engeller. Daha fazla bilgi için Medya yükleme bölümüne bakın.
Örneğin, yükleme isteği verilerini değiştirmek istiyorsanız bu verilere müdahale etmek ve bunları 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 müdahalesinde hata oluştuğunda, Web Receiver uygulamanız uygun bir 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 karşılaştırması
Mesaj müdahalesi ile etkinlik işleyici arasındaki temel farklar şunlardır:
- Etkinlik işleyici, istek verilerini değiştirmenize izin vermez.
- Etkinlik işleyici, analizleri veya özel bir işlevi tetiklemek için en iyi seçenektir.
playerManager.addEventListener(cast.framework.events.category.CORE,
event => {
console.log(event);
});
- Mesaj müdahalesi bir mesajı dinlemenize, mesaja müdahale etmenize ve istek verilerini değiştirmenize olanak tanır.
- Mesaj müdahalesi, istek verileri ile ilgili özel mantığı işlemek için en iyi seçenektir.
Medya yükleniyor
MediaInformation
, cast.framework.messages.MessageType.LOAD
mesajında 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 kullanılması önerilen özelliktir. Mülk, oynatma listesi veya medya içeriği olabilen bir derin bağlantı URL'sidir. Uygulamanız bu URL'yi ayrıştırıp diğer iki alandan en az birini doldurmalıdır.contentUrl
, oynatıcının içeriği yüklemek için kullanacağı oynatılabilir URL'ye karşılık gelir. Örneğin, bu URL bir DASH manifestine işaret edebilir.contentId
, bir oynatılabilir içerik URL'si (contentUrl
özelliğinin URL'sine benzer) veya yüklenen içeriğin ya da oynatma listesinin benzersiz tanımlayıcısı olabilir. Bu özelliği tanımlayıcı olarak kullanıyorsanız uygulamanız,contentUrl
içinde oynatılabilir bir URL'yi doldurmalıdır.
Öneri, gerçek kimliği veya temel parametreleri depolamak için entity
, medyanın URL'si için de contentUrl
kullanmaktır. Aşağıdaki snippet'te, LOAD
isteğinde entity
öğesinin bulunduğu ve oynatılabilir contentUrl
öğesinin alındığı aşağıdaki snippet'te bunun bir örneği gösterilmektedir:
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ında cihaz bilgilerini sağlar. getDeviceCapabilities
yöntemi; Google Asistan, Bluetooth, bağlı ekran ve ses cihazları için destek bilgileri sağlar.
Bu yöntem, belirtilen enum'lardan birini ileterek söz konusu sıralama için cihaz kapasitesini almak suretiyle sorgulayabileceğiniz bir nesne döndürür. Sıralamalar cast.framework.system.DeviceCapabilities
içinde tanımlanmıştır.
Bu örnekte, Web Alıcı cihazının IS_HDR_SUPPORTED
ve IS_DV_SUPPORTED
tuşlarıyla sırasıyla HDR veDolbyVision (DV) dosyalarını oynatıp oynatamadığı kontrol edilir.
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 yönetme
Kullanıcılar, gönderen uygulamaları (Web, Android ve iOS), Asistan özellikli cihazlardaki sesli komutlar, akıllı ekranlardaki dokunma kontrolleri ve Android TV cihazlarındaki uzaktan kumandalar aracılığıyla Web Alıcı uygulamanızla etkileşimde bulunabilir. Cast SDK, Web Alıcı uygulamasının bu etkileşimleri işlemesini, uygulama arayüzünü kullanıcı işlemi durumları aracılığıyla güncellemesine ve isteğe bağlı olarak arka uç hizmetlerini güncellemek için değişiklikleri göndermesine olanak tanıyan çeşitli API'ler sağlar.
Desteklenen medya komutları
Kullanıcı arayüzü kontrollerinin durumu, iOS ve Android'deki 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
tarafından belirlenir. Mülkte belirli bir bit tabanlı Command
etkinleştirildiğinde bu 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:
- Belirli bir
Commands
değerini ayarlamak içinPlayerManager.setSupportedMediaCommands
kullanma addSupportedMediaCommands
kullanarak yeni bir komut eklemeremoveSupportedMediaCommands
kullanarak mevcut bir komutu kaldırabilirsiniz.
playerManager.setSupportedMediaCommands(cast.framework.messages.Command.SEEK |
cast.framework.messages.Command.PAUSE);
Alıcı, güncellenen MediaStatus
öğesini hazırladığında supportedMediaCommands
özelliğindeki değişiklikler de dahil edilir. Durum yayınlandığında, bağlı gönderen uygulamaları kullanıcı arayüzündeki düğmeleri buna göre günceller.
Desteklenen medya komutları ve dokunmatik cihazlar hakkında daha fazla bilgi için Accessing UI controls
kılavuza bakın.
Kullanıcı işlemi durumlarını yönetme
Kullanıcılar kullanıcı arayüzüyle etkileşim kurduğunda veya sesli komutlar gönderdiğinde içeriğin oynatılmasını ve oynatılan öğeyle ilgili özellikleri kontrol edebilirler. Oynatmayı kontrol eden istekler, SDK tarafından otomatik olarak işlenir. Oynatılan geçerli öğenin özelliklerini değiştiren (LIKE
komutu gibi) istekler için alıcı uygulamanın bunları işlemesi gerekir. SDK, bu tür istekleri ele almak için bir dizi API sağlar. Bu isteklerin desteklenmesi için aşağıdakiler yapılmalıdır:
- Bir medya öğesi yüklerken
MediaInformation
userActionStates
özelliğini kullanıcının tercihleri ile ayarlayın. USER_ACTION
mesajlarına müdahale edin ve istenen işlemi belirleyin.- Kullanıcı arayüzünü güncellemek için
MediaInformation
UserActionState
bileşenini güncelleyin.
Aşağıdaki snippet, LOAD
isteğini engeller ve LoadRequestData
öğesinin MediaInformation
öğesini doldurur. Bu durumda, kullanıcı yüklenmekte
olan 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ını keser ve istenen değişiklikle arka ucun çağrılması işlemini gerçekleştirir. Daha sonra, alıcıdaki UserActionState
öğesinin güncellenmesi için arama 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 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
içinden ekler veya kaldırır. MediaInformation
öğesinin UserActionState
değerinin güncellenmesi, istenen işlemle ilişkili düğmenin durumunu değiştirir. Bu değişiklik akıllı ekran kontrolleri kullanıcı arayüzüne, uzaktan kumanda uygulamasına ve Android TV kullanıcı arayüzüne yansır. Ayrıca giden MediaStatus
mesajları aracılığıyla, iOS ve Android gönderenler için genişletilmiş denetleyicinin kullanıcı arayüzünü güncellemek amacıyla 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 Receiver SDK'sında desteklenmektedir. Bu komutların varsayılan uygulamaları cast.framework.PlayerManager
konumunda bulunmaktadır.
Komut | Açıklama |
---|---|
Play | Oynatın veya duraklatılmış durumdan oynatmaya devam edin. |
Duraklat | Oynatılan içeriği duraklatın. |
Önceki | Medya sıranızdaki önceki medya öğesine atlayın. |
Sonraki | Medya sıranızdaki sonraki medya öğesine atlayın. |
Durdur | Oynatılan medyayı durdurun. |
Tekrarlama Yok | Sıradaki son öğenin oynatılması tamamlandığında, sıradaki medya öğelerinin tekrarlanmasını devre dışı bırakın. |
Single'ı tekrarla | Oynatılan medyayı süresiz olarak tekrarla. |
Tümünü Tekrarla | Sıradaki son öğe oynatıldığında, sıradaki tüm öğeleri yineler. |
Tümünü Tekrarla ve Karıştır | Sıradaki son öğenin oynatılması tamamlandığında, 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ÇMA / KAPATMA | Medyanız için Altyazıyı etkinleştirin / devre dışı bırakın. Etkinleştirme / Devre dışı bırakma özelliği dillere göre de kullanılabilir. |
Mutlak zamana ara | Belirtilen mutlak zamana atlar. |
Geçerli zamana göre zamana git | Geçerli oynatma süresine göre belirtilen dönemde ileri veya geri atlar. |
Tekrar Oyna | Oynatılan medyayı yeniden başlatın veya şu anda hiçbir şey oynatılmıyorsa son oynatılan medya öğesini oynatın. |
Oynatma hızını ayarlama | Farklı medya oynatma hızları. Bu, varsayılan olarak işlenmelidir. Gelen hız isteklerini geçersiz kılmak için SET_PLAYBACK_RATE mesaj önleyicisini kullanabilirsiniz. |
Sesli olarak desteklenen medya komutları
Bir sesli komutun Asistan özellikli cihazlarda medya komutunu 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öndericilerinin ve dokunma özellikli cihazların kullanıcı arayüzü, bu yapılandırmaları yansıtacak şekilde değişecektir. Bayrak etkinleştirilmezse gelen sesli
komutlar yürütülür.
Örneğin, gönderen uygulamalarınızda ve dokunma özellikli cihazlarınızda PAUSE
öğesine izin verirseniz alıcınızı bu ayarları yansıtacak şekilde de yapılandırmanız gerekir. Bu yapılandırma tamamlandığında, desteklenen komutlar listesine dahil edilmezse gelen sesli komutlar atlanır.
Aşağıdaki örnekte, CastReceiverContext
başlatılırken CastReceiverOptions
sağlanmaktadır. PAUSE
komutu için destek ekledik ve oynatıcının yalnızca bu komutu desteklemesini zorunlu kıldık. Artık bir sesli komut SEEK
gibi başka bir işlem istediğinde bu istek reddedilecektir. Kullanıcıya, komutun henüz desteklenmediği bildirilir.
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ı mantık uygulayabilirsiniz. enforceSupportedCommands
işaretini kaldırın. Kısıtlamak istediğiniz her komut için gelen mesaja müdahale edebilirsiniz. Burada, Asistan özellikli cihazlara gönderilen SEEK
komutlarının Web Alıcısı uygulamanızda bir aramayı tetiklememesi için SDK tarafından sağlanan isteği engelleriz.
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 alma
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 Web Alıcı uygulamasına NOT_IN_FOCUS
FocusState
mesajı gönderilir. Etkinlik sona erdiğinde IN_FOCUS
ile birlikte başka bir mesaj gönderilir.
Uygulamanıza ve oynatılan medyaya bağlı olarak, FOCUS_STATE
mesaj türüne müdahale ederek FocusState
NOT_IN_FOCUS
olduğunda medyayı duraklatmak isteyebilirsiniz.
Örneğin, Asistan bir kullanıcı sorgusuna yanıt veriyorsa sesli kitap çalmayı duraklatmak iyi bir kullanıcı deneyimi sağlar.
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;
});
Ses tarafından belirlenen 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şkilendirilen dilin önerilip önerilmediğini veya kullanıcı tarafından açık bir şekilde istenip istenmediğini gösterir.
Örneğin, isSuggestedLanguage
dili, komutun konuşulduğu dil tarafından tahmin edildiğinden "Ok Google, altyazıları aç" komutu için true
olarak ayarlanmıştır. Dil açıkça istenirse (ör. "Ok Google, İngilizce altyazıları aç) isSuggestedLanguage
değeri 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 olmalısınız. 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 şekilde gösterilmesini sağlar.
Akış aktarma
Akış aktarımının temeli oturum durumunu korumaktır. Kullanıcılar burada sesli komutları, Google Home uygulamasını veya akıllı ekranları kullanarak mevcut ses ve video akışlarını cihazlar arasında taşıyabilir. Medya, bir cihazda (kaynak) durdurulur ve başka bir cihazda (hedef) devam eder. En yeni donanım yazılımına sahip yayın cihazları, akış aktarımında kaynak veya hedef olarak kullanılabilir.
Akış aktarımı için etkinlik akışı:
- Kaynak cihazda:
- Medyanın oynatılması durduruluyor.
- Web Alıcı uygulaması, mevcut medya durumunu kaydetmek için bir komut alır.
- Web Alıcı uygulaması kapatıldı.
- Hedef cihazda:
- Web Alıcı uygulaması yüklendi.
- Web Alıcı uygulaması, kaydedilen medya durumunu geri yüklemek için bir komut alır.
- Medya oynatılmaya devam eder.
Medya durumu öğeleri şunlardır:
- Şarkının, videonun veya medya öğesinin belirli konumu ya da zaman damgası.
- Video daha geniş bir sıraya eklenir (ör. oynatma listesi veya sanatçı radyosu).
- Kimliği doğrulanan kullanıcı.
- Oynatma durumu (örneğin, oynatma veya duraklatıldı).
Akış aktarımı etkinleştiriliyor
Web Alıcınız için akış aktarımını uygulamak üzere:
STREAM_TRANSFER
komutuylasupportedMediaCommands
uygulamasını güncelleyin:playerManager.addSupportedMediaCommands( cast.framework.messages.Command.STREAM_TRANSFER, true);
- İsteğe bağlı olarak, Oturum durumunu koruma bölümünde açıklandığı gibi
SESSION_STATE
veRESUME_SESSION
mesaj önleyicilerini geçersiz kılın. Yalnızca özel verilerin oturum anlık görüntüsünün bir parçası olarak depolanması gerekiyorsa bunları geçersiz kılın. Aksi takdirde, oturum durumlarını korumak için 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 Web Alıcı uygulamalarında oturum durumlarını korumak için varsayılan bir uygulama sağlar.
Web Alıcısı tarafından oluşturulan yükleme isteği, gerekirse SESSION_STATE
mesaj önleyicide 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 önleyicideki loadRequestData.customData
konumundan 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;
});
İçerik önceden yükleme
Web Alıcısı, sırada mevcut oynatma öğesi bittikten sonra medya öğelerinin önceden yüklenmesini destekler.
Önceden yükleme işlemi, sonraki öğelerin birkaç segmentini önceden indirir. Spesifikasyon, QueueItem nesnesindeki preloadTime değerinde gerçekleştirilir (sağlanmazsa varsayılan olarak 20 saniyedir). Süre, şu anda 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 tamamlanmadan 10 saniye önce önceden yüklenir. Önceden yükleme süresi, currentItem öğesinde kalan zamandan uzunsa önceden yükleme işlemi mümkün olan en kısa sürede gerçekleşir. Kuyruk öğesinde çok büyük bir önceden yükleme değeri belirtilirse, geçerli öğeyi oynatırken bir sonraki öğeyi önceden yüklüyor olmamız gibi bir etki elde edilebilir. Bununla birlikte, bu değer mevcut oyun öğesinin bant genişliğini ve akış performansını etkileyebileceğinden bu ayarın ayarını ve seçimini geliştiriciye bırakıyoruz.
Önceden yükleme; HLS, DASH ve Smooth akış içeriği için varsayılan olarak ç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ılamadığından, MP3 gibi normal MP4 video ve ses dosyaları önceden yüklenmez.
Özel mesajlar
Mesaj değişimi, Web Alıcısı uygulamaları için temel etkileşim yöntemidir.
Bir gönderen, ç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ı uygulaması, belirli bir ad alanındaki mesajları dinlemeyi seçebilir. Bu sayede, Web Alıcı uygulamasının bu ad alanı protokolünü desteklediği söylenir. Daha sonra, uygun protokolü kullanmak için bu ad alanında iletişim kurmak isteyen tüm bağlı gönderenlere bağlıdır.
Tüm ad alanları bir dizeyle tanımlanır ve "urn:x-cast:
" ile başlamalı ve ardından herhangi bir dize gelmelidir. Örneğin,
"urn:x-cast:com.example.cast.mynamespace
".
Web Alıcı'nın bağlı gönderenlerden gelen özel mesajları dinlemesi için kullanabileceğiniz bir kod snippet'ini burada görebilirsiniz:
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ı uygulamaları bağlı gönderenlere ileti göndererek gönderenleri Web Alıcısı'nın durumu hakkında bilgilendirebilir. Web Alıcıları uygulaması, CastReceiverContext
üzerindeki 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 tek bir gönderene mesaj gönderebilir. Web Alıcısı, noktadan noktaya mesajların (64 kb sınırıyla sınırlı) yanı sıra mesajları tüm bağlı gönderenlere de yayınlayabilir.
Ses sistemleri için yayınlama
Yalnızca ses oynatma konusunda destek almak üzere Ses cihazları için Google Cast rehberine 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 konuları ele alınmaktadı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ığı üzere urn:x-cast:com.google.cast.media
ad alanı için tanımlanan medya oynatma mesajları olarak cihazın kontrol girişlerinden (ör. elde tutulan uzaktan kumanda) gelen girişi çevirir. Uygulamanızın, Android TV'nin kontrol girişlerinden temel oynatma kontrolüne izin vermek üzere uygulama medyası oynatmasını
kontrol edebilmesi için bu mesajları desteklemesi gerekir.
Android TV uyumluluğu yönergeleri
Uygulamanızın Android TV ile uyumlu olduğundan emin olmak için kaçınmanız gereken bazı önerileri ve yaygın tehlikeleri burada bulabilirsiniz:
- Kullanıcı aracısı dizesinin hem "Android" hem de "CrKey" ifadesini içerdiğini unutmayın. Bazı siteler "Android" etiketini algıladığı için yalnızca mobil cihazlara yönelik bir siteye yönlendirebilir. Kullanıcı aracısı dizesindeki "Android" ifadesinin her zaman bir mobil kullanıcıyı belirttiğini varsaymayın.
- Android'in medya yığını, veri getirmek için şeffaf GZIP kullanabilir. Medya verilerinizin
Accept-Encoding: gzip
komutuna yanıt verebildiğinden emin olun. - Android TV HTML5 medya etkinlikleri, Chromecast'ten farklı zamanlamalarda tetiklenebilir. Bu durum, Chromecast'te gizlenmiş olan sorunları ortaya çıkarabilir.
- Medyayı güncellerken
timeupdate
,pause
vewaiting
gibi<audio>/<video>
öğeleri tarafından tetiklenen medyayla ilgili etkinlikleri kullanın.progress
,suspend
vestalled
gibi ağ etkinliklerinden kaçının. Bunlar genellikle platforma bağlıdır. Alıcınızdaki medya etkinliklerini yönetme hakkında daha fazla bilgi için Medya etkinlikleri bölümüne 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 göz atın: Sitenizin güvenilir sertifika yolu "ekstra indirme" etiketli bir CA sertifikası içeriyorsa 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 Cast platformları sayfayı 1080p'ye kadar görüntüleyebilir. Alıcı sayfanızın farklı çözünürlüklerde sorunsuz şekilde ölçeklendirildiğinden emin olun.