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

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

  1. Web Alıcısı ile 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ü öğelerinin stilini belirlemek için cast-media-player öğesi için CSS benzeri özel stil.
  3. Web Alıcı çerçevesini yüklemek için bir komut dosyası öğesi.
  4. Mesajlara müdahale etmek ve etkinlikleri işlemek için JavaScript kodu.
  5. Otomatik oynatma için sıra.
  6. Oynatmayı yapılandırma seçenekleri.
  7. Web Alıcı bağlamını ayarlama seçenekleri.
  8. Web Alıcı uygulaması tarafından desteklenen 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

Uygulamayı yapılandırma

CastReceiverContext, geliştiricinin karşılaştığı en dıştaki sınıftır. Temel kitaplıkların yüklenmesini ve Web Receiver SDK'nın başlatılmasını yönetir. SDK, uygulama geliştiricilerinin SDK'yı CastReceiverOptions üzerinden yapılandırmasına olanak tanıyan API'ler sunar. Bu yapılandırmalar, uygulama lansmanı başına bir kez değerlendirilir ve start çağrısında isteğe bağlı parametre ayarlanırken SDK'ya iletilir.

Aşağıdaki örnekte, bir gönderen bağlantısının hâlâ etkin bir şekilde bağlı olup olmadığını belirlemek için varsayılan davranışın nasıl geçersiz kılınacağı gösterilmektedir. Web Alıcısı, gönderenle maxInactivity saniye boyunca iletişim kuramazsa bir SENDER_DISCONNECTED etkinliği gönderilir. Aşağıdaki yapılandırma bu zaman aşımını geçersiz kılar. Bu, IDLE durumunda hiçbir bağlı gönderen olmadığında Web Alıcı uygulamasının Chrome Uzaktan Hata Ayıklayıcı oturumunu kapatmasını engellediğinden sorunlar ayıklarken yararlı olabilir.

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

Oynatıcıyı yapılandırma

Web Receiver SDK, içerik yüklerken DRM bilgileri, yeniden deneme yapılandırmaları ve cast.framework.PlaybackConfig kullanarak istek işleyicileri gibi oynatma değişkenlerini yapılandırmak için bir yöntem sunar. Bu bilgiler PlayerManager tarafından işlenir ve oynatıcılar oluşturulurken değerlendirilir. Web Receiver SDK'ya yeni bir yükleme aktarıldığında oynatıcılar oluşturulur. Oynatıcı oluşturulduktan sonra PlaybackConfig üzerinde yapılacak değişiklikler sonraki içerik yüklemesinde değerlendirilir. SDK, PlaybackConfig öğesini değiştirmek için aşağıdaki yöntemleri sağlar.

  • CastReceiverContext başlatılırken varsayılan yapılandırma seçeneklerini geçersiz kılmak için CastReceiverOptions.playbackConfig.
  • Mevcut yapılandırmayı almak için PlayerManager.getPlaybackConfig().
  • Mevcut yapılandırmayı geçersiz kılmak için PlayerManager.setPlaybackConfig(). Bu ayar, sonraki tüm yüklemeler için veya tekrar geçersiz kılınana kadar uygulanır.
  • Yalnızca mevcut yapılandırmaların üzerine yüklenmekte olan medya öğesine ek yapılandırmalar uygulamak için PlayerManager.setMediaPlaybackInfoHandler(). İşleyici, oyuncu oluşturulmadan hemen önce çağrılır. Burada yapılan değişiklikler kalıcı değildir ve getPlaybackConfig() ile ilgili sorgulara dahil edilmez. Sonraki medya öğesi yüklendiğinde, bu işleyici tekrar çağrılır.

Aşağıdaki örnekte, CastReceiverContext başlatılırken PlaybackConfig öğesinin nasıl ayarlanacağı gösterilmektedir. Yapılandırma, manifest almak için giden istekleri geçersiz kılar. İşleyici, CORS Access-Control isteklerinin çerezler veya yetkilendirme başlıkları gibi kimlik bilgileri kullanılarak yapılması gerektiğini belirtir.

const playbackConfig = new cast.framework.PlaybackConfig();
playbackConfig.manifestRequestHandler = requestInfo => {
  requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});

