Özel Web Alıcınıza Temel Özellikler Ekleyin

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

Bu sayfada kod snippet'leri ve Özel Web Alıcısı uygulaması için kullanılabilen özelliklerin açıklamaları yer almaktadır.

  1. Web Alıcısı'yla sağlanan yerleşik oynatıcı kullanıcı arayüzünü temsil eden bir cast-media-player öğesi.
  2. background-image, splash-image ve font-family gibi çeşitli kullanıcı arayüzü öğelerini biçimlendirmek için cast-media-player öğesine yönelik özel CSS benzeri stil.
  3. Web Alıcısı çerçevesini yükleyecek bir komut dosyası öğesi.
  4. Mesajlara müdahale etmek ve etkinlikleri yönetmek için kullanılan JavaScript kodu.
  5. Otomatik oynatma sırası.
  6. Oynatmayı yapılandırma seçenekleri.
  7. Web Alıcısı bağlamını ayarlama seçenekleri.
  8. Web Alıcısı uygulamasının desteklediği komutları ayarlama seçenekleri.
  9. 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ısı SDK'sının ilk kullanıma hazırlanmasını işler.

Web Alıcısı API'si bir gönderenin bağlantısının kesildiğini tespit ederse SENDER_DISCONNECTED etkinliğini artırır. Web Alıcısı, maxInactivity saniye olarak açıkladığımız süre boyunca gönderenle iletişim kuramazsa SENDER_DISCONNECTED etkinliğini de artırır. Geliştirme sırasında maxInactivity değerini, Chrome Uzaktan Hata Ayıklama Aracısı ile uygulamada hata ayıklarken Web Alıcısı uygulamasının kapanmaması için yüksek bir değere ayarlamak iyi bir fikirdir:

const context = cast.framework.CastReceiverContext.getInstance();
const options = new cast.framework.CastReceiverOptions();
options.maxInactivity = 3600; //Development only
context.start(options);

Ancak yayınlanmış bir Web Alıcı uygulaması için, maxInactivity 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 ise cast.framework.PlaybackConfig öğesidir. 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 bir içerik oynatmayı etkiler ve temelde 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ında yapılandırmayı değiştirmek için PlayerManager kullanarak mevcut playbackConfig değerini alabilir, bir geçersiz kılmayı değiştirebilir veya playbackConfig öğesini aşağıdaki şekilde sıfırlayabilirsiniz:

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ınmazsa getPlaybackConfig() boş değerli bir nesne döndürür. PlaybackConfig that üzerindeki tüm tesisler undefined için varsayılan değerleri kullanır.

Etkinlik işleyici

Web Alıcısı 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 parametrelerden oluşan bir dizi) alır. Hata ayıklama için faydalı olan önceden yapılandırılmış cast.framework.events.EventType dizileri cast.framework.events.category içinde bulunabilir. Etkinlik parametresi, etkinlikle ilgili ek bilgiler sağlar.

Örneğin, bir mediaStatus değişikliğinin ne zaman yayınlanacağı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
});

Mesaj müdahalesi

Web Alıcısı SDK'sı, Web Alıcı uygulamanızın mesajlara müdahale etmesine ve bu mesajlarda özel kod yürütmesine olanak tanır. Mesaj önleyici, ne tür bir mesajın müdahale edilmesi gerektiğini belirten bir cast.framework.messages.MessageType parametresi alır.

Araya girenin, değiştirilen isteği veya değiştirilen istek değeriyle çözümlenen bir sözü döndürmesi gerekir. null döndürülmesi, varsayılan mesaj işleyicinin çağrılmasını engeller. Daha fazla bilgi için Medya yükleme başlıklı makaleyi inceleyin.

Örneğin, yükleme isteği verilerini değiştirmek isterseniz müdahale etmek 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 kesicide hata meydana geldiğinde Web Alıcısı uygulamanız uygun bir cast.framework.messages.ErrorType ve cast.framework.messages.ErrorReason döndürür.

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 işleyiciyi kullanmak, 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 bir mesajı dinlemenize, ele geçirmenize ve istek verilerini değiştirmenize olanak tanır.
  • Mesaj müdahalesi, istek verileriyle ilgili özel mantığın işlenmesi için en iyi yöntemdir.

Medya yükleniyor

MediaInformation cast.framework.messages.MessageType.LOAD mesajına medya yüklenmesi için entity, contentUrl ve contentId dahil pek çok özellik sağlar.

