Web Alıcı Oynatıcısı Yayın Protokolleri

Web Alıcısı SDK'sı şu anda üç tür akış protokolünü desteklemektedir:

DASH, HTTP Canlı Yayın ve Smooth Streaming.

Bu belgede, tüm akış protokollerine yönelik desteğimizi bulabilirsiniz. Her protokol için desteklenen etiketlerin açıklaması, ayrıntılı protokol spesifikasyonuna göre oldukça kısaltılmış olabilir. Burada amaç, her bir protokolün nasıl kullanılacağına ve akış deneyimlerini sunmak üzere Cast özellikli cihazlarda desteklenen protokol özelliklerine ilişkin kısa bir bakış ve anlayış sağlamaktır.

HTTP üzerinden Dinamik Adaptif Akış (DASH)

ISO’nun DASH ile ilgili ayrıntılı spesifikasyonu

DASH, HTTP(S) sunucuları üzerinden yüksek kaliteli video akışı sağlayan uyarlanabilir bir bit hızı akış protokolüdür. XML'de oluşturulan bir manifest, video içeriğini ilk kullanıma hazırlama ve indirmeyle ilgili meta veri bilgilerinin çoğunu içerir. Web Alıcı Oynatıcısı'nın desteklediği temel kavramlar <Period>, <AdaptationSet>, <Representation>, <SegmentTemplate>, <SegmentList>, <BaseUrl> ve <ContentProtection>'dir.

DASH manifest, kök <MPD> etiketi ile başlar ve içinde bir akış içeriğini temsil eden bir veya daha fazla <Period> etiketi bulunur. <Period> etiketleri, farklı akış içeriği parçalarının sıralanmasına olanak tanır ve genellikle ana içerik ile reklamı veya birbirini izleyen birden fazla video içeriğini ayırmak için kullanılır.

<MPD> altındaki <AdaptationSet>, tek bir medya akışı türünde (çoğu durumda video, ses veya altyazı) temsil temsilidir. En sık desteklenen mime türleri "video/mp4", "audio/mp4" ve "text/vtt"dir. İsteğe bağlı bir <ContentComponent contentType="$TYPE$">, <AdaptationSet> altına eklenebilir.

Her <AdaptationSet> içinde bir <Representation> etiketi listesi bulunur. Web Alıcısı Oynatıcısı, oynatılacak doğru temsili/bit hızını otomatik olarak seçmek için MSE kaynak arabelleğini başlatmak üzere codecs bilgilerini ve bandwidth bilgilerini kullanır.