Aşağıdaki örnekte, PlayerManager içinde sağlanan alıcı ve belirleyici kullanılarak PlaybackConfig öğesinin nasıl geçersiz kılınacağı gösterilmektedir. Bu ayar, oynatıcıyı 1 segment yüklendikten sonra içerik oynatmayı devam ettirecek şekilde yapılandırır.

const playerManager =
    cast.framework.CastReceiverContext.getInstance().getPlayerManager();
const playbackConfig = (Object.assign(
            new cast.framework.PlaybackConfig(), playerManager.getPlaybackConfig()));
playbackConfig.autoResumeNumberOfSegments = 1;
playerManager.setPlaybackConfig(playbackConfig);

Aşağıdaki örnekte, medya oynatma bilgi işleyicisi kullanılarak belirli bir yükleme isteği için PlaybackConfig öğesinin nasıl geçersiz kılınacağı gösterilmektedir. İşleyici, geçerli öğenin contentId öğesinden licenseUrl değerini almak için uygulamanın uygulanan 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 Buyer SDK'sı, Web Alıcı uygulamanızın oynatıcı etkinliklerini işlemesini sağlar. Etkinlik işleyici, işleyiciyi tetiklemesi gereken etkinlikleri belirten bir cast.framework.events.EventType parametresini (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 dizilerini cast.framework.events.category konumunda bulabilirsiniz. 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 işlemek için aşağıdaki mantığı kullanabilirsiniz:

const playerManager =
    cast.framework.CastReceiverContext.getInstance().getPlayerManager();
playerManager.addEventListener(
    cast.framework.events.EventType.MEDIA_STATUS, (event) => {
      // Write your own event handling code, for example
      // using the event.mediaStatus value
});

Mesaj müdahalesi

Web Buyer SDK'sı, Web Alıcı uygulamanızın mesajlara müdahale etmesine ve bu mesajlar üzerinde özel kod çalıştırmasına olanak tanır. Mesaj müdahalesi, hangi mesaj türüne müdahale edilmesi gerektiğini belirten bir cast.framework.messages.MessageType parametresi alır.

Müdahale, değiştirilen isteği veya değiştirilen istek değeriyle çözümlenen bir Vaat döndürür. null değerinin döndürülmesi, varsayılan mesaj 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 bu verilere müdahale etmek ve bunları 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 müdahalesinde hata 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 müdahalesi ve etkinlik işleyici karşılaştırması

Mesaj müdahalesi ile etkinlik işleyici arasındaki temel farklar şunlardır:

  • Etkinlik işleyici, istek verilerini değiştirmenize izin vermez.
  • Etkinlik işleyici, analizleri 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, mesaja müdahale etmenize ve istek verilerini değiştirmenize olanak tanır.
  • Mesaj müdahalesi, istek verileri ile ilgili özel mantığı işlemek için en iyi seçenektir.

Medya yükleniyor

MediaInformation, cast.framework.messages.MessageType.LOAD mesajında medya yüklemek için entity, contentUrl ve contentId gibi çok sayıda özellik 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ırıp diğer iki alandan en az birini doldurmalıdır.
  • contentUrl, oynatıcının içeriği yüklemek için kullanacağı oynatılabilir URL'ye karşılık gelir. Örneğin, bu URL bir DASH manifestine işaret edebilir.
  • contentId, bir oynatılabilir içerik URL'si (contentUrl özelliğinin URL'sine benzer) veya yüklenen içeriğin ya da oynatma listesinin benzersiz tanımlayıcısı olabilir. Bu özelliği tanımlayıcı olarak kullanıyorsanız uygulamanız, contentUrl içinde oynatılabilir bir URL'yi doldurmalıdır.

Öneri, gerçek kimliği veya temel parametreleri depolamak için entity, medyanın URL'si için de contentUrl kullanmaktır. Aşağıdaki snippet'te, LOAD isteğinde entity öğesinin bulunduğu ve oynatılabilir contentUrl öğesinin alındığı aşağıdaki snippet'te bunun bir örneği 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ı yayın cihazı ve ona bağlı video veya ses cihazında cihaz bilgilerini sağlar. getDeviceCapabilities yöntemi; Google Asistan, Bluetooth, bağlı ekran ve ses cihazları için destek bilgileri sağlar.