entity, hem gönderen hem de alıcı uygulamalarınız için uygulamanızda kullanmanız önerilen mülktür. Mülk, oynatma listesi veya belirli bir medya içeriği olabilen bir derin bağlantı URL'sidir.

Oynatılabilir bir URL için tasarlanmış olan contentUrl, kullanılabilir olduğunda kullanılabilir.

Değerin medya URL'si, gerçek bir kimlik veya özel arama için bir anahtar parametresi olup olmamasından kaynaklanan belirsizlik nedeniyle contentId kullanımdan kaldırıldı.

Gerçek kimliği veya anahtar parametrelerini depolamak için entity, medya URL'si için de 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 bununla bağlantılı video veya ses cihazında cihaz bilgileri sağlar. getDeviceCapabilities yöntemi, Google Asistan ve Bluetooth'un yanı sıra bağlı ekran ve ses cihazları için destek bilgileri sağlar.

Bu yöntem, enum için cihaz yeteneğini elde etmek amacıyla belirtilen numaralandırmalardan birini ileterek sorgulayabileceğiniz bir nesne döndürür. Sıralamalar cast.framework.system.DeviceCapabilities içinde tanımlanır.

Bu örnek, Web Alıcısı cihazının sırasıyla IS_HDR_SUPPORTED ve IS_DV_SUPPORTED tuşlarıyla HDR ve DolbyVision (DV) oyunlarını oynatıp çalıştıramayacağını 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

Bir 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şimde bulunabilir. Cast SDK'sı, Web Alıcısı 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 arka uç hizmetlerini 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ı; MediaStatus.supportedMediaCommands iOS ve Android gönderen genişletilmiş kumandaları, alıcı ve uzaktan kumanda uygulamaları, dokunmatik cihazlarda ve Android TV cihazlarındaki alıcı uygulamaları tarafından yönetilir. Özellikte belirli bir bit tabanlı Command etkinleştirildiğinde söz konusu 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 aşağıdaki yöntemlerle değiştirilebilir:

  1. Belirli bir Commands ayarlamak için PlayerManager.setSupportedMediaCommands kullanma
  2. addSupportedMediaCommands kullanarak yeni bir komut ekleme
  3. removeSupportedMediaCommands kullanarak mevcut bir komutu kaldırma.
playerManager.setSupportedMediaCommands(cast.framework.messages.Command.SEEK |
  cast.framework.messages.Command.PAUSE);

Alıcı, güncellenen MediaStatus bilgilerini hazırladıktan sonra supportedMediaCommands özelliğindeki değişiklikleri de içerecektir. 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, 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ğıdakiler yapılmalıdır:

  • USER_ACTION mesaja müdahale edin ve istenen işlemi belirleyin.
  • Kullanıcı arayüzünü güncellemek için MediaInformation UserActionState sürümünü güncelleyin.

Aşağıdaki snippet, USER_ACTION mesajına müdahale ederek arka uçta istenen değişikliği yapma işlemini yürütür. Ardından alıcıdaki UserActionState adlı cihazı 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 aramayı 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 etiketini alır ve UserActionState öğesine MediaInformation ekler. 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, 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ı aracılığıyla anons edilir.

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ısı SDK'sında desteklenmektedir. Bu komutların varsayılan uygulamaları cast.framework.PlayerManager konumunda bulunur.

Komut Açıklama
Çal Duraklatılmış durumdaki oynatmayı oynatın veya devam ettirin.
Duraklat Oynatılmakta olan içeriği duraklat.
Önceki Medya sıranızdaki önceki medya öğesine atlayın.
Sonraki Medya sıranızdaki sonraki medya öğesine atlayın.
Durdur Şu anda oynatılan medyayı durdurun.
Hiçbirini Tekrarlama Sıradaki son öğenin oynatılması tamamlandıktan sonra medya öğelerinin tekrarlanmasını devre dışı bırakın.
Tekrarlama Şu anda oynatılan medyayı süresiz olarak tekrar et.
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 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ştirme / Devre dışı bırakma dil bazında da kullanılabilir.
Kesin zamanla mutlak zaman Belirtilen mutlak zamana atlar.
Şu zamana: göreli zaman karşılaştırması Geçerli döneme göre belirtilen zaman aralığında ileri veya geri atlar.
Tekrar Oynayın Şu anda oynatılan medyayı yeniden başlatın veya hiçbir şey oynatılmıyorsa en son oynatılan medya öğesini oynatın.
Oynatma oranını ayarlama Çeşitli medya oynatma hızları Bu, varsayılan olarak işlenmelidir. Gelen ücret isteklerini geçersiz kılmak için SET_PLAYBACK_RATE mesaj alıcısını kullanabilirsiniz.

