Bu sayfada kod snippet'leri ve bir Özel Web Alıcısı uygulaması için kullanılabilen özelliklerin açıklamaları yer almaktadır.
- Web Alıcısı ile sağlanan yerleşik oynatıcı kullanıcı arayüzünü temsil eden
cast-media-player
öğesi. background-image
,splash-image
vefont-family
gibi çeşitli kullanıcı arayüzü öğelerini biçimlendirmek içincast-media-player
öğesine yönelik CSS benzeri özel stil.- Web Alıcısı çerçevesini yükleyecek bir komut dosyası öğesi.
- İletilere müdahale etmek ve etkinlikleri işlemek için kullanılan JavaScript kodu.
- Otomatik oynatma sırası.
- Oynatmayı yapılandırma seçenekleri.
- Web Alıcısı bağlamını ayarlama seçenekleri.
- Web Alıcısı uygulamasının desteklediği 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
CastReceiverContext
, geliştiriciye verilen en harici sınıftır ve temel kitaplıkların yüklenmesini yönetir ve Web Alıcı SDK'sının ilk kullanıma hazırlanmasını yönetir.
Web Receiver API, bir gönderenin bağlantısının kesildiğini algılarsa SENDER_DISCONNECTED
etkinliğini artırır. Web Alıcı, maxInactivity
saniye olarak tanımladığımız
gönderenle iletişim kuramazsa SENDER_DISCONNECTED
etkinliğini de yükseltir. Geliştirme sırasında maxInactivity
değerini yüksek bir değere ayarlamak iyi bir fikirdir. Böylece, Chrome Alıcısı Hata Ayıklayıcısı ile uygulamada hata ayıklarken Web Alıcısı uygulaması kapanmaz:
const context = cast.framework.CastReceiverContext.getInstance();
const options = new cast.framework.CastReceiverOptions();
options.maxInactivity = 3600; //Development only
context.start(options);
Bununla birlikte, yayınlanmış bir Web Alıcı uygulaması için maxInactivity
ayarlamamak ve bunun yerine varsayılan değeri kullanmak daha iyidir. Web Alıcısı seçeneklerinin uygulamada yalnızca bir kez ayarlandığını unutmayın.
Diğer yapılandırma cast.framework.PlaybackConfig
şeklindedir.
Bu, aşağıdaki şekilde ayarlanabilir:
const playbackConfig = new cast.framework.PlaybackConfig();
playbackConfig.manifestRequestHandler = requestInfo => {
requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});
Bu yapılandırma, her içerik oynatmayı etkiler ve esasen geçersiz kılma davranışı sağlar. Geliştiricilerin geçersiz kılabileceği davranışların listesi için cast.framework.PlaybackConfig
tanımını inceleyin. İçerikler arasındaki yapılandırmayı değiştirmek için PlayerManager
kullanılarak mevcut playbackConfig
öğesi alınabilir, bir geçersiz kılma değiştirilebilir, ek olarak playbackConfig
sıfırlanabilir:
const playerManager =
cast.framework.CastReceiverContext.getInstance().getPlayerManager();
const playbackConfig = (Object.assign(
new cast.framework.PlaybackConfig(), playerManager.getPlaybackConfig()));
playbackConfig.autoResumeNumberOfSegments = 1;
playerManager.setPlaybackConfig(playbackConfig);
PlaybackConfig
geçersiz kılınmadığı takdirde getPlaybackConfig()
boş bir nesne döndürür. PlaybackConfig that
üzerindeki tüm tesisler undefined
ise varsayılan değerleri kullanır.
Etkinlik işleyici
Web Alıcı SDK'sı, Web Alıcı uygulamanızın oynatıcı etkinliklerini işleyebilmesini sağlar. Etkinlik işleyici, işleyiciyi tetiklemesi gereken etkinlikleri belirten bir cast.framework.events.EventType
parametresi (veya bu parametreler dizisi) alır. Hata ayıklama için yararlı olan önceden yapılandırılmış cast.framework.events.EventType
dizileri cast.framework.events.category
içinde bulunabilir.
Etkinlik parametresi, etkinlik hakkında ek bilgiler sağlar.
Örneğin, bir mediaStatus
değişikliğinin ne zaman yayınlandığını öğrenmek istiyorsanız etkinliği yönetmek 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
});
İleti müdahalesi
Web Alıcı SDK'sı, Web Alıcı uygulamanızın mesajlara müdahale etmesine ve bu mesajlarda özel kod yürütmesine olanak tanır. Mesaj müdahalecisi, ne tür bir mesajın müdahale edilmesi gerektiğini belirten bir cast.framework.messages.MessageType
parametresi alır.
Arayanın, değiştirilen isteği veya değiştirilen istek değeriyle çözümlenen bir söz verme döndürmelidir. null
işlevinin 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 istiyorsanız bu verilere müdahale etmek ve değişiklik yapmak için aşağıdaki mantığı kullanabilirsiniz:
const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD, loadRequestData => {
const error = new cast.framework.messages.ErrorData(
cast.framework.messages.ErrorType.LOAD_FAILED);
if (!loadRequestData.media) {
error.reason = cast.framework.messages.ErrorReason.INVALID_PARAM;
return error;
}
if (!loadRequestData.media.entity) {
return loadRequestData;
}
return thirdparty.fetchAssetAndAuth(loadRequestData.media.entity,
loadRequestData.credentials)
.then(asset => {
if (!asset) {
throw cast.framework.messages.ErrorReason.INVALID_REQUEST;
}
loadRequestData.media.contentUrl = asset.url;
loadRequestData.media.metadata = asset.metadata;
loadRequestData.media.tracks = asset.tracks;
return loadRequestData;
}).catch(reason => {
error.reason = reason; // cast.framework.messages.ErrorReason
return error;
});
});
context.start();
Hata işleme
Mesaj müdahalecide hata oluştuğunda Web Alıcı uygulamanızın uygun bir cast.framework.messages.ErrorType
ve cast.framework.messages.ErrorReason
kodu döndürmesi gerekir.
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 ve etkinlik işleyici arasındaki bazı önemli farklar şunlardır:
- Etkinlik işleyici, istek verilerini değiştirmenize izin vermez.
- Etkinlik dinleyici, en iyi analizi veya özel bir işlevi tetiklemek için en iyi seçenektir.
playerManager.addEventListener(cast.framework.events.category.CORE,
event => {
console.log(event);
});
- Mesaj müdahalesi sayesinde bir mesajı dinleyebilir, müdahale edebilir ve istek verilerini değiştirebilirsiniz.
- Mesaj müdahalesi, istek verileriyle ilgili özel mantığı yönetmek için en iyi şekilde kullanılır.
Medya yükleniyor
MediaInformation
, cast.framework.messages.MessageType.LOAD
mesajında medya yükleme için entity
, contentUrl
ve contentId
dahil çok sayıda özellik sağlar.
entity
, hem gönderen hem de alıcı uygulamalarınızda uygulamanızda kullanmanız önerilen özelliktir. Özellik, oynatma listesi veya belirli bir medya içeriği olabilen bir derin bağlantı URL'sidir.
contentUrl
, oynatılabilir bir URL için tasarlanmıştır ve kullanılabilir olduğunda kullanılabilir.
Değerin medya URL'si, gerçek bir kimlik veya özel arama için bir anahtar parametresi olup olmadığından emin olunmaması nedeniyle contentId
kullanımdan kaldırıldı.
Gerçek kimliği veya anahtar parametrelerini depolamak için entity
, medya URL'si için contentUrl
kullanmanız önerilir. entity
snippet'inin LOAD
isteğinde mevcut olduğu ve oynatılabilir contentUrl
değerinin alındığı aşağıdaki snippet'te bir örnek 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 buna bağlı video ya da 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, enum için cihaz özelliğini almak üzere belirtilen enum'lardan birini ileterek sorgulayabileceğiniz bir nesne döndürür. Sıralamalar, cast.framework.system.DeviceCapabilities
içinde tanımlanır.
Bu örnekte, Web Alıcı cihazının sırasıyla IS_HDR_SUPPORTED
ve IS_DV_SUPPORTED
tuşlarıyla HDR ve DolbyVision (DV) oynatma özelliğine sahip olup olmadığı kontrol edilmektedir.
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ı, gönderen uygulamaları (Web, Android ve iOS), Asistan özellikli cihazlarda sesli komutlar, akıllı ekranlarda dokunmatik kontroller ve Android TV cihazlarında uzaktan kumanda aracılığıyla Web Alıcı uygulamanızla etkileşim kurabilir. Cast SDK'sı, Web Alıcı uygulamasının bu etkileşimleri işlemesi, uygulama kullanıcı arayüzünü kullanıcı işlemi durumları aracılığıyla güncellemesi ve isteğe bağlı olarak herhangi bir arka uç hizmetini güncellemek için değişiklikleri göndermesi için çeşitli API'ler sağlar.
Desteklenen medya komutları
Kullanıcı arayüzü kontrol durumları, iOS ve Android gönderenleri için genişletilmiş kumandalar, dokunmatik cihazlarda çalışan alıcı ve uzaktan kumanda uygulamaları ve Android TV cihazlarındaki alıcı uygulamaları için MediaStatus.supportedMediaCommands
tarafından desteklenir. Özellikte 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 yöntemlerle değiştirilebilir:
- Belirli bir
Commands
ayarlamak içinPlayerManager.setSupportedMediaCommands
özelliğini addSupportedMediaCommands
kullanarak yeni bir komut eklemeremoveSupportedMediaCommands
kullanarak mevcut bir komutu kaldırma.
playerManager.setSupportedMediaCommands(cast.framework.messages.Command.SEEK |
cast.framework.messages.Command.PAUSE);
Alıcı, güncellenen MediaStatus
dosyasını hazırladığında değişiklikleri supportedMediaCommands
özelliğine ekler. 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 bulunduklarında veya sesli komutlar gönderdiğinde, oynatılan öğeyle ilgili içeriğin ve özelliklerin oynatılmasını kontrol edebilirler. Oynatmayı kontrol eden istekler SDK tarafından otomatik olarak işlenir. Oynatılan geçerli öğenin özelliklerini (ör. LIKE
komutu) değiştiren istekler, alıcı uygulamanın bunları işlemesini gerektirir. SDK, bu tür istekleri işlemek için bir dizi API sağlar. Bu istekleri desteklemek için aşağıdakileri yapmanız gerekir:
USER_ACTION
iletiye müdahale edin ve istenen işlemi belirleyin.- Kullanıcı arayüzünü güncellemek için
MediaInformation
UserActionState
alanını güncelleyin.
Aşağıdaki snippet, USER_ACTION
mesajına müdahale edip istenen değişiklikle arka ucu çağırmayı işler. Daha sonra, alıcıdaki UserActionState
'nin güncellenmesi için bir çağrı oluşturur.
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 çağrıyı simüle eder. İşlev, kullanıcının istediği değişiklik türünü görmek için UserActionRequestData
öğesini kontrol eder ve yalnızca işlem arka uç tarafından destekleniyorsa ağ çağrısı yapar.
function sendUserAction(userActionRequestData, mediaInfo) {
return new Promise((resolve, reject) => {
switch (userActionRequestData.userAction) {
// Handle user action changes supported by the backend.
case cast.framework.messages.UserAction.LIKE:
case cast.framework.messages.UserAction.DISLIKE:
case cast.framework.messages.UserAction.FOLLOW:
case cast.framework.messages.UserAction.UNFOLLOW:
case cast.framework.messages.UserAction.FLAG:
case cast.framework.messages.UserAction.SKIP_AD:
let backendResponse = {userActionRequestData: userActionRequestData, mediaInfo: mediaInfo};
setTimeout(() => {resolve(backendResponse)}, 1000);
break;
// Reject all other user action changes.
default:
reject(
new cast.framework.messages.ErrorData(cast.framework.messages.ErrorType.INVALID_REQUEST));
}
});
}
Aşağıdaki snippet, UserActionRequestData
öğesini alır ve MediaInformation
etiketinden UserActionState
anahtar kelimesini ekler veya kaldırır. MediaInformation
öğesinin UserActionState
öğesinin güncellenmesi, istenen işlemle ilişkili düğmenin durumunu değiştirir. Bu değişiklik; akıllı ekran kontrolleri kullanıcı arayüzü, uzaktan kumanda uygulaması ve Android TV kullanıcı arayüzüne yansıtılır. Ayrıca, iOS ve Android gönderenler için genişletilmiş kumandanın kullanıcı arayüzünü güncellemek amacıyla giden MediaStatus
mesajları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
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
bölümünde bulunur.
Komut | Açıklama |
---|---|
Çal | Oynatmayı duraklat veya devam ettir. |
Duraklat | Şu anda oynatılan içeriği duraklatın. |
Önceki | Medya sıranızdaki önceki medya öğesine atlayın. |
Sonraki | Medya sıranızdaki bir sonraki medya öğesine atlayın. |
Durdur | Şu anda oynatılan medyayı durdur. |
Yok Tekrarlama | Sıradaki son öğenin oynatılması bittiğinde, sıradaki medya öğelerinin tekrarlanmasını devre dışı bırak. |
Yinelenen Tekli | Şu anda oynatılan medyayı süresiz olarak tekrar et. |
Tümünü Tekrarla | Sıradaki son öğe oynatıldığında, sıradaki tüm öğeleri tekrarlayın. |
Tümünü Tekrarla ve Karıştır | Sıradaki son öğenin oynatılması tamamlandıktan sonra sırayı karıştırıp sıradaki tüm öğeleri tekrarlayın. |
Karışık çal | Medya sıranızdaki medya öğelerini karıştırın. |
Altyazılar AÇIK / KAPALI | Medyanız için Altyazıyı Etkinleştirin / Devre Dışı Bırakın. Etkinleştir / Devre dışı bırak dillerine göre de kullanılabilir. |
Mutlaka ara | Belirtilen mutlak zamana atlar. |
Geçerli zamana göre arama | Geçerli oynatma süresine göre belirtilen zaman aralığında atlar veya geri atlar. |
Tekrar Oyna | Şu anda oynatılan medyayı yeniden başlatın veya en son oynatılan medya öğesini oynatın. |
Oynatma hızını ayarlama | Değişken medya oynatma hızı. Bu sorun, varsayılan olarak ele alınmalıdır. Gelen ücret isteklerini geçersiz kılmak için SET_PLAYBACK_RATE mesaj alıcısını kullanabilirsiniz. |
Sesli desteklenen medya komutları
Sesli komutların Asistan özellikli bir cihazda medya komutu tetiklemesini önlemek için önce desteklemeyi planladığınız desteklenen medya komutlarını ayarlamanız gerekir. Daha sonra CastReceiverOptions.enforceSupportedCommands
özelliğini etkinleştirerek bu komutları zorunlu kılmanız gerekir. Cast SDK'sı gönderenlerdeki ve dokunmatik özellikli cihazlardaki kullanıcı arayüzü, bu yapılandırmaları yansıtacak şekilde değişecektir. Bayrak etkin değilse gelen sesli komutlar yürütülür.
Örneğin, gönderen uygulamalarınızdan ve dokunmatik özellikli cihazlarınızdan PAUSE
özelliğine 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 edilmezse gelen tüm sesli komutlar atlanır.
Aşağıdaki örnekte CastReceiverContext
öğesini başlatırken CastReceiverOptions
öğesini sağlıyoruz. PAUSE
komutu için destek eklendi ve oynatıcının yalnızca bu komutu desteklemesi zorunlu kılındı. Sesli komut, SEEK
gibi başka bir işlem için istekte bulunursa 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ı bir mantık uygulayabilirsiniz. enforceSupportedCommands
işaretini kaldırın. Kısıtlamak istediğiniz her komut için gelen mesaja müdahale edebilirsiniz. Burada, Asistan özellikli cihazlara verilen SEEK
komutlarının Web Alıcısı uygulamanızda bir arama tetiklememesi için SDK tarafından sağlanan isteğe müdahale edebiliriz.
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 oluşturma
Cast platformu, kullanıcının konuşmasını dinleme veya konuşma gibi Asistan etkinlikleri nedeniyle uygulamanızın sesini arka plana geçirirse etkinlik başladığında Web Alıcısı uygulamasına NOT_IN_FOCUS
FocusState
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
ise medya türünü FOCUS_STATE
mesaj türüne müdahale ederek duraklatabilirsiniz.
Örneğin, Asistan bir kullanıcı sorgusuna yanıt veriyorsa sesli kitap çalmayı duraklatmak iyi bir kullanıcı deneyimi sağlar.
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.FOCUS_STATE,
focusStateRequestData => {
// Pause content when the app is out of focus. Resume when focus is restored.
if (focusStateRequestData.state == cast.framework.messages.FocusState.NOT_IN_FOCUS) {
playerManager.pause();
} else {
playerManager.play();
}
return focusStateRequestData;
});
Sesle belirtilen altyazı dili
Kullanıcı altyazıların dilini açıkça belirtmediğinde altyazılar için kullanılan dil, komutun söylendiği dille aynı olur.
Bu senaryolarda, gelen mesajın isSuggestedLanguage
parametresi, ilişkili dilin kullanıcı tarafından önerilip önerilmediğini veya açıkça talep edilip edilmediğini gösterir.
Örneğin, dil, komut dosyasının konuşulduğu dile göre tahmin edildiğinden isSuggestedLanguage
, "Ok Google, altyazıları aç" komutu için true
olarak ayarlanır. Dil açıkça isteniyorsa (ör. "Ok Google, İngilizce altyazıları aç") isSuggestedLanguage
, false
olarak ayarlanır.
Meta veri ve ses yayını
Sesli komutlar varsayılan olarak Web Alıcısı tarafından işlense de içeriğinizin meta verilerinin eksiksiz ve doğru olduğundan emin olmanız gerekir. Bu, sesli komutların Asistan tarafından doğru şekilde işlenmesini ve meta verilerin, Google Home uygulaması ve Google Home Hub gibi akıllı ekranlar gibi yeni arayüz türlerinde düzgün bir şekilde gösterilmesini sağlar.
Akış aktarma
Oturum durumunu korumak, kullanıcıların ses komutlarını, Google Home uygulamasını 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) oynamayı durdurur ve başka bir cihazda (hedef) devam eder. En son donanım yazılımına sahip tüm Yayın cihazları, akış aktarımında kaynak veya hedef işlevi görebilir.
Akış aktarımı için etkinlik akışı şöyledir:
- Kaynak cihazda:
- Medyanın oynatılması durdurulur.
- Web Alıcısı uygulaması, mevcut medya durumunu kaydetmek için bir komut alır.
- Web Alıcısı uygulaması kapatıldı.
- Hedef cihazda:
- Web Alıcısı uygulaması yüklendi.
- Web Alıcısı uygulaması, kayıtlı medya durumunu geri yüklemek için bir komut alır.
- Medya oynatılmaya devam ediyor.
Medya durumu öğeleri arasında şunlar bulunur:
- Şarkının, videonun veya medya öğesinin belirli bir konumu ya da zaman damgası.
- Daha geniş bir sırada (ör. oynatma listesi veya sanatçı radyosu) yer alır.
- Kimliği doğrulanmış kullanıcı.
- Oynatma durumu (örneğin, oynatılıyor veya duraklatıldı).
Akış aktarımı etkinleştiriliyor
Web Alıcınız için akış aktarımını uygulamak üzere:
supportedMediaCommands
alanınıSTREAM_TRANSFER
komutuyla güncelleyin:playerManager.addSupportedMediaCommands( cast.framework.messages.Command.STREAM_TRANSFER, true);
- İsteğe bağlı olarak Oturum durumunu koruma bölümünde açıklandığı gibi
SESSION_STATE
veRESUME_SESSION
mesaj kesicilerini 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 durumunu koruma
Web Alıcı SDK'sı, mevcut medya durumunun anlık görüntüsünü alıp durumu bir yükleme isteğine dönüştürerek ve yükleme isteğini kullanarak oturumu devam ettirerek Web Alıcı uygulamalarının oturum durumlarını koruması için varsayılan bir uygulama sağlar.
Web Alıcısı tarafından oluşturulan yükleme isteği, gerekirse SESSION_STATE
mesaj alıcısında geçersiz kılınabilir. Yükleme isteğine özel veriler eklemek istiyorsanız bu verileri loadRequestData.customData
bölümüne 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 alıcısındaki 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 ön 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ğerinde 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 mevcut öğede kalan süreden yüksekse ön yükleme mümkün olan en kısa sürede gerçekleşir. Sıra Öğesinde çok büyük bir önceden yükleme değeri belirtilirse, geçerli öğeyi her oynattığımızda, bir sonraki öğeyi önceden yüklüyoruz. Ancak bu değer, mevcut oynatma öğesinin bant genişliğini ve akış performansını etkileyebileceği için bu ayarı ve geliştiriciye seçimini bırakırız.
Önceden yükleme, HLS, DASH ve Smooth akış içeriklerinde varsayılan olarak çalışır.
Yayınlama cihazları yalnızca bir medya öğesini desteklediğinden ve mevcut bir içerik öğesi oynatılmaya devam ederken önceden yüklemek için kullanılamaz. Bu nedenle, MP3 gibi normal MP4 video ve ses dosyaları önceden yüklenmez.
Özel mesajlar
Mesaj alışverişi, Web Alıcı uygulamaları için temel etkileşim yöntemidir.
Gönderen, gönderenin çalıştığı platform (Android, iOS, Web) için gönderen API'lerini kullanarak bir Web Alıcısına ileti gönderir. Etkinlik işleyicilere aktarılan etkinlik nesnesi (mesajın manifest dosyası), verilerin belirli etkinlik türünün özelliklerini aldığı bir veri öğesine (event.data
) sahiptir.
Bir Web Alıcı uygulaması, belirtilen bir ad alanındaki mesajları dinlemeyi seçebilir. Bu nedenle Web Alıcı uygulamasının bu ad alanı protokolünü desteklediği söylenir. Daha sonra, söz konusu ad alanında iletişim kurmak isteyen tüm bağlı gönderenler, uygun protokolü kullanmak için karar verir.
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
".
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ı uygulamaları, bağlı gönderenlere ileti göndererek Web Alıcısı'nın durumu hakkında bilgi verebilir. Bir Web Alıcı uygulaması, CastReceiverContext
cihazında sendCustomMessage(namespace, senderId, message)
kullanarak mesaj gönderebilir.
Bir Web Alıcı, alınan bir iletiye yanıt olarak veya uygulama durumu değişikliği nedeniyle tek bir gönderene ileti gönderebilir. Noktalı mesajlaşmanın (64 KB sınırıyla) ötesinde, bir Web Alıcısı tüm bağlı gönderenlere de mesaj yayınlayabilir.
Ses cihazları için yayınlama
Yalnızca ses oynatma konusunda destek almak isterseniz Ses cihazları için Google Cast kılavuzuna bakın.
Android TV
Bu bölümde, Google Web Alıcısı'nın girişlerinizi, oynatma olarak ve Android TV uyumluluğu olarak nasıl kullandığı anlatılmaktadır.
Uygulamanızı uzaktan kumandayla entegre etme
Android TV cihazında çalışan Google Web Alıcısı, cihazın kontrol girişlerindeki girişi (el tipi uzak kumanda) Medya Oynatma Mesajları'nda açıklandığı gibi urn:x-cast:com.google.cast.media
ad alanı için tanımlanan medya oynatma mesajları olarak çevirir. Uygulamanız, Android TV'nin kontrol girişlerinden temel oynatma kontrolüne izin vermek için uygulama medya oynatmasını kontrol etmek üzere bu mesajları desteklemelidir.
Android TV uyumluluğuyla ilgili yönergeler
Uygulamanızın Android TV ile uyumlu olduğundan emin olmak için kaçınılması 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 tespit ettikleri için yalnızca mobil olan bir siteye yönlendirme yapabilir. Kullanıcı aracısı dizesinde "Android"in her zaman bir mobil kullanıcıyı gösterdiğini varsaymayın.
- Android'in medya yığını, verileri getirmek için şeffaf GZIP kullanabilir. Medya verilerinizin
Accept-Encoding: gzip
öğesine yanıt verebildiğinden emin olun. - Android TV HTML5 medya etkinlikleri, Chromecast'ten farklı zamanlamalarda tetiklenebilir. Bu durum, Chromecast'te gizlenen sorunları ortaya çıkarabilir.
- Medyayı güncellerken
timeupdate
,pause
vewaiting
gibi<audio>/<video>
öğeleri tarafından tetiklenen medya ile ilgili etkinlikleri kullanın.progress
,suspend
vestalled
gibi ağla alakalı etkinlikler platforma bağlı olduğundan genellikle bu etkinliklerden kaçının. 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ı eklediğinizden emin olun. Doğrulama için Qualsys SSL test sayfasına göz atı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'yi içeren diğer Cast platformları, sayfayı 1080p'ye kadar görüntüleyebilir. Alıcı sayfanızın farklı çözünürlüklerde sorunsuz şekilde ölçeklendirildiğinden emin olun.