Web Alıcısı Oynatıcı Akış Protokolleri

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

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

Bu belgede, her yayın protokol için sağladığımız destek açıklanmaktadır. Her protokol için desteklenen etiketlerin açıklamasının, ayrıntılı protokol spesifikasyonuna kıyasla oldukça kısa olduğuna dikkat edin. Burada amaç, her bir protokolün nasıl kullanılacağına ve Cast özellikli cihazlarda protokolün hangi özelliklerinin canlı yayın deneyimlerinin desteklendiğine dair hızlı bir özet ve anlayış sağlamaktır.

HTTP üzerinden Dinamik Uyarlanabilir Akış (DASH)

ISO'nun ayrıntılı DASH spesifikasyonu.

DASH, HTTP(S) sunucuları üzerinden yüksek kaliteli video akışı sağlayan uyarlanabilir bit hızı akış protokolüdür. XML olarak oluşturulan bir manifest, video içeriğinin nasıl başlatılıp indirileceğine dair meta veri bilgilerinin çoğunu içerir. Web Alıcısı Oynatıcının desteklediği temel kavramlar <Period>, <AdaptationSet>, <Representation>, <SegmentTemplate>, <SegmentList>, <BaseUrl> ve <ContentProtection>'dur.

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

<MPD> altındaki bir <AdaptationSet>, bir medya akışı türü (çoğu durumda video, ses veya altyazı) için bir temsil grubudur. En yaygın olarak desteklenen mime türleri "video/mp4", "audio/mp4" ve "text/vtt"dir. <AdaptationSet> altına isteğe bağlı bir <ContentComponent contentType="$TYPE$"> eklenebilir.

Her <AdaptationSet> öğesinin içinde <Representation> etiket listesi bulunmalıdır. Web Alıcısı Oynatıcı, MSE kaynak arabelleğini başlatmak için codecs bilgilerini ve oynatılacak doğru gösterimi/bit hızını otomatik olarak seçmek için bandwidth bilgilerini kullanır.

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

Bir <SegmentTemplate> için başlatma segmentinin ve medya segmentlerinin şablon kullanılarak nasıl temsil edilebileceğini belirtir. Aşağıdaki örnekte $Number$, CDN'de mevcut olan segment numarasını gösterir. Dolayısıyla 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 bir segmentin ne kadar sürdüğünü ve hangi segmentlerin tekrarlandığını belirtmek için yaygın olarak <SegmentTimeline> etiketi kullanılır. timescale (bir saniyeyi temsil edecek birimler) genellikle <SegmentTemplate> özelliklerine dahil edilir. Böylece segmentin zamanını bu birime göre hesaplayabiliriz. Aşağıdaki örnekte, <S> etiketi bir segment etiketini, d özelliği ise segmentin ne kadar uzun olduğunu belirtir. r özelliği ise aynı sürede kaç segmentin tekrarlanacağını belirtir. Böylece $Time$, medya segmentini media özelliğinde belirtildiği gibi indirirken düzgün ş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> kullanılarak temsil için bir örnek aşağıda verilmiştir:

<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 segmentli dosyalarda <SegmentBase>, genellikle <BaseURL> dosyasının hangi bölümünün dizini içerdiğini belirtmek için bayt aralığı istekleriyle kullanılır. Geri kalan, oynatma devam ederken veya arama gerçekleşirken isteğe bağlı olarak getirilebilir. Burada, Initialization aralığı init meta veri aralığını, indexRange ise 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 korunuyorsa <AdaptationSet> altında bir <ContentProtection> bölümü görünebilir. Burada schemeIdUri, kullanılacak DRM sistemini benzersiz bir şekilde 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. Şu anda desteklediğimiz, yukarıda belirtilmeyen etiketlerle ilgili ek DASH özelliklerinin listesini aşağıda bulabilirsiniz:

Özellik Adı Özellik İşlevi
mediaPresentationDuration 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".
presentationTimeOffset <SegmentBase> etiketinin özelliği; dönemin başlangıcına ilişkin sunum saat farkını belirtir.
startNumber Dönem içindeki bir sunudaki ilk medya segmentinin sayısını belirtir. Bu bilgi genellikle canlı yayında kullanılır.