Bu yöntem, belirtilen enum'lardan birini ileterek söz konusu sıralama için cihaz kapasitesini almak suretiyle sorgulayabileceğiniz bir nesne döndürür. Sıralamalar cast.framework.system.DeviceCapabilities içinde tanımlanmıştır.

Bu örnekte, Web Alıcı cihazının IS_HDR_SUPPORTED ve IS_DV_SUPPORTED tuşlarıyla sırasıyla HDR veDolbyVision (DV) dosyalarını 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 yönetme

Kullanıcılar, gönderen uygulamaları (Web, Android ve iOS), Asistan özellikli cihazlardaki sesli komutlar, akıllı ekranlardaki dokunma kontrolleri ve Android TV cihazlarındaki uzaktan kumandalar aracılığıyla Web Alıcı uygulamanızla etkileşimde bulunabilir. Cast SDK, Web Alıcı uygulamasının bu etkileşimleri işlemesini, uygulama arayüzünü kullanıcı işlemi durumları aracılığıyla güncellemesine ve isteğe bağlı olarak arka uç hizmetlerini güncellemek için değişiklikleri göndermesine olanak tanıyan çeşitli API'ler sağlar.

Desteklenen medya komutları

Kullanıcı arayüzü kontrollerinin durumu, iOS ve Android'deki gönderen genişletilmiş kumandaları, dokunmatik cihazlarda çalışan alıcı ve uzaktan kumanda uygulamaları ve Android TV cihazlarındaki alıcı uygulamaları için MediaStatus.supportedMediaCommands tarafından belirlenir. Mülkte belirli bir bit tabanlı Command etkinleştirildiğinde bu işlemle ilgili düğmeler etkinleştirilir. Değer ayarlanmazsa düğme devre dışı bırakılır. Bu değerler Web Alıcısı'nda şu şekilde değiştirilebilir:

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

Alıcı, güncellenen MediaStatus öğesini hazırladığında supportedMediaCommands özelliğindeki değişiklikler de dahil edilir. Durum yayınlandığında, bağlı gönderen uygulamaları kullanıcı arayüzündeki düğmeleri buna göre günceller.

Desteklenen medya komutları ve dokunmatik cihazlar hakkında daha fazla bilgi için Accessing UI controls kılavuza bakın.

Kullanıcı işlemi durumlarını yönetme

Kullanıcılar kullanıcı arayüzüyle etkileşim kurduğunda veya sesli komutlar gönderdiğinde içeriğin oynatılmasını ve oynatılan öğeyle ilgili özellikleri kontrol edebilirler. Oynatmayı kontrol eden istekler, SDK tarafından otomatik olarak işlenir. Oynatılan geçerli öğenin özelliklerini değiştiren (LIKE komutu gibi) istekler için alıcı uygulamanın bunları işlemesi gerekir. SDK, bu tür istekleri ele almak için bir dizi API sağlar. Bu isteklerin desteklenmesi için aşağıdakiler yapılmalıdır:

  • Bir medya öğesi yüklerken MediaInformation userActionStates özelliğini kullanıcının tercihleri ile ayarlayın.
  • USER_ACTION mesajlarına müdahale edin ve istenen işlemi belirleyin.
  • Kullanıcı arayüzünü güncellemek için MediaInformation UserActionState bileşenini güncelleyin.

Aşağıdaki snippet, LOAD isteğini engeller ve LoadRequestData öğesinin MediaInformation öğesini doldurur. Bu durumda, kullanıcı yüklenmekte olan 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ı keser ve istenen değişiklikle arka ucun çağrılması işlemini gerçekleştirir. Daha sonra, alıcıdaki UserActionState öğesinin güncellenmesi için 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 ağ çağrısı yapar.

function sendUserAction(userActionRequestData, mediaInfo) {
  return new Promise((resolve, reject) => {
    switch (userActionRequestData.userAction) {
      // Handle user action changes supported by the backend.
      case cast.framework.messages.UserAction.LIKE:
      case cast.framework.messages.UserAction.DISLIKE:
      case cast.framework.messages.UserAction.FOLLOW:
      case cast.framework.messages.UserAction.UNFOLLOW:
      case cast.framework.messages.UserAction.FLAG:
      case cast.framework.messages.UserAction.SKIP_AD:
        let backendResponse = {userActionRequestData: userActionRequestData, mediaInfo: mediaInfo};
        setTimeout(() => {resolve(backendResponse)}, 1000);
        break;
      // Reject all other user action changes.
      default:
        reject(
          new cast.framework.messages.ErrorData(cast.framework.messages.ErrorType.INVALID_REQUEST));
    }
  });
}