Sesli desteklenen medya komutları

Asistan özellikli bir cihazda sesli komutu tetiklemek için öncelikle 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 gönderenlerindeki 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 cihazlardan PAUSE özelliğine izin verirseniz alıcınızı bu ayarları yansıtacak şekilde yapılandırmanız da gerekir. Yapılandırılan gelen sesli komutlar, desteklenen komutlar listesinde yoksa kaldırılır.

Aşağıdaki örnekte, CastReceiverContext başlatılırken CastReceiverOptions öğesini sağlarız. PAUSE komutu için destek ekledik ve oynatıcıyı yalnızca bu komutu destekleyecek şekilde zorunlu kıldık. Sesli komut, SEEK gibi başka bir işlem isterse artık 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 ve kısıtlamak istediğiniz her bir komut için gelen mesaja müdahale edebilirsiniz. Burada, SDK'nın sağladığı isteğe müdahale ederiz. Böylece Asistan özellikli cihazlara yayınlanan SEEK komutları, Web Alıcısı uygulamanızda arama 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;
  });

Konuşma etkinliğinden arka plan

Yayın platformu, kullanıcı konuşmalarını dinleme veya konuşma gibi Asistan etkinlikleri nedeniyle uygulamanızın sesini arka planda tutuyorsa 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 FOCUS_STATE mesaj türüne müdahale ederek medyayı duraklatmak isteyebilirsiniz.

Örneğin, Asistan bir kullanıcı sorgusuna yanıt veriyorsa sesli kitap oynatmayı 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ı 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, isSuggestedLanguage, "Ok Google, altyazıları aç" komutu için true komutuna ayarlı. Dil, komutun konuşulduğu dile göre tahmin ediliyor. Dil açıkça istenirse (ör. "Ok Google, İngilizce altyazıları aç") isSuggestedLanguage, false olarak ayarlanır.

Meta veriler 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. Böylece sesli komutlar Asistan tarafından doğru şekilde işlenebilir ve meta veriler Google Home uygulaması ve Google Home Hub gibi akıllı ekranlar gibi yeni arayüzlerde doğru şekilde gösterilir.

Akış aktarma

Oturum durumunu korumak, kullanıcıların sesli komutlar, Google Home uygulaması veya akıllı ekranları kullanarak mevcut ses ve video akışlarını cihazlar arasında taşıyabileceği akış aktarımının temelini oluşturur. Medya, bir cihazda (kaynak) oynamaya devam eder ve başka bir cihazda (hedef) devam eder. En son donanım yazılımına sahip tüm Cast cihazları, akış aktarımında kaynak veya hedef işlevi görebilir.

Akış aktarımı için etkinlik akışı şöyledir:

  1. Kaynak cihazda:
    1. Medya oynatmayı durdurur.
    2. Web Alıcısı uygulaması, mevcut medya durumunu kaydetmek için bir komut alır.
    3. Web Alıcısı uygulaması kapatıldı.
  2. Hedef cihazda:
    1. Web Alıcısı uygulaması yüklenir.
    2. Web Alıcısı uygulaması, kayıtlı medya durumunu geri yükleme komutu alır.
    3. Medya oynatılmaya devam ediyor.

Medya durumu öğeleri şunları içerir:

  • Şarkının, videonun veya medya öğesinin belirli bir konumu ya da zaman damgası.
  • Daha geniş bir sırada (ör. şarkı listesi veya sanatçı radyosu) olması.
  • 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:

  1. supportedMediaCommands alanını STREAM_TRANSFER komutuyla güncelleyin:
    playerManager.addSupportedMediaCommands(
    cast.framework.messages.Command.STREAM_TRANSFER, true);
  2. İsteğe bağlı olarak Oturum durumunu koruma bölümünde açıklandığı gibi SESSION_STATE ve RESUME_SESSION mesaj işleyicilerini geçersiz kılabilirsiniz. Bunları, yalnızca özel verilerin oturum anlık görüntüsü kapsamında 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ısı 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ısı uygulamalarının oturum durumlarını koruması için varsayılan bir uygulama sunar.

