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
öğesindekiRESOLUTION=
özelliği yoksayılır.#EXT-X-MEDIA
içindekiAUTOSELECT=
özelliği kullanılmıyor. Bunun yerineDEFAULT=
- 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:
|
<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:
|
<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çekQualityLevel
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.