Bu sayfada, özel bir web alıcı 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. cast-media-player
,background-image
vesplash-image
gibi çeşitli kullanıcı arayüzü öğelerini biçimlendirmek içinfont-family
öğesine yönelik CSS benzeri özel stil.- Web alıcı çerçevesini yüklemek için kullanılan bir komut dosyası öğesi.
- Mesajları yakalamak ve etkinlikleri işlemek için JavaScript kodu.
- Otomatik oynatma için sıraya ekleme
- 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ı 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ıştaki sınıftır ve temel kitaplıkların yüklenmesini yönetip Web Alıcı SDK'sının başlatılmasını sağlar. SDK, uygulama geliştiricilerin SDK'yı CastReceiverOptions
aracılığıyla yapılandırmasına olanak tanıyan API'ler sağlar.
Bu yapılandırmalar, uygulama 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, bir gönderen bağlantısının hâlâ etkin olarak bağlı olup olmadığını algılamaya yönelik varsayılan davranışın nasıl geçersiz kılınacağı gösterilmektedir. Web alıcısı, maxInactivity
saniye boyunca bir gönderenle iletişim kuramadığında SENDER_DISCONNECTED
etkinliği gönderilir. Aşağıdaki yapılandırma bu zaman aşımını geçersiz kılar. Bu, Web Alıcı uygulamasının IDLE
durumunda bağlı gönderen olmadığında Chrome uzaktan hata ayıklama oturumunu kapatmasını önlediği için sorunları ayıklarken 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, 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 sunar.
Bu bilgiler, PlayerManager
tarafından işlenir ve oyuncular oluşturulurken değerlendirilir. Yeni bir yük Web Receiver SDK'ya her iletildiğinde oynatıcılar oluşturulur. Oynatıcı oluşturulduktan sonra yapılan PlaybackConfig
değişiklikleri, bir sonraki içerik yüklemede değerlendirilir. SDK, PlaybackConfig
öğesini değiştirmek için aşağıdaki yöntemleri sağlar.
CastReceiverOptions.playbackConfig
CastReceiverContext
başlatılırken varsayılan yapılandırma seçeneklerini geçersiz kılmak için kullanılır.- Mevcut yapılandırmayı almak için
PlayerManager.getPlaybackConfig()
. PlayerManager.setPlaybackConfig()
Mevcut yapılandırmayı geçersiz kılmak için. Bu ayar, sonraki tüm yüklemelerde veya tekrar geçersiz kılınana kadar uygulanır.PlayerManager.setMediaPlaybackInfoHandler()
Yalnızca mevcut yapılandırmaların üzerine yüklenen medya öğesi için ek yapılandırmalar uygulamak üzere. İşleyici, oynatıcı 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, PlaybackConfig
başlatılırken CastReceiverContext
değerinin nasıl ayarlanacağı gösterilmektedir. Yapılandırma, manifest alma 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ını 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ın 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 bilgisi işleyicisini kullanarak 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
değerinden licenseUrl
değerini almak için uygulamada 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, Web Receiver uygulamanızın oynatıcı etkinliklerini işlemesine olanak tanır. Etkinlik dinleyici, dinleyiciyi tetikleyecek 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
içinde bulabilirsiniz.
Etkinlik parametresi, etkinlik hakkında ek bilgiler sağlar.
Örneğin, bir mediaStatus
değişikliğinin yayınlanma zamanı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 yakalama
Web Receiver SDK, Web Receiver uygulamanızın mesajları yakalamasına ve bu mesajlarda özel kod yürütmesine olanak tanır. Mesaj yakalayıcı, hangi tür mesajın yakalanması gerektiğini belirten bir cast.framework.messages.MessageType
parametresi alır.
Arayıcı, değiştirilmiş isteği veya değiştirilmiş istek değeriyle çözümlenen bir Promise'i döndürmelidir. null
döndürülmesi, 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 bunları yakalayıp 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 yakalayıcıda hatalar 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 yakalama ve etkinlik işleyici
Mesaj yakalama ile etkinlik dinleyici arasındaki bazı önemli farklar şunlardır:
- Bir etkinlik dinleyicisi, istek verilerini değiştirmenize izin vermez.
- Etkinlik işleyici, 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 yakalama, bir mesajı dinlemenize, yakalamanıza ve istek verilerinin kendisini değiştirmenize olanak tanır.
- Mesaj yakalama, istek verileriyle ilgili özel mantığı işlemek için en iyi yöntemdir.
Medya yükleniyor
MediaInformation
entity
, contentUrl
ve contentId
dahil olmak üzere cast.framework.messages.MessageType.LOAD
mesajına medya yüklemek için çeşitli özellikler 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ı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
özelliği, oynatılabilir bir içerik URL'si (contentUrl
özelliğine benzer) veya yüklenen içerik ya da oynatma listesi için benzersiz bir tanımlayıcı olabilir. Bu özelliği tanımlayıcı olarak kullanıyorsanız 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 önerilir. Bunun bir örneği, aşağıdaki snippet'te gösterilmektedir. Burada entity
, LOAD
isteğinde yer alıyor ve oynatılabilir contentUrl
alınıyor:
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 bilgileri sağlar. getDeviceCapabilities
yöntemi, Google Asistan, Bluetooth ve bağlı ekran ile ses cihazları için destek bilgileri sağlar.
Bu yöntem, belirtilen numaralandırılmış değerlerden birini ileterek sorgulayabileceğiniz bir nesne döndürür. Böylece, bu numaralandırılmış değer için cihazın özelliğini alabilirsiniz. Numaralandırılmış değerler, 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 Dolby Vision (DV) 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 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 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şlemesine, 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ş denetleyicileri, dokunmatik cihazlarda çalışan alıcı ve uzaktan kumanda uygulamaları ile Android TV cihazlardaki alıcı uygulamaları için MediaStatus.supportedMediaCommands
tarafından belirlenir. Bir özellik için belirli bir bit düzeyinde Command
etkinleştirildiğinde, bu işlemle ilgili düğmeler etkinleştirilir. Değer ayarlanmamışsa düğme devre dışı bırakılır. Bu değerler, Web alıcısında şu şekilde değiştirilebilir:
- Belirli
Commands
değerini ayarlamak içinPlayerManager.setSupportedMediaCommands
kullanma addSupportedMediaCommands
kullanarak yeni 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
hazırladığında bu, supportedMediaCommands
mülkündeki değişiklikleri içerir. Durum yayınlandığında, bağlı gönderen uygulamaları kullanıcı arayüzlerindeki düğmeleri buna göre günceller.
Desteklenen medya komutları ve dokunmatik cihazlar hakkında daha fazla bilgi için Accessing UI controls
rehberine bakın.
Kullanıcı işlemi durumlarını yönetme
Kullanıcılar, kullanıcı arayüzüyle etkileşim kurduğunda veya sesli komut gönderdiğinde içeriğin oynatılmasını ve oynatılan öğeyle ilgili özellikleri kontrol edebilir. Oynatmayı kontrol eden istekler SDK tarafından otomatik olarak işlenir. Çalınan öğenin özelliklerini değiştiren istekler (ör. LIKE
komutu) alıcı uygulama tarafından işlenmelidir. SDK, bu tür istekleri işlemek için bir dizi API sağlar. Bu isteklerin desteklenmesi için aşağıdakilerin yapılması gerekir:
- Bir medya öğesi yüklenirken kullanıcının tercihlerine göre
MediaInformation
userActionStates
ayarlayın. USER_ACTION
iletilerine 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 yakalar ve LoadRequestData
'nin 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ı yakalar ve istenen değişiklikle arka uca yapılan çağrıyı işler. Ardından, alıcıdaki
UserActionState
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, bir arka uç hizmetine yapılan çağrıyı simüle eder. İşlev, kullanıcının istediği değişiklik türünü görmek için UserActionRequestData
öğesini kontrol eder ve yalnızca işlem arka uç tarafından destekleniyorsa bir ağ çağrısı yapar.
function sendUserAction(userActionRequestData, mediaInfo) {
return new Promise((resolve, reject) => {
switch (userActionRequestData.userAction) {
// Handle user action changes supported by the backend.
case cast.framework.messages.UserAction.LIKE:
case cast.framework.messages.UserAction.DISLIKE:
case cast.framework.messages.UserAction.FOLLOW:
case cast.framework.messages.UserAction.UNFOLLOW:
case cast.framework.messages.UserAction.FLAG:
case cast.framework.messages.UserAction.SKIP_AD:
let backendResponse = {userActionRequestData: userActionRequestData, mediaInfo: mediaInfo};
setTimeout(() => {resolve(backendResponse)}, 1000);
break;
// Reject all other user action changes.
default:
reject(
new cast.framework.messages.ErrorData(cast.framework.messages.ErrorType.INVALID_REQUEST));
}
});
}
Aşağıdaki snippet, UserActionRequestData
değerini alır ve UserActionState
değerini MediaInformation
değerine ekler veya MediaInformation
değerinden kaldırır. UserActionState
değerinin güncellenmesi, istenen işlemle ilişkili düğmenin durumunu değiştirir.MediaInformation
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ılı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 da 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
Şu anda Asistan özellikli cihazlar için Web Alıcı SDK'sında aşağıdaki medya komutları desteklenmektedir. Bu komutların varsayılan uygulamaları cast.framework.PlayerManager
içinde bulunur.
Komut | Açıklama |
---|---|
Play | Oynatmayı başlatın veya duraklatılmış durumdan devam ettirin. |
Duraklat | Şu anda oynatılan içeriği duraklatma |
Önceki | Medya kuyruğunuzdaki önceki medya öğesine atlar. |
İleri | Medya sıranızdaki bir sonraki medya öğesine atlama |
Durdur | Şu anda oynatılan medyayı durdurun. |
Hiçbirini tekrarlama | Sıradaki son öğe oynatıldıktan sonra sıradaki medya öğelerinin tekrarlanmasını devre dışı bırakır. |
Tekrar Çal | Şu anda oynatılan medya içeriğini süresiz olarak tekrarlayın. |
Tümünü Tekrarla | Sıradaki son öğe çalındıktan sonra sıradaki tüm öğeleri bir kez daha çalma |
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 kuyruğunuzdaki medya öğelerini karıştırın. |
Altyazılar AÇIK / KAPALI | Medyanız için altyazıları etkinleştirin veya devre dışı bırakın. Etkinleştirme / devre dışı bırakma işlemi dile göre de yapılabilir. |
Mutlak zamana gitme | Belirtilen mutlak zamana atlar. |
Geçerli saate göreceli zamanı arama | Mevcut oynatma süresine göre belirtilen süre kadar ileri veya geri atlar. |
Tekrar Oyna | Şu anda oynatılan medya içeriğini yeniden başlatır veya şu anda oynatılan bir içerik yoksa son oynatılan medya öğesini oynatır. |
Oynatma hızını ayarlama | Medya oynatma hızını değiştirme Bu durum varsayılan olarak ele alınmalıdır. Gelen oran isteklerini geçersiz kılmak için SET_PLAYBACK_RATE mesaj engelleyicisini kullanabilirsiniz. |
Sesle 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 gönderenlerindeki ve dokunma özellikli cihazlardaki kullanıcı arayüzü, bu yapılandırmaları yansıtacak şekilde değişir. İşaret etkinleştirilmezse gelen sesli komutlar yürütülür.
Örneğin, gönderen uygulamalarınızda ve dokunma özellikli cihazlarınızda PAUSE
özelliğine izin veriyorsanız alıcınızı da bu ayarları yansıtacak şekilde yapılandırmanız gerekir. Yapılandırıldığında, desteklenen komutlar listesinde yer almayan tüm gelen sesli komutlar bırakılı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 isterse bu istek 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
});
Sınırlamak istediğiniz her komut için ayrı bir mantık uygulayabilirsiniz. enforceSupportedCommands
işaretini kaldırın ve kısıtlamak istediğiniz her komut için gelen iletiyi engelleyebilirsiniz. Burada, SDK tarafından sağlanan isteği yakalıyoruz. Böylece, Asistan özellikli cihazlara verilen SEEK
komutları, Web Receiver uygulamanızda arama işlemini tetiklemez.
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 geri konuşma gibi Asistan etkinliği nedeniyle uygulamanızın sesini arka plana atarsa etkinlik başladığında Web Alıcı uygulamasına FocusState
NOT_IN_FOCUS
mesajı gönderilir. Etkinlik sona erdiğinde IN_FOCUS
ile başka bir mesaj gönderilir.
Uygulamanıza ve oynatılan medyaya bağlı olarak, FocusState
NOT_IN_FOCUS
olduğunda FOCUS_STATE
mesaj türünü yakalayarak medyayı duraklatmak isteyebilirsiniz.
Örneğin, Asistan bir kullanıcı sorgusuna yanıt veriyorsa sesli kitap oynatmayı duraklatmak iyi bir kullanıcı deneyimidir.
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.FOCUS_STATE,
focusStateRequestData => {
// Pause content when the app is out of focus. Resume when focus is restored.
if (focusStateRequestData.state == cast.framework.messages.FocusState.NOT_IN_FOCUS) {
playerManager.pause();
} else {
playerManager.play();
}
return focusStateRequestData;
});
Sesle belirtilen altyazı dili
Kullanıcı altyazıların dilini açıkça belirtmediğinde, altyazılarda kullanılan dil, komutun konuşulduğu dildir.
Bu senaryolarda, gelen mesajın isSuggestedLanguage
parametresi, ilişkili dilin önerilip önerilmediğini veya kullanıcı tarafından açıkça istenip istenmediğini gösterir.
Örneğin, "OK Google, altyazıları aç" komutunda isSuggestedLanguage
, true
olarak ayarlanır. Bunun nedeni, dilin komutun konuşulduğu dilden çıkarılmasıdır. Dil açıkça isteniyorsa (ör. "Ok Google, İngilizce altyazıları aç"), isSuggestedLanguage
değeri false
olarak ayarlanır.
Meta veriler ve ses aktarımı
Sesli komutlar varsayılan olarak Web Receiver tarafından işlenirken içeriğinizin meta verilerinin eksiksiz ve doğru olduğundan emin olmanız gerekir. Bu sayede, sesli komutların Asistan tarafından düzgün şekilde işlenmesi ve meta verilerin Google Home uygulaması ile Google Home Hub gibi akıllı ekranlar gibi yeni arayüz türlerinde düzgün şekilde gösterilmesi sağlanır.
Akış aktarma
Oturum durumunu koruma, akış aktarımının temelini oluşturur. Bu özellik sayesinde kullanıcılar, sesli komutları, Google Home uygulaması veya akıllı ekranları kullanarak mevcut ses ve video akışlarını cihazlar arasında taşıyabilir. Medya, bir cihazda (kaynak) oynatmayı durdurur ve başka bir cihazda (hedef) oynatmaya devam eder. En yeni donanım yazılımına sahip tüm Cast cihazlar, akış aktarımında kaynak veya hedef olarak kullanılabilir.
Akış aktarımı için etkinlik akışı şu şekildedir:
- Kaynak cihazda:
- Medya oynatmayı durdurur.
- Web alıcı 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ı uygulaması, kaydedilen 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 kuyruktaki (ör. oynatma listesi veya sanatçı radyosu) yeri
- Kimliği doğrulanmış kullanıcı.
- Oynatma durumu (ör. oynatılıyor veya duraklatıldı)
Akış aktarma özelliğini etkinleştirme
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 yakalayıcılarını 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ı korumaya yönelik varsayılan uygulama, akış aktarımını destekler.
Oturum durumunu koruma
Web Receiver SDK, Web Receiver uygulamalarının mevcut medya durumunun anlık görüntüsünü alarak, durumu yükleme isteğine dönüştürerek ve oturumu yükleme isteğiyle devam ettirerek oturum durumlarını koruması için varsayılan bir uygulama sağlar.
Gerekirse Web Receiver tarafından oluşturulan yükleme isteği, SESSION_STATE
mesajı yakalayıcıda geçersiz kılınabilir. Yükleme isteğine özel veriler eklemek istiyorsanız bunları loadRequestData.customData
içine 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
ileti önleyici içinde 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ı, kuyruktaki mevcut oynatma öğesinden sonraki medya öğelerinin önceden yüklenmesini destekler.
Ön yükleme işlemi, yaklaşan öğelerin birkaç segmentini önceden indirir. Belirtme işlemi, QueueItem nesnesindeki preloadTime değeriyle yapılır (sağlanmazsa varsayılan olarak 20 saniye). Süre, saniye cinsinden ifade edilir ve şu anda oynatılan öğenin sonuna göre belirlenir . 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'da kalan süreden daha uzunsa önceden yükleme mümkün olan en kısa sürede gerçekleşir. Bu nedenle, queueItem'da çok büyük bir önceden yükleme değeri belirtilirse mevcut öğeyi oynatırken bir sonraki öğeyi önceden yükleme etkisi elde edilebilir. Ancak bu değer, oynatılan öğenin bant genişliğini ve yayın performansını etkileyebileceğinden bu ayarı ve seçimi geliştiriciye bırakıyoruz.
Önceden yükleme, varsayılan olarak HLS, DASH ve Smooth Streaming içeriklerinde çalışır.
MP3 gibi normal MP4 video ve ses dosyaları önceden yüklenmez. Cast cihazlar yalnızca bir medya öğesini destekler ve mevcut bir içerik öğesi oynatılırken önceden yükleme için kullanılamaz.
Özel mesajlar
İleti değişimi, Web Alıcı uygulamaları için temel etkileşim yöntemidir.
Bir gönderen, çalıştığı platformun (Android, iOS, Web) gönderen API'lerini kullanarak bir Web alıcısına mesaj gönderir. Etkinlik işleyicilere iletilen etkinlik nesnesinde (mesajın gösterimi) verilerin belirli etkinlik türünün özelliklerini aldığı bir veri öğesi (event.data
) bulunur.
Bir Web Receiver uygulaması, belirli bir ad alanındaki mesajları dinlemeyi seçebilir. Bu sayede, Web Alıcı uygulamasının söz konusu ad alanı protokolünü desteklediği söylenir. Bu durumda, söz konusu 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 herhangi bir dizeyle devam eden "urn:x-cast:
" ile başlamalıdır. Örneğin,
"urn:x-cast:com.example.cast.mynamespace
".
Web alıcının bağlı gönderenlerden gelen özel mesajları dinlemesi için 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 Receiver uygulamaları da bağlı gönderenlere mesaj göndererek gönderenleri Web Receiver'ın durumu hakkında bilgilendirebilir. Web alıcı uygulaması, sendCustomMessage(namespace, senderId, message)
kullanarak CastReceiverContext
üzerinde mesaj gönderebilir.
Bir Web Alıcı, alınan bir mesaja yanıt olarak veya uygulama durumu değişikliği nedeniyle tek bir gönderene mesaj gönderebilir. Noktadan noktaya mesajlaşmanın (64 KB sınırı vardır) yanı sıra bir Web Alıcı, bağlı tüm gönderenlere mesaj da yayınlayabilir.
Ses cihazlarında yayın yapma
Yalnızca ses oynatma konusunda destek için Ses cihazları için Google Cast rehberine bakın.
Android TV
Bu bölümde, Google Web Receiver'ın girişlerinizi oynatma olarak 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. elde tutulan uzaktan kumanda) gelen girişleri, Medya Oynatma Mesajları bölümünde açıklandığı gibi urn:x-cast:com.google.cast.media
ad alanı için tanımlanan medya oynatma mesajları olarak çevirir. Android TV'nin kontrol girişlerinden temel oynatma kontrolüne izin vermek için uygulamanız, uygulama medya oynatmasını kontrol etmek üzere bu mesajları desteklemelidir.
Android TV uyumluluğu yönergeleri
Uygulamanızın Android TV ile uyumlu olmasını sağlamak için bazı öneriler ve kaçınılması gereken yaygın hatalar:
- Kullanıcı aracısı dizesinin hem "Android" hem de "CrKey" içerdiğini unutmayın. Bazı siteler, "Android" etiketini algıladıkları için yalnızca mobil cihazlara yönelik bir siteye yönlendirme yapabilir. Kullanıcı aracısı dizesindeki "Android"in her zaman mobil kullanıcıyı gösterdiğini varsaymayın.
- Android'in medya yığını, veri getirmek için şeffaf GZIP'i kullanabilir. Medya verilerinizin
Accept-Encoding: gzip
yanıt verebildiğinden emin olun. - Android TV HTML5 medya etkinlikleri, Chromecast'ten farklı zamanlarda tetiklenebilir. Bu durum, Chromecast'te gizli olan sorunları ortaya çıkarabilir.
- Medya güncellenirken
<audio>/<video>
gibi öğeler tarafından tetiklenen medya ile ilgili etkinlikleri kullanın.timeupdate
pause
waiting
Ağ ile ilgili etkinlikleri (ör.progress
,suspend
vestalled
) kullanmaktan kaçının. Bu etkinlikler platforma bağlı olma eğilimindedir. Alıcınızdaki 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. Aşağıdakileri 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 çözünürlükte gösterebilir. Alıcı sayfanızın farklı çözünürlüklerde düzgün şekilde ölçeklendiğinden emin olun.