Aşağıdaki snippet UserActionRequestData öğesini alır ve UserActionState öğesini MediaInformation içinden ekler veya kaldırır. MediaInformation öğesinin UserActionState değerinin 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üne, uzaktan kumanda uygulamasına ve Android TV kullanıcı arayüzüne yansır. Ayrıca giden MediaStatus mesajları aracılığıyla, iOS ve Android gönderenler için genişletilmiş denetleyicinin kullanıcı arayüzünü güncellemek amacıyla yayınlanır.

function updateUserActionStates(backendResponse) {
  // Unwrap the backend response.
  let mediaInfo = backendResponse.mediaInfo;
  let userActionRequestData = backendResponse.userActionRequestData;

  // If the current item playing has changed, don't update the UserActionState for the current item.
  if (playerManager.getMediaInformation().entity !== mediaInfo.entity) {
    return;
  }

  // Check for existing userActionStates in the MediaInformation.
  // If none, initialize a new array to populate states with.
  let userActionStates = mediaInfo.userActionStates || [];

  // Locate the index of the UserActionState that will be updated in the userActionStates array.
  let index = userActionStates.findIndex((currUserActionState) => {
    return currUserActionState.userAction == userActionRequestData.userAction;
  });

  if (userActionRequestData.clear) {
    // Remove the user action state from the array if cleared.
    if (index >= 0) {
      userActionStates.splice(index, 1);
    }
    else {
      console.warn("Could not find UserActionState to remove in MediaInformation");
    }
  } else {
    // Add the UserActionState to the array if enabled.
    userActionStates.push(
      new cast.framework.messages.UserActionState(userActionRequestData.userAction));
  }

  // Update the UserActionState array and set the new MediaInformation
  mediaInfo.userActionStates = userActionStates;
  playerManager.setMediaInformation(mediaInfo, true);
  return;
}

Sesli komutlar

Aşağıdaki medya komutları, şu anda Asistan özellikli cihazlar için Web Receiver SDK'sında desteklenmektedir. Bu komutların varsayılan uygulamaları cast.framework.PlayerManager konumunda bulunmaktadır.

Komut Açıklama
Play Oynatın veya duraklatılmış durumdan oynatmaya devam edin.
Duraklat Oynatılan içeriği duraklatın.
Önceki Medya sıranızdaki önceki medya öğesine atlayın.
Sonraki Medya sıranızdaki sonraki medya öğesine atlayın.
Durdur Oynatılan medyayı durdurun.
Tekrarlama Yok Sıradaki son öğenin oynatılması tamamlandığında, sıradaki medya öğelerinin tekrarlanmasını devre dışı bırakın.
Single'ı tekrarla Oynatılan medyayı süresiz olarak tekrarla.
Tümünü Tekrarla Sıradaki son öğe oynatıldığında, sıradaki tüm öğeleri yineler.
Tümünü Tekrarla ve Karıştır Sıradaki son öğenin oynatılması tamamlandığında, sırayı karıştırın ve sıradaki tüm öğeleri tekrarlayın.
Karıştır Medya sıranızdaki medya öğelerini karıştırın.
Altyazıları AÇMA / KAPATMA Medyanız için Altyazıyı etkinleştirin / devre dışı bırakın. Etkinleştirme / Devre dışı bırakma özelliği dillere göre de kullanılabilir.
Mutlak zamana ara Belirtilen mutlak zamana atlar.
Geçerli zamana göre zamana git Geçerli oynatma süresine göre belirtilen dönemde ileri veya geri atlar.
Tekrar Oyna Oynatılan medyayı yeniden başlatın veya şu anda hiçbir şey oynatılmıyorsa son oynatılan medya öğesini oynatın.
Oynatma hızını ayarlama Farklı medya oynatma hızları. Bu, varsayılan olarak işlenmelidir. Gelen hız isteklerini geçersiz kılmak için SET_PLAYBACK_RATE mesaj önleyicisini kullanabilirsiniz.

Sesli olarak desteklenen medya komutları