Ayrıca DASH için MP4 parçaları içindeki EMSG kutusunun tanınmasını destekliyor ve geliştiricilere EmsgEvent sağlıyoruz.

Mevcut Web Alıcısı Oynatıcımız önemli DASH kullanım alanlarını desteklese de şu anda DASH uygulamamızın yok saydığı veya kullanmadığı yaygın özelliklerin bir listesini burada bulabilirsiniz. Yani manifest dosyasında bunları barındırıp barındırmadığından bağımsız olarak, içeriğin oynatma deneyimi üzerinde hiçbir etkisi yoktur.

  • availabilityStartTime
  • segmentAlignment

HTTP Canlı Yayın (HLS)

HTTP canlı yayınına genel bakış ve tüm spesifikasyonlara buradan ulaşabilirsiniz.

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

Etiket adı İşlevler
#EXT-X-STREAM-INF Bit hızı/varyant akışı belirtir. Uyarlanabilir bit hızı akış seçimini destekleyen BANDWIDTH özelliği gereklidir. MSE'yi başlatmak için "avc1.42c01e,mp4a.40.2" gibi CODECS özelliğinin kesinlikle kullanılması önerilir. Belirtilmezse varsayılan büyük/küçük harf 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 diğer biçimlerdeki (5.1 surround ses) veya dillerdeki alternatif ses akışlarıdır. VIDEO, AUDIO, SUBTITLES veya CLOSED-CAPTIONS içeren bir TYPE özelliğine izin verilir. DEFAULT özelliğinin YES değerine ayarlanması, varsayılan olarak bu alternatif akışın seçildiğini belirtir.

Web Alıcı Oynatıcı'nın şu anda medya oynatma listesinde desteklediği HLS etiketlerinin listesini burada bulabilirsiniz:

Etiket adı İşlevler
#EXTINF Akış bilgisi (genellikle saniye cinsinden segmentin süresi) ve sonraki satırda segmentin URL'si gelir.
#EXT-X-TARGETDURATION Her bir segmentin saniye cinsinden uzunluğu. Bu aynı zamanda, canlı yayınlar için oynatma listesi manifestini ne sıklıkta indireceğ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 bir canlı yayın için).
#EXT-X-KEY DRM anahtarı bilgileri. METHOD özelliği, hangi anahtar sisteminin kullanılacağını belirtir. Bugün AES-128 ve SAMPLE-AES desteklenmektedir.
#EXT-X-BYTERANGE Segment URL'si için getirilen bayt aralığı.
#EXT-X-DISCONTINUITY Ardışık segmentler arasındaki süreksizliği belirtir. Bu durum genellikle ana akışın ortasında bir reklam segmentinin göründüğü sunucu tarafı reklam ekleme işleminde görülür.
#EXT-X-PROGRAM-DATE-TIME Sonraki segmentin ilk örneğinin mutlak zamanı, ör. "2016-09-21T23:23:52.066Z".
#EXT-X-ENDLIST Bu içerik, seç-izle video veya canlı yayın olabilir.

Canlı yayında, yeni yenilenen manifestin nasıl birleştirileceğini belirlemede temel unsurlar olarak #EXT-X-PROGRAM-DATE-TIME ve #EXT-X-MEDIA-SEQUENCE kullanılır. 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 spesifikasyonu uyarınca, eşleştirme 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, alternatif codec'lere sahip bir #EXT-X-MEDIA etiketinin yanı sıra akış yapılandırmasında segment biçimi sağlayarak gerçekleştirilebilir.

Web Alıcısı Oynatıcısı, spesifikasyon başına belirli davranışlar bekler. Örneğin, #EXT-INF etiketinden sonra bir URI bekleriz. Örneğin, #EXT-X-DISCOUNTINUITY bir URI değilse oynatma listesi için ayrıştırma işleminin başarısız olmasına neden olur.