Her bir <Representation> için medya segmentleri, tek bir segment temsili için <BaseURL>, segment listesi için <SegmentList> (HLS'ye benzer) veya <SegmentTemplate> kullanılarak tanımlanır.

<SegmentTemplate> için, başlangıç segmenti ile medya segmentlerinin şablon aracılığıyla nasıl temsil edilebileceğini belirtir. Aşağıdaki örnekte $Number$, CDN'den alınan segment numarasını gösterir. Yani oynatma devam ederken seg1.m4s, seg2.m4s vb. anlamına gelir.

<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:ns2="http://www.w3.org/1999/xlink"
  profiles="urn:mpeg:dash:profile:isoff-live:2011,http://dashif.org/guidelines/dash264" type="static"
  publishTime="2016-10-05T22:07:14.859Z" mediaPresentationDuration="P1DT0H0M0.000S" minBufferTime="P0DT0H0M7.500S">
  <Period id="P0">
    <AdaptationSet lang="en" segmentAlignment="true">
      <ContentComponent id="1" contentType="audio"/>
      <SegmentTemplate media="seg$Number$.m4s" initialization="seginit.mp4"
        duration="10000" startNumber="1" timescale="1000" presentationTimeOffset="0"/>
      <Representation id="1" bandwidth="150123" audioSamplingRate="44100"
        mimeType="audio/mp4" codecs="mp4a.40.2" startWithSAP="1">
        <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
        <BaseURL>http://www.google.com/testVideo</BaseURL>
      </Representation>
    </AdaptationSet>
    <AdaptationSet segmentAlignment="true">
      <ContentComponent id="1" contentType="video"/>
      <SegmentTemplate media="seg$Number$.m4s" initialization="seginit.mp4"
        duration="10000" startNumber="1" timescale="1000" presentationTimeOffset="0"/>
      <Representation id="1" bandwidth="212191" width="384" height="208" sar="26:27"
        frameRate="25" mimeType="video/mp4" codecs="avc1.42c01f" startWithSAP="1">
        <BaseURL>http://www.google.com/testVideo/bitrate1/</BaseURL>
      </Representation>
      <Representation id="1" bandwidth="366954" width="512" height="288" sar="1:1"
        frameRate="25" mimeType="video/mp4" codecs="avc1.42c01f" startWithSAP="1">
        <BaseURL>http://www.google.com/testVideo/bitrate2/</BaseURL>
      </Representation>
      <Representation id="1" bandwidth="673914" width="640" height="352" sar="44:45"
        frameRate="25" mimeType="video/mp4" codecs="avc1.42c01f" startWithSAP="1">
        <BaseURL>http://www.google.com/testVideo/bitrate3/</BaseURL>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

<SegmentTemplate> için, her segmentin ne kadar sürdüğünü ve hangi segmentlerin tekrarladığını belirtmek üzere <SegmentTimeline> etiketi yaygın bir şekilde kullanılır. timescale (bir saniyeyi temsil eden birimler) genellikle <SegmentTemplate> özelliklerinin bir parçası olarak eklenir. Böylece segmentin zamanını bu birime dayanarak hesaplayabiliriz. Aşağıdaki örnekte <S> etiketi bir segment etiketini, d özelliği ise segmentin ne kadar sürdüğünü belirtir. r özelliği ise aynı sürede kaç segmentin tekrarlandığını belirtir. Böylece $Time$, medya segmentini indirmek için media özelliğinde belirtildiği gibi doğru şekilde hesaplanabilir.

<SegmentTemplate>
  timescale="48000"
  initialization="$RepresentationID$-init.dash"
  media="$RepresentationID$-$Time$.dash"
    startNumber="1">
    <SegmentTimeline>
      <S t="0" d="96256" r="2" />
      <S d="95232" />
      <S d="96256" r="2" />
      <S d="95232" />
      <S d="96256" r="2" />
   </SegmentTimeline>
</SegmentTemplate>

<SegmentList> kullanarak temsil için örnek:

<Representation id="FirstRep" bandwidth="2000000" width="1280"
  height="720">
  <BaseURL>FirstRep/</BaseURL>
  <SegmentList timescale="90000" duration="270000">
     <RepresentationIndex sourceURL="representation-index.sidx"/>
     <SegmentURL media="seg-1.ts"/>
     <SegmentURL media="seg-2.ts"/>
     <SegmentURL media="seg-3.ts"/>
  </SegmentList>
</Representation>

Tek bir segment dosyası için bir <SegmentBase>, genellikle <BaseURL> dosyasının hangi bölümünü dizin içerdiğini belirtmek üzere bayt aralığı istekleriyle kullanılır ve geri kalanı oynatma devam ederken veya bir arama meydana geldiğinde isteğe bağlı olarak getirilebilir. Burada Initialization aralığı, init meta veri aralığını belirtirken indexRange, medya segmentlerinin dizinini belirtir. Şu anda yalnızca ardışık bayt aralıklarını desteklediğimizi unutmayın.

<Representation bandwidth="4190760" codecs="avc1.640028"
  height="1080" id="1" mimeType="video/mp4" width="1920">
  <BaseURL>video.mp4<BaseURL>
  <SegmentBase indexRange="674-1149">
    <Initialization range="0-673" />
  </SegmentBase>
</Representation>

Hangi temsilin kullanıldığına bakılmaksızın akışlar korunduğunda <AdaptationSet> altında bir <ContentProtection> bölümü görünebilir. Bu bölümde schemeIdUri kullanılacak DRM sistemini benzersiz olarak tanımlar. Ortak şifreleme için isteğe bağlı bir anahtar kimliği eklenebilir.

<!-- Common Encryption -->
<ContentProtection
  schemeIdUri="urn:mpeg:dash:mp4protection:2011"
  value="cenc"
  cenc:default_KID="7D2714D0-552D-41F5-AD56-8DD9592FF891">
</ContentProtection>

<!-- Widevine -->
<ContentProtection
  schemeIdUri="urn:uuid:EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED">
</ContentProtection>

Daha fazla örnek ve ayrıntı için lütfen MPEG-DASH spesifikasyonuna bakın. Yukarıda desteklenmeyen etiketlerde şu anda desteklediğimiz ek DASH özelliklerinin listesi aşağıda verilmiştir:

Özellik Adı Özellik İşlevi
medyaSürme Süresi Video içeriğinin uzunluğu.
minimumUpdatePeriod <MPD> etiketinin özelliği; manifesti ne sıklıkta yeniden yüklememiz gerektiğini belirtir.
tür <MPD> etiketinin özelliği; bunun bir canlı akış olduğunu belirtmek için "dinamik".
sunuZaman Aşımı <SegmentBase> etiketinin özelliği; dönemin başlangıcından itibaren sunu zamanı farkını belirtir.
başlangıçNumarası Dönemdeki bir sunudaki ilk medya segmentinin sayısını belirtir. Bu genellikle canlı yayında kullanılır.

Ayrıca, DASH için MP4 parçalarında bulunan EMSG kutusunun tanınmasını destekler ve geliştiricilere EmsgEvent sağlarız.

Mevcut Web Alıcı Oynatıcımız önemli DASH kullanım alanlarını desteklese de mevcut DASH uygulamamızın dikkate almadığı veya kullanmadığı yaygın özelliklerin listesini burada bulabilirsiniz. Diğer bir ifadeyle, manifestlerin bu bilgileri içerip içermediğine bakılmaksızın içeriğin oynatma deneyimi üzerinde herhangi bir etkisi yoktur.

  • stok durumu Başlangıç Zamanı
  • segment hizalaması

HTTP Canlı Yayın (HLS)

HTTP canlı yayınına ilişkin genel bakışı ve tam teknik özelliklerini burada bulabilirsiniz.

Web Alıcısı Oynatıcı'nın güçlü yanlarından biri, HLS'nin MSE'de oynatılmasını destekleyebilmesidir. Bir manifestin tek bir dosyada geldiği DASH'in aksine HLS, tüm varyant akışlarının listesini ilgili URL'siyle birlikte içeren ana oynatma listesini gönderir. Varyant oynatma listesi, medya oynatma listesidir. Web Alıcı Oynatıcısının şu anda ana oynatma listesinde desteklediği iki ana HLS etiketi şunlardır:

Etiket Adı İşlevler
#EXT-X-AKIŞI-INF Bit hızı/varyant akışını belirtir. Uyarlanabilir bit hızı akış seçimini destekleyen BANDWIDTH özelliği gereklidir. MSE'yi başlatmak için CODECS özelliği kesinlikle önerilir ("avc1.42c01e,mp4a.40.2" gibi). Belirtilmemesi durumunda varsayılan ayar H264 ana profil 3.0 video ve "mp4a.40.2" ses kodlamalı içerik olarak ayarlanır.
#EXT-X-MEDIA İçeriği temsil eden ek medya oynatma listesini (URI özelliğinde) belirtir. Bunlar genellikle başka biçimdeki (5.1 surround ses) veya dildeki alternatif ses akışlarıdır. VIDEO, AUDIO, SUBTITLES veya CLOSED-CAPTIONS içeren TYPE özelliğine izin verilir. DEFAULT özelliğinin YES olarak ayarlanması, varsayılan olarak bu alternatif akışı seçtiğinizi gösterir.

Web Alıcı Oynatıcısının şu anda medya oynatma listesinde desteklediği HLS etiketlerinin listesi aşağıda verilmiştir:

Etiket Adı İşlevler
#EXTINF Akış bilgileri, genellikle saniye cinsinden segmentin süresi ve bir sonraki satırda segmentin URL'si.
#EXT-X-TARGETDURATION Her segmentin saniye cinsinden süresidir. Bu, canlı yayın için oynatma listesi manifestini ne sıklıkta indirdiğimizi/yenilediğimizi de belirler. Web Alıcısı Oynatıcısı, 0,1 saniyeden kısa süreleri desteklemez.
#EXT-X-MEDIA-SEQUENCE Bu oynatma listesindeki ilk segmentin temsil ettiği sıra numarası (genellikle canlı yayın için).
#EXT-X-ANAHTAR DRM anahtarı bilgileri. METHOD özelliği, hangi anahtar sisteminin kullanılacağını belirtir. Bugün AES-128 ve SAMPLE-AES özelliklerini destekliyoruz .
#EXT-X-BYTERANGE Bir segment URL'si için getirilecek bayt aralığı.
#EXT-X-DISCONTINUITY Birbirini izleyen segmentler arasında süreksizliği belirtir. Bu durum, genellikle ana reklam akışının ortasında bir reklam segmentinin göründüğü sunucu tarafı reklam eklemede görülür.
#EXT-X-PROGRAM-DATE-TIME Bir sonraki segmentin ilk örneğinin mutlak zamanı. Örneğin, "2016-09-21T23:23:52.066Z".
#EXT-X-ENDLIST Seç-izle video veya canlı yayın.

Canlı yayında, yenilenmiş bir manifesti nasıl birleştireceğinizi belirlemek için #EXT-X-PROGRAM-DATE-TIME ve #EXT-X-MEDIA-SEQUENCE parametrelerini kullanırız. Mevcutsa #EXT-X-PROGRAM-DATE-TIME, yenilenen segmentlerle eşleştirmek için kullanılır. Aksi takdirde #EXT-X-MEDIA-SEQUENCE numarası kullanılır. HLS özelliklerine göre, eşleşme için dosya adı karşılaştırmasını kullanmadığımızı unutmayın.

HLS uygulamamız, ana ses çalma olarak 5.1 surround ses gibi alternatif bir ses akışı seçmeyi destekler. Bu işlem, alternatif codec'lerle bir #EXT-X-MEDIA etiketinin yanı sıra akış yapılandırmasında segment biçimi sağlanarak yapılabilir.

Web Alıcı Oynatıcısı, belirli bir spesifikasyona göre davranılmasını bekler. Örneğin, #EXT-INF etiketinden sonra bir URI bekleriz. Bu bir URI değilse örneğin, #EXT-X-DISCOUNTINUITY oynatma listesi için ayrıştırma başarısız olur.

Her #EXT-X-TARGETDURATION saniyede bir, yeni segment listelerini almak için oynatma listesini/manipülasyonu yeniden yüklüyoruz ve tüm segmentlerin yeni dahili temsilini yeni segment olarak güncelliyoruz. Bir arama isteğinde her zaman, yalnızca aranabilen aralıkta arama yaparız. Canlı reklamlarda yalnızca yeni listenin başlangıcından sona kadar üç hedef süresine kadar arama yapılmasına izin verilir. Örneğin, 10 segment listeniz varsa ve segment 6'daysanız yalnızca 7'ye kadar arama yapabilirsiniz, ancak 8'e kadar çıkamazsınız.

Segment biçimi desteği

CAF SDK'sı, ses için HlsSegmentFormat ve video için HlsVideoSegmentFormat bölümlerinde belirtildiği gibi birden fazla biçimde yayınlanan içerikleri destekler. Buna, hem şifrelenmiş hem de şifrelenmemiş AAC ve AC3 oynatma gibi paketlenmiş ses desteği dahildir. İçeriğinizin oynatıcıya doğru şekilde tanımlanması için bu bilgilerin LoadRequestData öğesinin MediaInformation bölümünde belirtilmesi gerekir. Belirtilmezse varsayılan oynatıcı yapılandırması, içeriği Taşıma Akışı paketlenmiş içeriği olarak oynatmaya çalışır. Bu özellik, yükleme isteği verilerindeki (Android, iOS ve Web) veya herhangi bir alıcıdan, mesaj önleyiciler aracılığıyla alıcıdan ayarlanabilir.

Web Alıcısı'nda içerik hazırlama hakkında daha fazla bilgi için aşağıdaki örnek kod snippet'ine veya contentId, contentUrl ve tüzel kişiyi kullanarak medya yükleme kılavuzuna göz atın.

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, loadRequestData => {
      ...
      // Specify segment format for an HLS stream playing CMAF packaged content.
      loadRequestData.media.contentType = 'application/x-mpegurl';
      loadRequestData.media.hlsSegmentFormat = cast.framework.messages.HlsSegmentFormat.FMP4;
      loadRequestData.media.hlsVideoSegmentFormat = cast.framework.messages.HlsVideoSegmentFormat.FMP4;
      ...
      return loadRequestData;
    });