Gerekirse Web Alıcısı tarafından oluşturulan yükleme isteği, SESSION_STATE mesaj kesicisinde geçersiz kılınabilir. Yükleme isteğine özel veriler eklemek istiyorsanız bunları loadRequestData.customData dosyasına eklemenizi ö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 üzerinden 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ğerinde yapılır (sağlanmazsa varsayılan olarak 20 saniyeye ayarlanır). Süre, şu anda oynatılan öğenin sonuyla 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, geçerliÖğe'de kalan süreden yüksekse ön yükleme en kısa sürede gerçekleşir. Sıra Öğesinde çok büyük bir önceden yükleme değeri belirtilirse, mevcut öğeyi oynattığımızda sonraki öğeyi zaten yüklüyoruz. Ancak bu değer, geçerli oynatılacak öğenin bant genişliğini ve akış performansını etkileyebileceği için bu 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.

Yayın cihazları yalnızca bir medya öğesini desteklediği ve MP3 gibi normal MP4 video ve ses dosyaları önceden yüklenmez ve mevcut bir içerik öğesi oynatılmaya devam ederken önceden yüklemek için kullanılamaz.

Özel mesajlar

Mesaj alışverişi, Web Alıcı uygulamaları için temel etkileşim yöntemidir.

Gönderen, gönderen platformun (Android, iOS, Web) gönderen API'lerini kullanarak bir Web Alıcısı'na mesaj yayınlar. Etkinlik işleyicilere aktarılan etkinlik nesnesi (bir mesajın gösterimidir), verilerin belirli bir etkinlik türünün özelliklerini üstlendiği bir veri öğesine (event.data) sahiptir.

Bir Web Alıcısı uygulaması, belirtilen bir ad alanındaki mesajları dinlemeyi seçebilir. Bu şekilde, Web Alıcısı uygulamasının söz konusu ad alanı protokolünü desteklediği söylenir. Ardından, ilgili protokolü kullanmak için bu ad alanı üzerinden iletişim kurmak isteyen tüm bağlı gönderenler sorumludur.

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ısı uygulamaları, bağlı gönderenlere iletiler göndererek Web Alıcısı'nın durumu hakkında gönderenlere bilgi verebilir. Bir Web Alıcı uygulaması, CastReceiverContext cihazında sendCustomMessage(namespace, senderId, message) kullanarak mesaj gönderebilir. Bir Web Alıcısı, alınan bir mesaja yanıt olarak veya uygulama durumu değişikliği nedeniyle tek bir gönderene mesaj gönderebilir. Noktalı mesajlaşmanın (64 KB ile sınırlı) ötesinde, bir Web Alıcısı tüm bağlı gönderenlere de mesaj yayınlayabilir.

Ses cihazları için yayınla

Yalnızca ses oynatma ile ilgili 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 nasıl oynattığı ve Android TV uyumluluğu ile ilgili bilgiler verilmektedir.

Uygulamanızı uzaktan kumandayla entegre etme

Android TV cihazında çalışan Google Web Alıcısı, Medya Oynatma Mesajları konusunda açıklandığı gibi cihazın kontrol girişlerindeki (yani elde tutulan uzaktan kumanda) girişi 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 medyası oynatma özelliğini kontrol etmek üzere bu mesajları desteklemelidir.

Android TV uyumluluğu kuralları

Uygulamanızın Android TV ile uyumlu olmasını sağlamak için göz önünde bulundurmanız gereken bazı öneriler ve sık karşılaşılan hatalar şunlardır:

  • User-agent dizesinin hem "Android" hem de "CrKey" içerdiğini unutmayın; bazı siteler, "Android" etiketini tespit ettikleri için yalnızca mobil cihazlara yönelik bir siteye yönlendirme yapabilir. Kullanıcı aracısı dizesinde "Android"in her zaman bir mobil kullanıcı gösterdiğini belirtmeyin.
  • Android'in medya yığını, verileri getirmek için şeffaf GZIP kullanabilir. Medya verilerinizin Accept-Encoding: gzip özelliğine 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 ve waiting gibi <audio>/<video> öğeleri tarafından tetiklenen medya ile ilgili etkinlikleri kullanın. progress, suspend ve stalled gibi ağ iletişimi ile ilgili etkinlikleri platforma bağımlı oldukları için kullanmaktan 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üklenemeyebilir.
  • Chromecast alıcı sayfayı 720p grafik düzleminde görüntülerken Android TV dahil diğer Yayın platformlarında sayfayı 1080p'ye kadar görüntüleyebilir. Alıcı sayfanızın farklı çözünürlüklerde zarif bir şekilde ölçeklendiğinden emin olun.