Bir sesli komutun Asistan özellikli cihazlarda medya komutunu tetiklemesini önlemek için öncelikle desteklemeyi planladığınız desteklenen medya komutlarını ayarlamanız gerekir. Ardından CastReceiverOptions.enforceSupportedCommands özelliğini etkinleştirerek bu komutları zorunlu kılmanız gerekir. Cast SDK'sı göndericilerinin ve dokunma özellikli cihazların kullanıcı arayüzü, bu yapılandırmaları yansıtacak şekilde değişecektir. Bayrak etkinleştirilmezse gelen sesli komutlar yürütülür.

Örneğin, gönderen uygulamalarınızda ve dokunma özellikli cihazlarınızda PAUSE öğesine izin verirseniz alıcınızı bu ayarları yansıtacak şekilde de yapılandırmanız gerekir. Bu yapılandırma tamamlandığında, desteklenen komutlar listesine dahil edilmezse gelen sesli komutlar atlanı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 istediğinde bu istek reddedilecektir. Kullanıcıya, komutun henüz desteklenmediği bildirilir.

const context = cast.framework.CastReceiverContext.getInstance();

context.start({
  enforceSupportedCommands: true,
  supportedCommands: cast.framework.messages.Command.PAUSE
});

Kısıtlamak istediğiniz her komut için ayrı mantık uygulayabilirsiniz. enforceSupportedCommands işaretini kaldırın. Kısıtlamak istediğiniz her komut için gelen mesaja müdahale edebilirsiniz. Burada, Asistan özellikli cihazlara gönderilen SEEK komutlarının Web Alıcısı uygulamanızda bir aramayı tetiklememesi için SDK tarafından sağlanan isteği engelleriz.

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 alma

Cast platformu, kullanıcının konuşmasını dinleme veya yanıt verme gibi Asistan etkinliği nedeniyle uygulamanızın sesini arka plana alırsa etkinlik başladığında Web Alıcı uygulamasına NOT_IN_FOCUS FocusState mesajı gönderilir. Etkinlik sona erdiğinde IN_FOCUS ile birlikte başka bir mesaj gönderilir. Uygulamanıza ve oynatılan medyaya bağlı olarak, FOCUS_STATE mesaj türüne müdahale ederek FocusState NOT_IN_FOCUS olduğunda medyayı duraklatmak isteyebilirsiniz.

Ö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;
  });

Ses tarafından belirlenen altyazı dili

Kullanıcı altyazıların dilini açıkça belirtmediğinde altyazılar için kullanılan dil, komutun konuşulduğu dille aynı olur. Bu senaryolarda, gelen mesajın isSuggestedLanguage parametresi, ilişkilendirilen dilin önerilip önerilmediğini veya kullanıcı tarafından açık bir şekilde istenip istenmediğini gösterir.