Yeni segment listelerini almak için her #EXT-X-TARGETDURATION saniyede bir oynatma listesini/manifesti yeniden yükleriz ve tüm segmentlerin yeni dahili temsilini yenisiyle güncelleriz. Her arama talep edildiğinde, yalnızca aranabilir aralık dahilinde arama yaparız. Canlı yayın için sadece en yeni listenin başından sondan üç hedef süreye kadar arama yapılmasına izin verilir. Dolayısıyla, örneğin, 10 segment listeniz varsa ve 6. segmentteyseniz yalnızca 7'ye kadar arama yapabilirsiniz, ancak 8'e kadar arama yapamazsınız.

Segment biçimi desteği

CAF SDK'sı, ses için HlsSegmentFormat ve video için HlsVideoSegmentFormat içinde referans verilen birden fazla biçimde yayınlanan içeriği oynatmayı destekler. Buna hem şifrelenmiş hem de şifrelenmemiş AAC ve AC3 çalma gibi paketlenmiş ses desteği dahildir. İçeriğinizi oynatıcıya doğru şekilde açıklayabilmek 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ışı paket içeriği olarak oynatmaya çalışır. Bu özellik, yükleme isteği verilerindeki (Android, iOS ve Web) gönderenlerden herhangi biri tarafından veya mesaj önleyiciler aracılığıyla alıcı üzerinden ayarlanabilir.

Web Alıcısı'nda içerik hazırlamayla ilgili daha fazla bilgi için aşağıdaki örnek kod snippet'ine veya contentId, contentUrl ve varlık 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 koruma

Yukarıdaki #EXT-X-KEY etiket bölümünde listelendiği gibi Cast SDK, SAMPLE-AES veya SAMPLE-AES-CTR'yi destekler. Burada anahtara giden bir URI, başlatma vektörü belirtilebilir:

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. URI, kodu çözüldüğünde şu anahtar kimliğini içeren BASE64 kodlanmış DRM bilgisi XXXXXXX içerir:

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

Sürüm 1'de aşağıdaki özellikler tanımlanmıştır:

Özellik Örnek Açıklama
KEYFORMATVERSIONS "1" Bu teklif, anahtar biçimi sürüm 1'i tanımlıyor
KEYFORMAT "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" UUID, DASH IF IOP'deki Widevine UUID'dir. Widevine şifrelenmiş akışlarla MPD'de aynı dize kullanılır.
URI "data:text/plain;base64, <base64 encoded PSSH box>" Veri türünü ve PSSH kutusunu içeren akışın URI'si.
METHOD SAMPLE-AES-CTR İçerik şifrelenirken kullanılan şifreleme şifresini belirtir. ÖRNEK, içeriğin "cbcs" kullanılarak şifrelendiğini belirtir. ÖRNEK-AES-TO, içeriğin AES-TO koruma planlarından biri ("cenc") kullanılarak şifrelendiğine işaret eder.

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'te default_kid ile aynı role sahip olan anahtar kimliğini kodlayan 16 baytlık onaltılık dize. Hiyerarşik anahtar şeması kullanıyorsanız bu, "kök" anahtar olur.

V2 sinyaliyle örnek HLS oynatma listesi:

#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, HLS'de şu anda kullanmadığımız veya desteklemediğimiz özelliklerin ve etiketlerin bir listesi bulunmaktadır. Bunların varlığı veya yokluğu akış davranışını etkilemez.

  • #EXT-X-STREAM-INF öğesindeki RESOLUTION= özelliği yok sayılır.
  • #EXT-X-MEDIA kapsamındaki AUTOSELECT= özelliği kullanılmıyor. Bunun yerine DEFAULT=
  • Ana oynatma listesindeki #EXT-X-I-FRAME-STREAM-INF yoksayılır.
  • #EXT-X-DISCONTINUITY-SEQUENCE yoksayıldı
  • #EXT-X-PLAYLIST-TYPE:EVENT bir canlı yayında, #EXT-X-PLAYLIST-TYPE:VOD de VOD akışında olabilir. Ancak şu anda Web Alıcısı Oynatıcımız, canlı VOD'yi belirlemek için yalnızca #EXT-X-ENDLIST'in varlığından yararlanmaktadır.

Sorunsuz akış

Microsoft'un resmi Smooth Streaming spesifikasyonu.

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