İçerik koruması

Yukarıdaki #EXT-X-KEY etiketi bölümünde listelendiği gibi, Google Cast SDK'sı bir başlatma vektörünün belirtilebileceği bir SAMPLE-AES veya SAMPLE-AES-CTR'yi destekler:

EXT-X-KEY: METHOD=SAMPLE-AES, \
URI="data:text/plain;base64,XXXXXX", \
IV=0x6df49213a781e338628d0e9c812d328e, \
KEYFORMAT="com.widevine", \
KEYFORMATVERSIONS="1"

Şu anda desteklediğimiz KEYFORMAT Widevine'dir ve URI, kodu çözüldüğünde anahtar kimliğini içeren BASE64 olarak kodlanmış DRM bilgilerini XXXXXXX içerir:

{
   "content_id": "MTQ1NjkzNzM1NDgxNA==",
   "key_ids": [
      "xxxxxxxxxxxxxxxx"
   ]
}

Sürüm 1 aşağıdaki özellikleri tanımlar:

Özellik Örnek Açıklama
KEYFORMATVERSIONS "1" Bu teklif, anahtar biçimi sürüm 1'i tanımlar
KEYFORMAT "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" UUID, DASH IF IOP'a ait Widevine UUID'dir. Aynı dize, MPD'de Widevine şifrelenmiş akışlarıyla kullanılır.
URI "data:text/plain;base64, <base64 encoded PSSH box>" Veri türünü ve PSSH kutusunu içeren yayının URI'si.
METHOD SAMPLE-AES-CTR İçeriği şifrelerken kullanılan şifreleme şifresini belirtir. SAMPLE-AES, içeriğin "cbcs" kullanılarak şifrelendiğini gösterir. SAMPLE-AES-TO, içeriğin AES-TO koruma şemalarından biri ("cenc") kullanılarak şifrelendiğini gösterir.