Örneğin, isSuggestedLanguage dili, komutun konuşulduğu dil tarafından tahmin edildiğinden "Ok Google, altyazıları aç" komutu için true olarak ayarlanmıştır. Dil açıkça istenirse (ör. "Ok Google, İngilizce altyazıları aç) isSuggestedLanguage değeri false olarak ayarlanır.

Meta veri ve ses yayınlama

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 olmalısınız. Bu, sesli komutların Asistan tarafından düzgün bir şekilde işlenmesini ve meta verilerin Google Home uygulaması gibi yeni arayüz türlerinde ve Google Home Hub gibi akıllı ekranlarda düzgün şekilde gösterilmesini sağlar.

Akış aktarma

Akış aktarımının temeli oturum durumunu korumaktır. Kullanıcılar burada sesli komutları, Google Home uygulamasını veya akıllı ekranları kullanarak mevcut ses ve video akışlarını cihazlar arasında taşıyabilir. Medya, bir cihazda (kaynak) durdurulur ve başka bir cihazda (hedef) devam eder. En yeni donanım yazılımına sahip yayın cihazları, akış aktarımında kaynak veya hedef olarak kullanılabilir.

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

  1. Kaynak cihazda:
    1. Medyanın oynatılması durduruluyor.
    2. Web Alıcı uygulaması, mevcut medya durumunu kaydetmek için bir komut alır.
    3. Web Alıcı uygulaması kapatıldı.
  2. Hedef cihazda:
    1. Web Alıcı uygulaması yüklendi.
    2. Web Alıcı uygulaması, kaydedilen medya durumunu geri yüklemek için bir komut alır.
    3. Medya oynatılmaya devam eder.

Medya durumu öğeleri şunlardır:

  • Şarkının, videonun veya medya öğesinin belirli konumu ya da zaman damgası.
  • Video daha geniş bir sıraya eklenir (ör. oynatma listesi veya sanatçı radyosu).
  • Kimliği doğrulanan kullanıcı.
  • Oynatma durumu (örneğin, oynatma veya duraklatıldı).

Akış aktarımı etkinleştiriliyor

Web Alıcınız için akış aktarımını uygulamak üzere:

  1. STREAM_TRANSFER komutuyla supportedMediaCommands uygulamasını 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 önleyicilerini geçersiz kılın. Yalnızca özel verilerin oturum anlık görüntüsünün bir parçası olarak depolanması gerekiyorsa bunları geçersiz kılın. Aksi takdirde, oturum durumlarını korumak için varsayılan uygulama, akış aktarımını destekler.

Oturum durumu korunuyor

Web Alıcı SDK'sı, mevcut medya durumunun anlık görüntüsünü alarak, durumu bir yükleme isteğine dönüştürerek ve yükleme isteğiyle oturumu devam ettirerek Web Alıcı uygulamalarında oturum durumlarını korumak için varsayılan bir uygulama sağlar.

Web Alıcısı tarafından oluşturulan yükleme isteği, gerekirse SESSION_STATE mesaj önleyicide geçersiz kılınabilir. Yükleme isteğine özel veriler eklemek istiyorsanız bunları loadRequestData.customData içine koymanızı öneririz.

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.SESSION_STATE,
    function (sessionState) {
        // Override sessionState.loadRequestData if needed.
        const newCredentials = updateCredentials_(sessionState.loadRequestData.credentials);
        sessionState.loadRequestData.credentials = newCredentials;

        // Add custom data if needed.
        sessionState.loadRequestData.customData = {
            'membership': 'PREMIUM'
        };

        return sessionState;
    });

Özel veriler, RESUME_SESSION mesaj önleyicideki 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ısı, sırada mevcut oynatma öğesi bittikten sonra medya öğelerinin önceden yüklenmesini destekler.

Önceden yükleme işlemi, sonraki öğelerin birkaç segmentini önceden indirir. Spesifikasyon, QueueItem nesnesindeki preloadTime değerinde gerçekleştirilir (sağlanmazsa varsayılan olarak 20 saniyedir). Süre, şu anda oynatılan öğenin sonuna göre saniye cinsinden ifade edilir . Yalnızca pozitif değerler geçerlidir. Örneğin, değer 10 saniyeyse bu öğe önceki öğe tamamlanmadan 10 saniye önce önceden yüklenir. Önceden yükleme süresi, currentItem öğesinde kalan zamandan uzunsa önceden yükleme işlemi mümkün olan en kısa sürede gerçekleşir. Kuyruk öğesinde çok büyük bir önceden yükleme değeri belirtilirse, geçerli öğeyi oynatırken bir sonraki öğeyi önceden yüklüyor olmamız gibi bir etki elde edilebilir. Bununla birlikte, bu değer mevcut oyun öğesinin bant genişliğini ve akış performansını etkileyebileceğinden bu ayarın ayarını ve seçimini geliştiriciye bırakıyoruz.

Önceden yükleme; HLS, DASH ve Smooth akış içeriği için varsayılan olarak çalışır.

Yayın cihazları yalnızca bir medya öğesini desteklediğinden ve mevcut bir içerik öğesi oynatılırken önceden yükleme yapmak için kullanılamadığından, MP3 gibi normal MP4 video ve ses dosyaları önceden yüklenmez.

Özel mesajlar

Mesaj değişimi, Web Alıcısı uygulamaları için temel etkileşim yöntemidir.

Bir gönderen, çalıştırdığı platforma (Android, iOS, Web) yönelik gönderen API'lerini kullanarak Web Alıcısına mesaj gönderir. Etkinlik işleyicilere iletilen etkinlik nesnesi (bir mesajın manifestidir), verilerin belirli etkinlik türünün özelliklerini aldığı bir veri öğesine (event.data) sahiptir.