Web Alıcısı Oynatıcının şu anda desteklediği Smooth Streaming (Kesintisiz Akış) konusunda en yaygın etiketlerin ve özelliklerin tablosunu burada bulabilirsiniz. Birçok kavram yukarıdaki DASH bölümünde zaten açıklanmıştır.

Etiket/Özellik Kullanım
<SmoothStreamingMedia> Manifest'in ana etiketi şu özellikleri içerir:
  • TimeScale: Bir saniyelik genellikle 10.000.000'luk artışla temsil edilecek birimlerin sayısı.
  • Süre: İçeriğin zaman ölçeğine göre uzunluğu. Web Alıcısı Oynatıcı, 0,1 saniyeden kısa süreleri desteklemez.
  • IsLive: Manifestin canlı medya olup olmadığı.
<StreamIndex> DASH'in AdaptationSet'ine benzeyen bir akış grubu. Tür genellikle "metin", "video" veya "ses"tir. URL özelliği genellikle bit hızı veya başlangıç zamanı gibi bilgilerin kullanıldığı şablonlu parça URL'si içerir.
<QualityLevel> Her QualityLevel etiketi kendi Bit Hızı ve bir FourCC codec'ini belirtir. FourCC kodu genellikle "H264", "AVC1", "AACL" şeklindedir. Video için de çözünürlüklerini Maxwidth ve MaxHeight aracılığıyla belirtir. Ses için Örnekleme Oranı ve Kanal sayısı aracılığıyla sıklığını (ör. 44100) belirtir.
<c> Akış Parça Öğesi. İçerik:
  • d: parçanın süresi.
  • t: Parçanın Medya Zamanı.
<Koruma> <SmoothStreamingMedia> etiketi altında kullanılacak sistem DRM'sinin kimliğini listeleyen, isteğe bağlı SystemID özelliğine sahip bir etiket.
<ProtectionHeader> <Protection> altında bir SystemID özelliği ve genellikle Base64 olarak kodlanmış özel veriler içerebilir. Widevine için bu etiket; anahtar kimliği, anahtar uzunluğu, algoritma kimliğini (ör. AESTO, LA_URL) (lisans edinme URL'si), LUI_URL (lisans kullanıcı arayüzü URL'si) ve DS_ID'yi (alan hizmeti kimliği) içerir.

İçerik koruma

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

  • GENİŞ: 'EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED',
  • CLEAKEY: '1077EFEC-C0B2-4D02-ACE3-3C1E52E2FB4B',
  • MPEG_DASH_MP4PROTECTION: "URN:MPEG:DASH:MP4PROTECTION:2011"

<ProtectionHeader> için, aşağıda Base64 olarak kodlanmış verilerin yer aldığı bir örnek verilmiştir. Kodu çözülmüş veriler, yukarıdaki DASH içerik koruma desteğinde açıklandığı şekilde aynı kodu çözülmüş biçime uyar.

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

Aşağıda 3.000 saniyelik içerik süresine sahip bir canlı Smooth yayın manifesti örneği verilmiştir:

<?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>

Yukarıdaki video akışı örneğinde URL şablonu şu şekildedir:

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

Dolayısıyla, video StreamIndex altında t="80649401378125"ten çıkarılan ilk süre ve segment başına 4 saniye x 10000000 zaman artışıyla ilk iki segment (dizin 2 kalite seviyesinde olduğu varsayılarak) aşağıdaki gibi olur:

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

Şu anda yok saydığımız ve sağlanıp sağlanmadıklarına bakılmaksızın akış deneyimleri üzerinde etkisi olmayan Smooth Streaming özelliklerinin listesini aşağıda bulabilirsiniz:

  • <SmoothStreamingMedia> etiketinde CanSeek, CanPause.
  • Parçalar, <StreamIndex> etikette QualityLevels. Bunun yerine, segment sayısını ve kalite seviyelerinin sayısını, gerçek QualityLevel etiketi ve <c> etiketleri gibi <StreamIndex> içinde sağlanan bilgilere dayalı olarak hesaplarız.
  • <QualityLevel> içindeki BitsPerSample, PacketSize kullanılmaz.

Ekran türünü kontrol edin