DASH MPD ile eşlenen özellikler:

Özellik Açıklama
KEYFORMAT ContentProtection öğesinin schemaIdUri özelliği.
URI cenc:pssh öğesinin içeriği.
KEYID MPEG DASH'teki default_kid ile aynı role sahip olan anahtar kimliğini kodlayan 16 baytlık onaltılık dizedir. Hiyerarşik bir anahtar düzeni kullanıyorsanız "kök" anahtar kullanılır.

V2 Sinyalli HLS Oynatma Listesi örneği:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:2
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MAP:URI="init_segment.mp4"
#EXTINF:1.001,
output_video-1.mp4
#EXT-X-DISCONTINUITY
#EXT-X-KEY:METHOD=SAMPLE-AES,URI="data:text/plain;base64,AAAAPXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAB0aDXdpZGV2aW5lX3Rlc3QiDHRlc3QgY29udGVudA==",KEYID=0x112233445566778899001122334455,KEYFORMAT="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed",KEYFORMATVERSION="1"
#EXTINF:1.001,
output_video-2.mp4
#EXTINF:0.734,
output_video-3.mp4
#EXT-X-ENDLIST

Aşağıda, şu anda kullanmadığımız veya desteklemediğimiz HLS özellikleri ve etiketlerinin bir listesini bulabilirsiniz. Bu öğelerin varlığı veya olmaması akış davranışını etkilemez.

  • #EXT-X-STREAM-INF öğesindeki RESOLUTION= özelliği yoksayılır.
  • #EXT-X-MEDIA içindeki AUTOSELECT= özelliği kullanılmıyor. Bunun yerine DEFAULT=
  • Ana oynatma listesindeki #EXT-X-I-FRAME-STREAM-INF yok sayıldı.
  • #EXT-X-DISCONTINUITY-SEQUENCE yoksayıldı
  • #EXT-X-PLAYLIST-TYPE:EVENT bir canlı yayında yer alabilir ve #EXT-X-PLAYLIST-TYPE:VOD, bir VOD akışında yer alabilir ancak şu anda Web Alıcısı Oynatıcımız, VOD ile VOD karşılaştırmasını belirlemek için yalnızca #EXT-X-ENDLIST öğesinin varlığına dayanır.