Bir Web Alıcı uygulaması, belirli bir ad alanındaki mesajları dinlemeyi seçebilir. Bu sayede, Web Alıcı uygulamasının bu ad alanı protokolünü desteklediği söylenir. Daha sonra, uygun protokolü kullanmak için bu ad alanında iletişim kurmak isteyen tüm bağlı gönderenlere bağlıdır.

Tüm ad alanları bir dizeyle tanımlanır ve "urn:x-cast:" ile başlamalı ve ardından herhangi bir dize gelmelidir. Örneğin, "urn:x-cast:com.example.cast.mynamespace".

Web Alıcı'nın bağlı gönderenlerden gelen özel mesajları dinlemesi için kullanabileceğiniz bir kod snippet'ini burada görebilirsiniz:

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 gönderenleri Web Alıcısı'nın durumu hakkında bilgilendirebilir. Web Alıcıları uygulaması, CastReceiverContext üzerindeki sendCustomMessage(namespace, senderId, message)'ı kullanarak mesaj gönderebilir. Web Alıcısı, alınan bir iletiye yanıt olarak veya bir uygulama durumu değişikliği nedeniyle tek bir gönderene mesaj gönderebilir. Web Alıcısı, noktadan noktaya mesajların (64 kb sınırıyla sınırlı) yanı sıra mesajları tüm bağlı gönderenlere de yayınlayabilir.

Ses sistemleri için yayınlama

Yalnızca ses oynatma konusunda destek almak üzere Ses cihazları için Google Cast rehberine bakın.

Android TV

Bu bölümde, Google Web Alıcısı'nın girişlerinizi oynatma olarak nasıl kullandığı ve Android TV uyumluluğu konuları ele alınmaktadır.

Uygulamanızı uzaktan kumandayla entegre etme

Android TV cihazında çalışan Google Web Alıcısı, Medya Oynatma Mesajları bölümünde açıklandığı üzere urn:x-cast:com.google.cast.media ad alanı için tanımlanan medya oynatma mesajları olarak cihazın kontrol girişlerinden (ör. elde tutulan uzaktan kumanda) gelen girişi çevirir. Uygulamanızın, Android TV'nin kontrol girişlerinden temel oynatma kontrolüne izin vermek üzere uygulama medyası oynatmasını kontrol edebilmesi için bu mesajları desteklemesi gerekir.

Android TV uyumluluğu yönergeleri

Uygulamanızın Android TV ile uyumlu olduğundan emin olmak için kaçınmanız gereken bazı önerileri ve yaygın tehlikeleri burada bulabilirsiniz:

  • Kullanıcı aracısı dizesinin hem "Android" hem de "CrKey" ifadesini içerdiğini unutmayın. Bazı siteler "Android" etiketini algıladığı için yalnızca mobil cihazlara yönelik bir siteye yönlendirebilir. Kullanıcı aracısı dizesindeki "Android" ifadesinin her zaman bir mobil kullanıcıyı belirttiğini varsaymayın.
  • Android'in medya yığını, veri getirmek için şeffaf GZIP kullanabilir. Medya verilerinizin Accept-Encoding: gzip komutuna yanıt verebildiğinden emin olun.
  • Android TV HTML5 medya etkinlikleri, Chromecast'ten farklı zamanlamalarda tetiklenebilir. Bu durum, Chromecast'te gizlenmiş olan sorunları ortaya çıkarabilir.
  • Medyayı güncellerken timeupdate, pause ve waiting gibi <audio>/<video> öğeleri tarafından tetiklenen medyayla ilgili etkinlikleri kullanın. progress, suspend ve stalled gibi ağ etkinliklerinden kaçının. Bunlar genellikle platforma bağlıdır. Alıcınızdaki medya etkinliklerini yönetme hakkında daha fazla bilgi için Medya etkinlikleri bölümüne bakın.
  • Alıcı sitenizin HTTPS sertifikalarını yapılandırırken ara CA sertifikalarını eklediğinizden emin olun. Doğrulamak için Qualsys SSL test sayfasına göz atın: Sitenizin güvenilir sertifika yolu "ekstra indirme" etiketli bir CA sertifikası içeriyorsa bu sertifika Android tabanlı platformlarda yüklenmeyebilir.
  • Chromecast, alıcı sayfasını 720p grafik düzleminde görüntülerken, Android TV gibi 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.