canDisplayType yöntemi, aktarılan medya parametrelerini doğrulayıp bir boole döndürerek Web Alıcısı cihazının ve ekranının video ve ses özelliklerini kontrol eder. İlki dışındaki tüm parametreler isteğe bağlıdır. Ne kadar fazla parametre eklerseniz kontrol o kadar kesin 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 ekranının şu codec'e, boyutlara ve kare hızına sahip 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 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

Bazı medya içerikleri Dijital Haklar Yönetimi'ni (DRM) gerektirir. DRM lisansı (ve anahtar URL'si) manifest dosyasında (DASH veya HLS) depolanan medya içeriği söz konusu olduğunda Cast SDK, bu durumu sizin için halleder. Bu içeriğin bir alt kümesi, şifre çözme anahtarını edinmek için gerekli olan bir licenseUrl gerektirir. Web Alıcısı'nda, licenseUrl öğesini gerektiği gibi ayarlamak için PlaybackConfig kullanabilirsiniz.

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

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 için gerekli kimlik bilgileri gibi bazı DRM bilgileri, OAuth/TOA gibi mekanizmalar aracılığıyla doğrudan Google hesabınıza bağlanabilir. Bu durumlarda, medya içeriği sesle yüklenirse veya buluttan gelirse bu kimlik bilgilerini sağlamak için buluttan Cast cihazına bir setCredentials çağrılır. Bir Web Alıcısı uygulaması yazan uygulamalar, daha sonra DRM'yi gerektiğinde çalıştırmak için setCredentials bilgilerini kullanabilir. Burada, medyayı oluşturmak için kimlik bilgisini kullanma örneğini görebilirsiniz.

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

Ses kanalı işleme

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

  • oynatmaya başladığında,
  • ve her reklam arasında
  • ne zaman geri çekileceklerini öğrenebilirsiniz.

Arabellek tek bir codec kullandığı ve codec birincil kanala göre seçildiği için ikincil parçaların filtrelenip duyulmadığı durumlar söz konusudur. Bu durum, bir medya programının birincil parçası surround seste, ikincil ses parçalarında stereo ses kullandığında meydana gelebilir. İkincil parçalar alternatif dillerde içerik sunmak için sıklıkla kullanıldığından, farklı sayıda parça içeren medyaların sağlanması, çok sayıda izleyicinin içeriği ana dilinde duyamaması gibi önemli bir etki yaratabilir.

Aşağıdaki senaryolarda, birincil ve ikincil parçaların aynı sayıda kanalı içerdiği programlama sunmanın neden önemli olduğu gösterilmektedir:

1. Senaryo: Birincil ve ikincil kanallarda kanal denkliği olmayan medya akışı:

  • ingilizce - AC-3 5.1 kanalı (birincil)
  • isveç - AAC 2 kanallı
  • fransız - AAC 2 kanallı
  • alman - AAC 2 kanallı

Bu senaryoda, oynatıcının dili İngilizce dışında bir dile ayarlanırsa iki kanallı parçalar oynatma sırasında filtrelendiğinden kullanıcı duymayı beklediği parçayı duymaz. Yalnızca dil İngilizce olarak ayarlandığında oynatılabilecek tek parça birincil AC-3 5.1 kanalı olacaktır.

2. Senaryo: Birincil ve ikincil kanallarda kanal denkliği olan medya akışı:

  • ingilizce - AC-3 5.1 kanalı (birincil)
  • isveç - AC-3 5.1 kanal
  • fransız - AC-3 5.1 kanalı
  • alman - AC-3 5.1 kanalı

Bu yayının tüm parçaları aynı sayıda kanala sahip olduğundan kitle, seçilen dilden bağımsız olarak bir parçayı duyar.

Shaka ses kanalı kullanımı

Shaka oynatıcısı (DASH), ikincil ses parçalarında denklik sağlamayan medyayla karşılaştığında risk azaltma önlemi olarak varsayılan olarak iki kanal sayısını tercih eder.

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

Shaka'nın tercih ettiği ses kanalı sayısı, cast.framework.PlaybackConfig'deki shakaConfig özelliğinden preferredAudioChannelCount ayarlanarak 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.