Bu sayfa, Özel Web Alıcısı uygulamasında kullanılabilen özelliklerin kod snippet'lerini ve açıklamalarını içerir.
- 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ü öğelerini biçimlendirmek amacıylacast-media-player
öğesi için CSS benzeri özel stil.- Web Recipientr çerçevesini yüklemek için kullanılan bir komut dosyası öğesi.
- Mesajlara müdahale etmek ve etkinlikleri işlemek için kullanılan JavaScript kodu.
- Otomatik oynatma için sıraya alın.
- 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ştiricinin karşılaştığı en dış sınıftır; temel kitaplıkların yüklenmesini ve Web Recipientr SDK'sının başlatılmasını yönetir. Bu SDK, uygulama geliştiricilerin SDK'yı CastReceiverOptions
üzerinden yapılandırmasına olanak tanıyan API'ler sağlar.
Bu yapılandırmalar, uygulama başlatma 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ı algılamak 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 Uzaktan Hata Ayıklayıcısı oturumunu kapatmasını engelleyeceğinden 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 Recipientr SDK, içerik yüklerken cast.framework.PlaybackConfig
kullanarak DRM bilgileri, yeniden deneme yapılandırmaları ve istek işleyicileri gibi oynatma değişkenlerini 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 Alıcı 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
öğesini değiştirmek 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()
. - Geçerli yapılandırmayı geçersiz kılmak için
PlayerManager.setPlaybackConfig()
. Bu ayar sonraki tüm yüklemelere veya tekrar geçersiz kılınana kadar uygulanır. - Yalnızca mevcut yapılandırmaların üzerine yüklenen 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()
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 elde etmek 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 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 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ük isteği için PlaybackConfig
değerinin nasıl geçersiz kılınacağı gösterilmektedir. İşleyici, licenseUrl
değerini geçerli öğenin contentId
öğesinden elde etmek için uygulamanın uygulandığı 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 Recipientr SDK, Web Alıcısı uygulamanızın oynatıcı etkinliklerini işlemesini sağlar. 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
konusunda bulabilirsiniz.
Etkinlik parametresi, etkinlikle ilgili 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 Alıcı 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 engelleyici, ne tür bir mesaja müdahale edilmesi gerektiğini belirten bir cast.framework.messages.MessageType
parametresi alır.
Önleyici, değiştirilen istek veya değiştirilen istek değeriyle çözümlenen bir Promise döndürmelidir. null
döndürülmesi, varsayılan mesaj işleyicinin çağrılmasını engeller. 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 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 müdahalesi ve etkinlik işleyici
Mesaj müdahalesi ile etkinlik işleyici arasındaki bazı önemli farklar aşağıda verilmiştir:
- Etkinlik işleyici, istek verilerini değiştirmenize izin vermez.
- Analizleri veya özel bir işlevi tetiklemek için en iyi yöntem etkinlik işleyicidir.
playerManager.addEventListener(cast.framework.events.category.CORE,
event => {
console.log(event);
});
- Mesaj müdahalesi, bir mesajı dinlemenize, engellemenize ve istek verilerini değiştirmenize olanak tanır.
- Mesaj müdahalesi, verilerin istenmesiyle ilgili özel mantığı işlemek için kullanılır.
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 sağlar.
- Hem gönderen hem de alıcı uygulamalarınız için uygulamanızda kullanmanız önerilen özelliktir.
entity
Özellik, bir oynatma listesi veya medya içeriği olabilen 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 manifestine işaret edebilir.contentId
, oynatılabilir içerik URL'si (contentUrl
özelliğine benzer) veya yüklenen içerik ya da oynatma listesinin benzersiz tanımlayıcısı olabilir. Bu özelliği tanımlayıcı olarak kullanıyorsanız uygulamanızıncontentUrl
içinde oynatılabilir bir URL'yi doldurması gerekir.
Gerçek kimliği veya anahtar parametrelerini depolamak için entity
ve medya URL'si için 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 bilgileri sağlar. getDeviceCapabilities
yöntemi; Google Asistan, Bluetooth ile bağlı ekran ve ses cihazları için destek bilgileri sağlar.
Bu yöntem, belirtilen numaralandırma için cihaz özelliklerini almak amacıyla belirtilen numaralandırmalardan 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) oynatma özelliklerini sırasıyla IS_HDR_SUPPORTED
ve IS_DV_SUPPORTED
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 yönetme
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 aracılığıyla Web Alıcı uygulamanızla etkileşimde bulunabilir. Cast SDK, 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ını, 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
ayarı belirler. 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
öğesini 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
öğesini 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
kılavuzuna bakın.
Kullanıcı işlemi durumlarını yönetme
Kullanıcılar kullanıcı arayüzüyle etkileşimde bulunduğ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ılmakta olan öğenin özelliklerini değiştiren istekler (ör. LIKE
komutu), alıcı uygulamanın bunları işlemesini gerektirir. SDK, bu tür istekleri ele almak için bir dizi API sağlar. Bu isteklerin desteklenmesi için aşağıdakilerin yapılması gerekir:
- Medya öğesi yüklerken
MediaInformation
userActionStates
özelliğini 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
öğesini güncelleyin.
Aşağıdaki snippet LOAD
isteğini engeller ve LoadRequestData
MediaInformation
URL'sini 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ı engeller ve istenen değişiklikle arka ucun çağrılması işlemini işler. Ardından, alıcıda 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şlemin arka uç tarafından desteklenmesi durumunda 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
öğesinden ekler veya 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üne, uzaktan kumanda uygulamasına 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
iletileri ü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 | Oynatmayı duraklatılmış durumda 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. |
Tekrar Yok | Sıradaki son öğenin oynatılması tamamlandıktan sonra sıradaki medya öğelerinin tekrarlanmasını devre dışı bırakın. |
Bir Tek Tekrarla | Oynatılmakta olan medyayı süresiz olarak tekrarlayın. |
Tümünü Tekrarla | Sıradaki son öğe oynatıldıktan sonra sıradaki tüm öğeleri tekrarlayın. |
Tümünü Tekrarla ve Karıştır | Sıradaki son öğenin çalınması bittiğinde, sırayı karıştırın ve sıradaki tüm öğeleri tekrarlayın. |
Karıştırma | Medya sıranızdaki medya öğelerini karıştırın. |
Altyazılar AÇIK / KAPALI | Medyanız için Altyazıları etkinleştirin / devre dışı bırakın. Etkinleştirme / Devre dışı bırakma seçenekleri dile göre de sunulur. |
Mutlak zamana sar | Belirtilen mutlak zamana atlar. |
Geçerli zamana göre sarar | 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 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önderenlerdeki ve dokunmatik cihazlardaki kullanıcı arayüzü, bu yapılandırmaları yansıtacak şekilde değişecektir. İşaret etkin değilse gelen sesli
komutlar yürütülür.
Örneğin, gönderen uygulamalarınızdan ve dokunma özellikli cihazlarınızdan PAUSE
öğesine izin verirseniz alıcınızı da bu ayarları yansıtacak şekilde yapılandırmanız gerekir. Yapılandırıldığında, gelen sesli komutlar desteklenen komutlar listesine dahil değilse 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 desteklemeye zorladık. Artık bir sesli komut SEEK
gibi başka bir işlem isterse reddedilir. Kullanıcıya, komutun henüz desteklenmediği konusunda bildirim gönderilir.
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ı engelleyebilirsiniz. Burada, Asistan özellikli cihazlara verilen SEEK
komutlarının Web Alıcısı uygulamanızda arama işlemini tetiklememesi için SDK tarafından sağlanan isteğe müdahale ederiz.
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 etkinlikleri nedeniyle uygulamanızın sesini arka plana atarsa 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 ileti 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;
});
Sesin belirttiği 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 istenip istenmediğini belirtir.
Örneğin, "Ok Google, altyazıları aç" komutu için isSuggestedLanguage
dili 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
, false
olarak ayarlanır.
Meta veri ve ses yayınlama
Sesli komutlar varsayılan olarak Web Alıcısı tarafından işlenir, ancak içeriğinizin meta verilerinin eksiksiz ve doğru olduğundan emin olmanız gerekir. Bu sayede, sesli komutların Asistan tarafından doğru şekilde işlenmesini ve meta verilerin Google Home uygulaması gibi yeni arayüzlerde ve Google Home Hub gibi akıllı ekranlarda düzgün şekilde görünmesini sağlarsınız.
Akış aktarımı
Oturum durumunun korunması, akış aktarımının temelini oluşturur. Burada 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:
- Medyanın oynatılması durduruluyor.
- 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ı, kaydedilen 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) bulunması.
- Kimliği doğrulanmış kullanıcı.
- Oynatma durumu (ör. 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
uygulaması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 önleyicilerini 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 bir parçası olarak depolanması gerekiyorsa 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 Recipientr 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ına varsayılan bir uygulama 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
öğesine yerleştirmenizi ö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
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;
});
İçeriği önceden yükleme
Web Alıcısı, sıradaki geçerli 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, o 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 üzerinde kalan süreden uzunsa önceden yükleme mümkün olan en kısa sürede gerçekleşir. Böylece, rowItem öğesinde çok büyük bir önceden yükleme değeri belirtilirse, mevcut öğeyi her oynattığımızda, bir sonraki öğeyi önceden yüklüyormuşuz gibi bir etki sağlanabilir. Ancak bu değer, geçerli oynatılan öğenin bant genişliğini ve akış performansını etkileyebileceği için ayarı ve 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.
Cast cihazları yalnızca bir medya öğesini desteklediğinden ve mevcut bir içerik öğesi oynatılmaya devam ederken önceden yükleme için kullanılamadığından 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 kullandığı platformun (Android, iOS, Web) gönderen API'lerini kullanarak Web Alıcısına mesaj gönderir. Etkinlik işleyicilere aktarılan 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. Böylece, Web Alıcısı uygulamasının bu ad alanı protokolünü desteklediği söylenir. Daha sonra, uygun protokolü kullanmak bu ad alanı üzerinde iletişim kurmak isteyen tüm bağlı gönderenlere bağlıdır.
Tüm ad alanları bir dizeyle tanımlanır. "urn:x-cast:
" ile başlamalı ve ardından herhangi bir dize gelmelidir. Ö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ı, 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)
ile 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. Bir Web Alıcısı, noktadan noktaya mesajlaşmanın yanı sıra (64 KB sınırıyla) tüm bağlı gönderenlere mesaj yayınlayabilir.
Ses cihazları için yayınlama
Yalnızca ses oynatmayla ilgili destek için 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 anlatılmaktadı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. elde kullanılan 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 kuralları
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 görülen hatalar 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önlendirme yapabilir. Kullanıcı aracısı dizesindeki "Android" ifadesinin 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
için yanıt verebildiğinden emin olun. - Android TV HTML5 medya etkinlikleri Chromecast'ten farklı zamanlamalarda tetiklenebilir. Bu durum, Chromecast'te gizlenmiş 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ğ iletişimi ile ilgili etkinlikleri kullanmaktan kaçının. Bu etkinlikler genellikle platforma bağlıdır. Alıcınızdaki medya etkinliklerini işleme 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 bakın: Sitenizin güvenilir sertifika yolunda "ek indirme" etiketli bir CA sertifikası varsa Android tabanlı platformlarda yüklenmeyebilir.
- Chromecast, alıcı sayfasını 720p grafik düzleminde görüntülerken, Android TV gibi diğer Yayın platformları ise 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çeklendiğinden emin olun.