Sorunsuz akış

Microsoft'un resmi Smooth Streaming teknik özelliği.

Sorunsuz akış, HTTP üzerinden (DASH'e benzer) uyarlanabilir akış protokolü ve XML spesifikasyonu sağlar. DASH'in aksine Smooth Streaming, medya segmentleri için yalnızca MPEG-4 paketleme önerir.

Web Alıcısı Oynatıcısının şu anda desteklediği Smooth Streaming'teki en yaygın etiket ve özelliklerin bir tablosu aşağıda verilmiştir. Yukarıdaki DASH bölümünde birçok kavram açıklanmıştır.

Etiket/Özellik Kullanım
<SmoothStreamingMedia> Manifest'in ana etiketi, şu özellikleri içerir:
  • Zaman Ölçeklendirmesi: Genellikle 10.000.000 birimlik bir artışı temsil eden birim sayısı.
  • Süre: İçeriğin zaman ölçeğindeki uzunluğu. Web Alıcı Oynatıcısı, 0,1 saniyeden kısa süreleri desteklemez.
  • IsLive: Manifest'in canlı medya olup olmadığı.
<AkışDizini> DASH'in AdaptationSet'ine benzer şekilde bir yayın grubu. Tür genellikle "text", "video" veya "audio"dur. URL özelliği genellikle bit hızı veya başlangıç zamanı gibi bilgiler içeren şablonlu bir parça URL'si içerir.
<Kalite Düzeyi> Her QualityLevel etiketi, bit hızını ve bir FourCC codec'ini belirtir. FourCC kodu genellikle "H264", "AVC1", "AACL" şeklindedir. Video için çözünürlükleri MaxWidth ve MaxHeight ile belirtir. Ses için frekansı (ör. 44100) SamplingRate ve Channel sayısını belirtir.
<c> Yayın Parça Öğesi. Şunları içerir:
  • d: Bir parçanın süresi.
  • t: Parçanın Medya Saati.
<Koruma> <SmoothStreamingMedia> etiketinin altında kullanılacak sistem DRM'sinin kimliğini listeleyen isteğe bağlı SystemID özelliğine sahip bir etiket.
<Koruma Başlığı> <Protection> altında, Sistem Kimliği ve özel veriler (genellikle Base64 olarak kodlanır) içerebilir. Widevine için anahtar kimliği, anahtar uzunluğu, AESTO gibi algoritma kimliği, LA_URL (lisans edinme url'si), LUI_URL (lisans kullanıcı arayüzü url'si) ve DS_ID (alan hizmeti kimliği) içerir.

İçerik koruması

Koruma sistemi kimliklerini doğru şekilde kodlamak için lütfen aşağıdaki eşlemeyi kullanın:

  • VELİ: "EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED",
  • TEMİZLEME: "1077EFEC-C0B2-4D02-ACE3-3C1E52E2FB4B",
  • MPEG_DASH_MP4PROTECTION: "URN:MPEG:DASH:MP4PROTECTION:2011"

Aşağıda <ProtectionHeader> için Base64 kodlu verileri içeren bir örnek verilmiştir. Veriler çözümlendiğinde, yukarıdaki DASH içerik koruma desteğinde açıklanan kod çözme biçimiyle uyumludur.

<Protection>
  <ProtectionHeader SystemID="9a04f079-9840-4286-ab92-e65be0885f95">
    $BASE64ENCODED_DATA
  </ProtectionHeader>
</Protection>

3000 saniyelik içerik süresine sahip bir canlı Smooth akış manifesti örneği:

<?xml version="1.0"?>
  <SmoothStreamingMedia MajorVersion="2" MinorVersion="0" Duration="3000000000"
    TimeScale="10000000" IsLive="TRUE" LookAheadFragmentCount="2" DVRWindowLength="600000000" CanSeek="TRUE" CanPause="TRUE">
    <StreamIndex Type="text" Name="textstream301_swe" Language="swe" Subtype="CAPT" Chunks="0"
      TimeScale="10000000" Url="QualityLevels({bitrate})/Fragments(textstream301_swe={start time})">
      <QualityLevel Index="0" Bitrate="20000" CodecPrivateData="" FourCC="DFXP"/>
        <c d="40000000" t="80649382288125"/>
        <c d="39980000"/>
        <c d="40020000"/>
    </StreamIndex>
    <Protection>
      <ProtectionHeader> SystemID="$BASE64ENCODEDDRMDATA$"</ProtectionHeader>
    </Protection>
    <StreamIndex Type="audio" Name="audio101_eng" Language="eng" Subtype="AACL" Chunks="0"
      TimeScale="10000000" Url="QualityLevels({bitrate})/Fragments(audio101_eng={start time})">
      <QualityLevel Index="0" Bitrate="128000" CodecPrivateData="1290" FourCC="AACL" AudioTag="255"
        Channels="2" SamplingRate="32000" BitsPerSample="16" PacketSize="4"/>
      <c d="40000000" t="80649401327500"/>
      <c d="40000000"/>
      <c d="40000000"/>
    </StreamIndex>
    <StreamIndex Type="video" Name="video" Subtype="AVC1" Chunks="0" TimeScale="10000000"
      Url="QualityLevels({bitrate})/Fragments(video={start time})">
      <QualityLevel Index="0" Bitrate="400000" CodecPrivateData="000000016742E01596540C0EFCB808140000000168CE3880"
        FourCC="AVC1" MaxWidth="384" MaxHeight="216"/>
      <QualityLevel Index="1" Bitrate="800000" CodecPrivateData="00000001674D401E965281004B6020500000000168EF3880"
        FourCC="AVC1" MaxWidth="512" MaxHeight="288"/>
      <QualityLevel Index="2" Bitrate="1600000" CodecPrivateData="00000001674D401E965281B07BCDE020500000000168EF3880"
        FourCC="AVC1" MaxWidth="854" MaxHeight="480"/>
      <QualityLevel Index="3" Bitrate="2200000" CodecPrivateData="00000001674D401F96528080093602050000000168EF3880"
        FourCC="AVC1" MaxWidth="1024" MaxHeight="576"/>
      <c d="40000000" t="80649401378125"/>
      <c d="40000000"/>
      <c d="40000000"/>
    </StreamIndex>
  </SmoothStreamingMedia>

Video akışı için yukarıdaki örnekte, URL şablonu şu şekildedir:

QualityLevels({bitrate})/Fragments(video={start time})

İlk iki segment (dizin 2 kalite seviyesinde olduğumuz varsayılarak) ilk sırada gösterilir. İlk akış, StreamIndex videosu altında t="80649401378125" ifadesinden çıkarılır ve segment başına süre 4 saniye * 1.000.000 artar:

QualityLevels(2)/Fragments(video=80649401378125)
QualityLevels(2)/Fragments(video=80649441378125)
...

Şu anda yoksaydığımız ve gerçekleştirilmiş olup olmadıklarından bağımsız olarak akış deneyimleri üzerinde etkisi olmayan Kesintisiz Akış özelliklerinin listesini aşağıda bulabilirsiniz:

  • CanSeek, <SmoothStreamingMedia> etiketinde CanPause.
  • Hasarlar, <StreamIndex> etiketinde KaliteSeviyeleri. Bunun yerine, segmentlerin ve kalite seviyelerinin sayısını hesaplayıp <StreamIndex> içinde sağlanan gerçek QualityLevel etiketi ve <c> etiketleri gibi bilgileri temel alırız.
  • <QualityLevel> kapsamındaki BitsPerSample, PacketSize kullanılmaz.

Görüntüleme türünü kontrol edin

canDisplayType yöntemi, Web Alıcı cihazının video ve ses özelliklerini kontrol eder ve iletilen medya parametrelerini doğrulayarak bir boole döndürür. Birinci parametre dışındaki tüm parametreler isteğe bağlıdır. Ne kadar çok parametre eklerseniz kontrol de o kadar net olur.

İmzası canDisplayType(<em>mimeType</em>,<em>codecs</em>,<em>width</em>,<em>height</em>,<em>framerate</em>)

Örnekler:

Web Alıcısı cihazının ve görüntüsünün, bu codec, boyutlar ve kare hızı ile video/mp4 mime türünü destekleyip desteklemediğini kontrol eder:

canDisplayType("video/mp4", "avc1.42e015,mp4a.40.5", 1920, 1080, 30)

3840 genişliğini ve 2160 yüksekliğini belirterek Web Alıcısı cihazının ve ekranının bu codec için 4K video biçimini destekleyip desteklemediğini kontrol eder:

canDisplayType("video/mp4", "hev1.1.2.L150", 3840, 2160)

Web Alıcısı cihazının ve ekranının bu codec, boyutlar ve kare hızı için HDR10'u destekleyip desteklemediğini kontrol eder:

canDisplayType("video/mp4", "hev1.2.6.L150", 3840, 2160, 30)

Web Alıcısı cihazının ve ekranın bu codec, boyutlar ve kare hızı için Dolby Vision'ı (DV) destekleyip desteklemediğini kontrol eder:

canDisplayType("video/mp4", "dvhe.04.06", 1920, 1080, 30)

DRM

Not: Web Alıcısı SDK'sını kullanmanın en önemli avantajlarından biri, uygulamanızın artık MPL yüklemeye ve medya oynatma işlemini ayrı olarak yürütmeye gerek olmamasıdır. Bunun nedeni, Web Alıcısı SDK'sının sizin için bu sorunu çözmesidir.

Bazı medya içerikleri, Dijital Hak Yönetimi (DRM) gerektirir. DRM lisansı (ve anahtar URL'si) manifest'te (DASH veya HLS) depolanan medya içerikleri için Cast SDK bu durumu sizin yerinize yönetir. Bu içeriğin bir alt kümesi, şifre çözme anahtarının alınması için gereken bir licenseUrl gerektirir. Web Alıcısı'nda, licenseUrl öğesini gerektiği gibi ayarlamak için PlaybackConfig özelliğini kullanabilirsiniz.

Aşağıdaki kod snippet'i, withCredentials gibi lisans istekleri için istek bilgilerini nasıl ayarlayabileceğinizi gösterir:

const context = cast.framework.CastReceiverContext.getInstance();
const playbackConfig = new cast.framework.PlaybackConfig();
// Customize the license url for playback
playbackConfig.licenseUrl = 'http://widevine/yourLicenseServer';
playbackConfig.protectionSystem = cast.framework.ContentProtection.WIDEVINE;
playbackConfig.licenseRequestHandler = requestInfo => {
  requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});

// Update playback config licenseUrl according to provided value in load request.
context.getPlayerManager().setMediaPlaybackInfoHandler((loadRequest, playbackConfig) => {
  if (loadRequest.media.customData && loadRequest.media.customData.licenseUrl) {
    playbackConfig.licenseUrl = loadRequest.media.customData.licenseUrl;
  }
  return playbackConfig;
});

Google Asistan entegrasyonunuz varsa içerik/gerekli kimlik bilgileri gibi bazı DRM bilgileri, OAuth/TOA gibi mekanizmalar aracılığıyla doğrudan Google hesabınıza bağlanabilir. Bu gibi durumlarda, medya içeriği ses aracılığıyla yüklenirse veya buluttan gelirse bu kimlik bilgilerini sağlamak için buluttan Yayın cihazına bir setCredentials çağrılır. Web Alıcısı uygulaması yazan uygulamalar daha sonra DRM'yi gerektiği şekilde çalıştırmak için setCredentials bilgilerini kullanabilirler. Medya oluşturmak için kimlik bilgilerini kullanma ile ilgili bir örneği burada bulabilirsiniz.

İpucu: ContentId, contentUrl ve Entity kullanarak medya yükleme konusuna da bakın.

Ses kanalı işleme

Cast oynatıcı medya yüklediğinde, tek bir ses kaynağı arabelleği oluşturur. Ayrıca, birincil parçanın MIME türüne bağlı olarak, arabellek tarafından kullanılacak uygun bir codec de seçer. Yeni bir arabellek ve codec oluşturulmuştur:

  • oynatma başladığında
  • her reklam arasında ve
  • ana içerik her devam ettirildiğinde

Arabellek tek bir codec kullandığından ve birincil parçaya göre seçildiğinden ikincil parçalar filtrelenip duyulamayabilir. Bu durum, bir medya programının birincil parçası surround sesteyken ikincil ses parçaları stereo ses kullandığında meydana gelebilir. İkincil parçalar genellikle alternatif dillerde içerik sunmak için kullanıldığından, farklı sayıda parça içeren medyaların sağlanmasının önemli bir etkisi olabilir (örneğin, çok sayıda izleyicinin kendi dillerinde içerik dinleyememesi).

Aşağıdaki senaryolarda, birincil ve ikincil kanalların aynı sayıda kanal içerdiği durumlarda programlamanın neden önemli olduğunu görebilirsiniz:

1. Senaryo: Birincil ve ikincil kanallar arasında kanal denkliğine sahip olmayan medya akışı:

  • İngilizce - AC-3 5.1 kanal (birincil)
  • İsveççe - AAC 2 kanallı
  • Fransızca - AAC 2 kanallı
  • Almanca - AAC 2 kanallı

Bu senaryoda, oynatıcının dili İngilizce dışında bir dile ayarlanırsa kullanıcı, dinlemek istediği parçayı duymaz. Çünkü iki kanal parçası oynatma sırasında filtrelenir. Çalınabilecek tek parça birincil AC-3 5.1 kanalı ve yalnızca dil İngilizce olarak ayarlandığında olacaktır.

2. Senaryo: Birincil ve ikincil kanallar arasında kanal denkliğine sahip medya akışı:

  • İngilizce - AC-3 5.1 kanal (birincil)
  • İsveççe - AC-3 5.1 kanal
  • fransız - AC-3 5.1 kanalı
  • almanya - AC-3 5.1 kanal

Bu akışın tüm kanalları aynı sayıda kanala sahip olduğundan bir kitle, seçilen dilden bağımsız olarak kanalı duyar.

Shaka ses kanalı işleme

Shaka oynatıcısı (DASH), ikincil ses kanalları arasında denklik olmayan medyayla karşılaştığında bir aktarım göstergesi olarak varsayılan olarak iki tane tercih edilen kanal sayısına ayarlanır.

Birincil parça surround ses değilse (örneğin, iki kanallı stereo kanal), Shaka oynatıcısı varsayılan olarak iki kanala ayarlanır ve ikiden fazla kanalı olan ikincil medya parçalarını otomatik olarak filtreler.

Shaka'nın tercih edilen ses kanalı sayısı, cast.framework.playConfig içindeki shakaConfig özelliğinde preferredAudioChannelCount ayarlayarak da yapılandırılabilir.

Örneğin:

shakaConfig = { "preferredAudioChannelCount": 6 };

preferredAudioChannelCount 6 olarak ayarlandığında Shaka Player, surround ses codec'lerini (AC-3 veya EC-3) destekleyip desteklemediğini kontrol eder ve tercih edilen kanal sayısına uymayan medya parçalarını otomatik olarak filtreler.