Bu sayfada, Özel Web Alıcısı uygulamasında kullanılabilen özelliklerin kod snippet'leri ve açıklamaları yer almaktadır.
- Web alıcısıyla birlikte 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ü öğelerini biçimlendirmek içincast-media-player
öğesinde özel CSS benzeri stil.- Web alıcı çerçevesini yükleyen bir komut dosyası öğesi.
- Mesajları durdurmak ve etkinlikleri işlemek için JavaScript kodu.
- Otomatik oynatma için sıraya ekleme.
- Oynatma işlemini 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ı 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. Alttaki kitaplıkların yüklenmesini ve Web Alıcı SDK'sının başlatılmasını yönetir. SDK, uygulama geliştiricilerin CastReceiverOptions
üzerinden SDK'yı yapılandırmasına olanak tanıyan API'ler sağlar.
Bu yapılandırmalar, uygulama her başlatıldığında bir kez değerlendirilir ve start
çağrısında isteğe bağlı parametre ayarlanırken SDK'ya aktarılır.
Aşağıdaki örnekte, gönderen bağlantısının hâlâ etkin olup olmadığını algılamayla ilgili 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ın geçersiz kılınmasını sağlar. Bu, IDLE
durumundaki sıfır bağlı gönderen olmadığında Web Alıcısı uygulamasının Chrome Uzaktan Hata Ayıklama oturumunu kapatmasını önlediğinden, sorunlarla ilgili hata ayıklama işleminde faydalı 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, yeniden deneme yapılandırmaları ve istek işleyicileri gibi oynatma değişkenlerini cast.framework.PlaybackConfig
kullanarak yapılandırmanın bir yolunu sağlar.
Bu bilgiler PlayerManager
tarafından işlenir ve oyuncular oluşturulurken değerlendirilir. Web Receiver SDK'sına her yeni yükleme aktarıldığında oynatıcı oluşturulur. Oynatıcı oluşturulduktan sonra PlaybackConfig
üzerinde yapılan değişiklikler bir 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ırken varsayılan yapılandırma seçeneklerini geçersiz kılmak içinCastReceiverOptions.playbackConfig
PlayerManager.getPlaybackConfig()
PlayerManager.setPlaybackConfig()
simgesini tıklayarak mevcut yapılandırmayı geçersiz kılabilirsiniz. Bu ayar, sonraki tüm yüklemelere veya tekrar geçersiz kılınana kadar uygulanır.PlayerManager.setMediaPlaybackInfoHandler()
simgesini tıklayarak yalnızca mevcut yapılandırmaların üzerine yüklenen medya öğesi için ek yapılandırmalar uygulayabilirsiniz. İşleyici, oynatıcı oluşturulmadan hemen önce çağrılır. Burada yapılan değişiklikler kalıcı değildir vegetPlaybackConfig()
için yapılan 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
değerinin nasıl ayarlanacağı gösterilmektedir. Yapılandırma, manifest elde etmek için gönderilen istekleri geçersiz kılar. İşleyici, CORS erişim denetimi 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 ayarlayıcı kullanılarak PlaybackConfig
'ün nasıl geçersiz kılınacağı gösterilmektedir. Bu ayar, oynatıcının 1 segment yüklendikten sonra içerik oynatmayı devam ettirmesi için yapılandırılı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 bilgileri işleyicisi kullanılarak belirli bir yükleme isteği için PlaybackConfig
değerinin nasıl geçersiz kılınacağı gösterilmektedir. İşleyici, geçerli öğenin contentId
öğesinden licenseUrl
öğesini almak için uygulama tarafından uygulanan bir 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 Receiver SDK'sı, Web Receiver uygulamanızın oynatıcı etkinliklerini işlemesine olanak tanır. Etkinlik dinleyicisi, dinleyiciyi tetiklemesi gereken etkinlikleri belirten bir cast.framework.events.EventType
parametresi (veya bu parametrelerin bir dizisi) alır. Hata ayıklama için yararlı olan ö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ı bilmek 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ın ele geçirilmesi
Web Alıcısı SDK'sı, Web Alıcısı uygulamanızın mesajları durdurmasına ve bu mesajlarda özel kod yürütmesine olanak tanır. Mesaj tutucu, hangi tür mesajın yakalanacağını belirten bir cast.framework.messages.MessageType
parametresi alır.
Engelleyici, değiştirilmiş isteği veya değiştirilmiş istek değeriyle çözülen bir Promise döndürmelidir. null
döndürmek, varsayılan ileti 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 isteği durdurup 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 tutucuda hata oluştuğunda Web Alıcı 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ın yakalanması ve etkinlik işleyici
Mesajın yakalanması ile etkinlik dinleyicisi arasındaki bazı önemli farklar şunlardır:
- Etkinlik dinleyicileri, istek verilerini değiştirmenize izin vermez.
- Etkinlik dinleyiciler, en iyi şekilde analizleri veya özel bir işlevi tetiklemek için kullanılır.
playerManager.addEventListener(cast.framework.events.category.CORE,
event => {
console.log(event);
});
- Mesajın dinlenmesi, mesajın kesilmesi ve istek verilerinin değiştirilmesi için mesajın kesilmesi gerekir.
- Mesajları durdurma özelliği, istek verileriyle ilgili özel mantığı işlemek için en iyi şekilde kullanılır.
Medya yükleme
MediaInformation
cast.framework.messages.MessageType.LOAD
mesajına medya yüklemek için entity
,
contentUrl
ve contentId
gibi birçok özellik sağlar.
entity
, hem gönderen hem de alıcı uygulamalarınız için uygulamanızda kullanmanız önerilen mülktür. Mülk, oynatma listesi veya medya içeriği olabilecek bir derin bağlantı URL'sidir. Uygulamanız bu URL'yi ayrıştırmalı ve 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 manifestini işaret edebilir.contentId
, oynatılabilir bir içerik URL'si (contentUrl
mülküne benzer) veya yüklenen içeriğin ya da oynatma listesinin benzersiz tanımlayıcısıdır. Bu mülk tanımlayıcısı olarak kullanılıyorsa uygulamanızcontentUrl
içinde oynatılabilir bir URL doldurmalıdır.
Gerçek kimliği veya anahtar parametrelerini depolamak için entity
, medyanın URL'si için ise contentUrl
kullanmanızı öneririz. Bunun bir örneği, LOAD
isteğinde entity
'ün bulunduğu ve oynatılabilir contentUrl
'in alındığı aşağıdaki snippet'te 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ı Cast cihazı ve ona bağlı video veya ses cihazı hakkı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 bir enum'dan birini ileterek ilgili enum'un cihaz özelliğini almak için sorgulayabileceğiniz bir nesne döndürür. Listeler cast.framework.system.DeviceCapabilities
içinde tanımlanır.
Bu örnekte, web alıcı cihazın sırasıyla IS_HDR_SUPPORTED
ve IS_DV_SUPPORTED
tuşlarıyla HDR ve DolbyVision (DV) oynatıp oynatamayacağını 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 işleme
Kullanıcılar, gönderen uygulamaları (Web, Android ve iOS), Asistan özellikli cihazlardaki sesli komutlar, akıllı ekranlardaki dokunmatik kontroller ve Android TV cihazlardaki uzaktan kumandalar aracılığıyla Web Alıcısı uygulamanızla etkileşim kurabilir. Cast SDK'sı, Web Alıcısı uygulamasının bu etkileşimleri yönetmesine, kullanıcı işlemi durumları aracılığıyla uygulama kullanıcı arayüzünü güncellemesine ve isteğe bağlı olarak değişiklikleri göndererek arka uç hizmetlerini güncellemesine olanak tanıyan çeşitli API'ler sağlar.
Desteklenen medya komutları
Kullanıcı arayüzü kontrol durumları, iOS ve Android gönderen genişletilmiş denetleyiciler, dokunmatik cihazlarda çalışan alıcı ve uzaktan kumanda uygulamaları ve Android TV cihazlarındaki alıcı uygulamaları için MediaStatus.supportedMediaCommands
tarafından yönlendirilir. Mülkte belirli bir bit Command
etkinleştirildiğinde, bu işlemle ilgili düğmeler de etkinleştirilir. Değer ayarlanmazsa düğme devre dışı bırakılır. Bu değerler web alıcısında aşağıdaki yöntemlerle değiştirilebilir:
- Belirli bir
Commands
ayarlamak içinPlayerManager.setSupportedMediaCommands
kullanma addSupportedMediaCommands
kullanarak yeni komut eklemeremoveSupportedMediaCommands
simgesini kullanarak mevcut bir komutu kaldırma
playerManager.setSupportedMediaCommands(cast.framework.messages.Command.SEEK |
cast.framework.messages.Command.PAUSE);
Alıcı, güncellenmiş MediaStatus
dosyasını hazırladığında supportedMediaCommands
mülkünde yapılan değişiklikleri de ekler. 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ılavuzunu inceleyin.
Kullanıcı işlemi durumlarını yönetme
Kullanıcılar kullanıcı arayüzüyle etkileşime geçtiğinde veya sesli komut gönderdiğinde, oynatılan içeriğin oynatılmasını ve oynatılan öğeyle ilgili özellikleri kontrol edebilirler. Oynatma işlemini kontrol eden istekler SDK tarafından otomatik olarak işlenir. Oynatılan öğenin özelliklerini değiştiren istekler (ör. LIKE
komutu) alıcı uygulamanın bunları işlemesini gerektirir. SDK, bu tür istekleri işlemek için bir dizi API sağlar. Bu istekleri desteklemek için aşağıdakiler yapılmalıdır:
- Bir medya öğesi yüklenirken
MediaInformation
userActionStates
kullanıcı tercihlerine göre ayarlayın. USER_ACTION
mesajlarını durdurun ve istenen işlemi belirleyin.- Kullanıcı arayüzünü güncellemek için
MediaInformation
UserActionState
öğesini güncelleyin.
Aşağıdaki snippet, LOAD
isteğini durdurur ve LoadRequestData
'un MediaInformation
değerini 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ını durdurur ve istenen değişiklikle arka uç çağrısını işler. Ardından, alıcıdaki UserActionState
öğesini güncellemek için bir 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, arka uç hizmetine yapılan bir çağrıyı simüle etmektedir. İş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 destekliyorsa 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 MediaInformation
öğesinden kaldırır. MediaInformation
öğesinin UserActionState
özelliğini güncellemek, istenen işlemle ilişkili düğmenin durumunu değiştirir. Bu değişiklik akıllı ekran kontrollerinin kullanıcı arayüzüne, uzaktan kumanda uygulamasına ve Android TV kullanıcı arayüzüne yansıtılmıştır. Ayrıca, iOS ve Android gönderenler için genişletilmiş denetleyicinin kullanıcı arayüzünü güncellemek üzere giden MediaStatus
mesajları aracılığı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
Asistan özellikli cihazlar için Web Alıcı SDK'sında şu anda aşağıdaki medya komutları desteklenmektedir. Bu komutların varsayılan uygulamaları cast.framework.PlayerManager
içinde bulunur.
Komut | Açıklama |
---|---|
Play | Videoyu oynatın veya duraklatılmış durumdan devam ettirin. |
Duraklat | Şu anda oynatılan içeriği duraklatabilirsiniz. |
Önceki | Medya sıranızdaki önceki medya öğesine atlayın. |
İleri | Medya sıranızdaki bir sonraki medya öğesine atlayın. |
Durdur | Şu anda oynatılan medyayı durdurur. |
Hiçbirini Tekrarlama | Sıradaki son öğe oynatıldıktan sonra sıradaki medya öğelerinin tekrarlanmasını devre dışı bırakır. |
Tekli Tekrar | Şu anda çalan medyayı süresiz olarak tekrarlayın. |
Tümünü Tekrarla | Sırada en son öğe oynatıldıktan sonra sıradaki tüm öğeleri tekrarla. |
Tümünü Tekrarla ve Karıştır | Sıradaki son öğe oynatıldı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 özelliğini dile göre de ayarlayabilirsiniz. |
Mutlak zamana sar | Belirtilen mutlak zamana atlar. |
Mevcut saate göreceli zamana git | Mevcut oynatma süresine göre belirtilen zaman aralığı kadar ileri veya geri atlar. |
Tekrar Oyna | Şu anda çalan medyayı yeniden başlatın veya şu anda hiçbir şey çalmıyorsa son oynatılan medya öğesini oynatın. |
Oynatma hızını ayarlama | Medya oynatma hızını değiştirebilirsiniz. Bu işlem varsayılan olarak gerçekleştirilir. Gelen ücret isteklerini geçersiz kılmak için SET_PLAYBACK_RATE mesaj tutucusunu kullanabilirsiniz. |
Sesli olarak desteklenen medya komutları
Bir sesli komutun, Asistan özellikli bir cihazda medya komutunu tetiklemesini önlemek için öncelikle desteklemeyi planladığınız desteklenen medya komutlarını ayarlamanız gerekir. Ardından, CastReceiverOptions.enforceSupportedCommands
mülkünü etkinleştirerek bu komutları uygulamanız gerekir. Cast SDK'sı gönderenlerindeki ve dokunmatik ekranlı cihazlardaki kullanıcı arayüzü, bu yapılandırmaları yansıtacak şekilde değişecek. İşaretçi etkinleştirilmezse gelen sesli komutlar yürütülür.
Örneğin, gönderen uygulamalarınızdan ve dokunmatik ekranlı cihazlardan PAUSE
'e izin verirseniz alıcınızı da bu ayarları yansıtacak şekilde yapılandırmanız gerekir. Yapılandırıldığında, desteklenen komutlar listesine dahil edilmeyen tüm gelen sesli komutlar atlanır.
Aşağıdaki örnekte, CastReceiverContext
başlatırken CastReceiverOptions
değerini sağlıyoruz. 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 isterse reddedilir. 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 ve kısıtlamak istediğiniz her komut için gelen iletiyi durdurabilirsiniz. Burada, Asistan özellikli cihazlara gönderilen SEEK
komutlarının Web Alıcı uygulamanızda arama tetiklememesi için SDK tarafından sağlanan isteği durduruyoruz.
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;
});
Sesli etkinlikten arka plana geçme
Cast platformu, kullanıcı konuşmasını dinleme veya yanıt verme gibi Asistan etkinlikleri nedeniyle uygulamanızın sesini arka plana alırsa etkinlik başladığında Web Alıcı uygulamasına NOT_IN_FOCUS
mesajı gönderilir.FocusState
Etkinlik sona erdiğinde IN_FOCUS
içeren başka bir mesaj gönderilir.
Uygulamanıza ve oynatılan medyaya bağlı olarak, FOCUS_STATE
mesaj türünü arayarak FocusState
NOT_IN_FOCUS
olduğunda medyayı duraklatmak isteyebilirsiniz.
Örneğin, Asistan bir kullanıcı sorgusuna yanıt veriyorsa sesli kitabın oynatılmasını 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 belirtmezse altyazılar için kullanılan dil, komutun söylendiği dildir.
Bu senaryolarda, gelen mesajın isSuggestedLanguage
parametresi, ilişkili dilin kullanıcı tarafından önerildiğini veya açıkça istendiğini belirtir.
Örneğin, "Ok Google, altyazıları aç" komutu için isSuggestedLanguage
, komutun söylendiği dile göre belirlendiği için true
olarak ayarlanır. Dil açıkça istenirse (ör. "Ok Google, İngilizce altyazıları aç") isSuggestedLanguage
, false
olarak ayarlanır.
Meta veriler ve sesli yayınlama
Sesli komutlar varsayılan olarak web alıcısı tarafından işlenir. Bununla birlikte, içeriğinizin meta verilerinin eksiksiz ve doğru olduğundan emin olmanız gerekir. Bu sayede sesli komutlar Asistan tarafından düzgün şekilde işlenir ve meta veriler Google Home uygulaması gibi yeni arayüz türlerinde ve Google Home Hub gibi akıllı ekranlarda düzgün şekilde gösterilir.
Akış aktarma
Oturum durumunu korumak, kullanıcıların sesli komutları, Google Home uygulaması veya akıllı ekranlar kullanarak mevcut ses ve video akışlarını cihazlar arasında taşıyabileceği akış aktarımının temelini oluşturur. Medya, bir cihazda (kaynak) oynatmayı durdurur ve başka bir cihazda (hedef) oynatmaya devam eder. En son donanım yazılımına sahip tüm Cast cihazları, yayın aktarımında kaynak veya hedef olarak kullanılabilir.
Akış aktarımı için etkinlik akışı:
- Kaynak cihazda:
- Medya oynatmayı durdurur.
- Web Alıcısı uygulaması, mevcut medya durumunu kaydetme komutu alır.
- Web alıcı uygulaması kapatılır.
- Hedef cihazda:
- Web alıcı uygulaması yüklenir.
- Web Alıcısı uygulaması, kayıtlı medya durumunu geri yükleme komutu alır.
- Medya oynatılmaya devam eder.
Medya durumunun öğeleri şunlardır:
- Şarkının, videonun veya medya öğesinin belirli konumu ya da zaman damgası.
- Daha geniş bir sıradaki yeri (ör. oynatma listesi veya sanatçı radyosu).
- Kimliği doğrulanmış kullanıcı.
- Oynatma durumu (ör. oynatılıyor veya duraklatılmış).
Akış aktarmayı etkinleştirme
Web alıcınız için akış aktarımını uygulamak üzere:
STREAM_TRANSFER
komutunu kullanaraksupportedMediaCommands
dosyasını güncelleyin:playerManager.addSupportedMediaCommands( cast.framework.messages.Command.STREAM_TRANSFER, true);
- İsteğe bağlı olarak,
SESSION_STATE
veRESUME_SESSION
ileti müdahalecilerini Oturum durumunu koruma bölümünde açıklandığı şekilde geçersiz kılabilirsiniz. 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 durumunu koruma
Web Receiver SDK'sı, Web Receiver uygulamalarının 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ı koruması için varsayılan bir uygulama sağlar.
Web alıcı tarafından oluşturulan yükleme isteği, gerekirse SESSION_STATE
mesaj tutucuda geçersiz kılınabilir. Yükleme isteğine özel veri 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
ileti tutucudaki loadRequestData.customData
bölümünden 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ıradaki mevcut oynatma öğesinden sonra medya öğelerinin önceden yüklenmesini destekler.
Ön yükleme işlemi, yaklaşan öğelerin birkaç segmentini önceden indirir. Spesifikasyon, QueueItem nesnesinde bulunan preloadTime değerinde yapılır (sağlanmazsa varsayılan olarak 20 saniyedir). Zaman, şu anda oynatılan öğenin sonuna göre saniye cinsinden ifade edilir . Yalnızca pozitif değerler geçerlidir. Örneğin, değer 10 saniye ise bu öğe, önceki öğe bitmeden 10 saniye önce önceden yüklenir. Önceden yükleme süresi, currentItem öğesinde kalan süreden uzunsa önceden yükleme işlemi mümkün olan en kısa sürede gerçekleşir. Bu nedenle, queueItem üzerinde çok büyük bir ön yükleme değeri belirtilirse mevcut öğeyi oynatırken bir sonraki öğeyi de önceden yüklemiş oluruz. Ancak bu değer, oynatılan öğenin bant genişliğini ve akış performansını etkileyebileceğinden, bu ayarı ve seçimi geliştiriciye bırakırız.
Ön yükleme, varsayılan olarak HLS, DASH ve Smooth Streaming içerikleri için çalışır.
Cast cihazları yalnızca bir medya öğesini desteklediği ve mevcut bir içerik öğesi oynatılmaya devam ederken ön yükleme yapmak için kullanılamadığı için normal MP4 video ve ses dosyaları (ör. MP3) ön yüklenmez.
Özel mesajlar
Mesaj alışverişi, Web Alıcısı uygulamaları için temel etkileşim yöntemidir.
Gönderen, çalıştırmakta olduğu platformun (Android, iOS, Web) gönderen API'lerini kullanarak bir web alıcısına mesaj gönderir. Etkinlik dinleyicilerine iletilen etkinlik nesnesi (bir mesajın tezahürü olan), verilerin belirli etkinlik türünün özelliklerini aldığı bir veri öğesine (event.data
) sahiptir.
Web alıcı uygulaması, belirli bir ad alanındaki mesajları dinlemeyi seçebilir. Bu nedenle, Web Alıcısı uygulamasının bu ad alanı protokolünü desteklediği söylenir. Ardından, bu ad alanında iletişim kurmak isteyen bağlı gönderenlerin uygun protokolü kullanması gerekir.
Tüm ad alanları bir dizeyle tanımlanır ve "urn:x-cast:
" ile başlamalı, ardından herhangi bir dize gelmelidir. Örneğin, "urn:x-cast:com.example.cast.mynamespace
".
Web Alıcısı'nın, bağlı gönderenlerden gelen özel mesajları dinlemek için kullanabileceği kod snippet'i aşağıda 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ı uygulamaları, bağlı gönderenlere mesaj göndererek gönderenleri web alıcısının durumu hakkında bilgilendirebilir. Web alıcı uygulaması, CastReceiverContext
üzerinde sendCustomMessage(namespace, senderId, message)
kullanarak mesaj gönderebilir.
Web alıcısı, alınan bir mesaja yanıt olarak veya uygulama durumundaki bir değişiklik nedeniyle tek bir gönderene mesaj gönderebilir. Web alıcıları, noktadan noktaya mesajlaşmanın (64 KB sınırı ile) yanı sıra bağlı tüm gönderenlere mesaj da yayınlayabilir.
Ses cihazları için yayınlama
Yalnızca ses oynatmayla ilgili 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 oynatma olarak girişlerinizi nasıl kullandığı ve Android TV uyumluluğu ele alınmaktadır.
Uygulamanızı uzaktan kumandayla entegre etme
Android TV cihazında çalışan Google Web Alıcısı, cihazın kontrol girişlerinden (ör. el tipi uzaktan kumanda) gelen girişleri Medya Oynatımı Mesajları bölümünde açıklandığı gibi urn:x-cast:com.google.cast.media
ad alanının tanımlandığı medya oynatma mesajları olarak çevirir. Android TV'nin kontrol girişlerinden temel oynatma denetimine izin vermek için uygulamanızın, uygulama medya oynatmasını kontrol etmek üzere bu mesajları desteklemesi gerekir.
Android TV uyumluluğuyla ilgili kurallar
Uygulamanızın Android TV ile uyumlu olmasını sağlamak için kaçınmanız gereken bazı öneriler ve yaygın hatalar aşağıda verilmiştir:
- Kullanıcı aracısı dizesinin hem "Android" hem de "CrKey" 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 mobil kullanıcıyı gösterdiğini varsaymayın.
- Android'in medya paketi, verileri almak için şeffaf GZIP kullanabilir. Medya verilerinizin
Accept-Encoding: gzip
'e yanıt verebileceğinden emin olun. - Android TV HTML5 medya etkinlikleri, Chromecast'ten farklı zamanlamalarda tetiklenebilir. Bu durum, Chromecast'te gizli olan sorunları ortaya çıkarabilir.
- Medyayı güncellerken
timeupdate
,pause
vewaiting
gibi<audio>/<video>
öğeleri tarafından tetiklenen medyayla ilgili etkinlikleri kullanın. Platforma bağımlı olma eğiliminde olduklarındanprogress
,suspend
vestalled
gibi ağ oluşturmayla ilgili etkinlikleri kullanmaktan kaçının. Alıcınızda medya etkinliklerini işleme hakkında daha fazla bilgi için Medya etkinlikleri başlıklı makaleyi inceleyin. - 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 yolu "ek indirme" etiketli bir CA sertifikası içeriyorsa Android tabanlı platformlarda yüklenmeyebilir.
- Chromecast, alıcı sayfasını 720p grafik düzleminde gösterirken Android TV dahil diğer Cast platformları sayfayı 1080p'ye kadar gösterebilir. Alıcınızın sayfasının farklı çözünürlüklerde sorunsuz şekilde ölçeklendirildiğinden emin olun.