現在、Web Receiver SDK では次の 3 種類のストリーミング プロトコルがサポートされています。
DASH、HTTP Live Streaming、Smooth Streaming。
このドキュメントでは、各ストリーミング プロトコルのサポートについて説明します。各プロトコルでサポートされるタグの説明は、詳細なプロトコル仕様と比較して大幅に省略されています。目標は、各プロトコルの使用方法や、ストリーミング対応を提供するために Cast 対応デバイスでどのプロトコルがサポートされているかを簡単に理解できるようにすることです。
HTTP 上の動的適応ストリーミング(DASH)
ISO の DASH の詳細な仕様。
DASH は、HTTP(S) サーバーを介した高品質の動画ストリーミングを可能にするアダプティブ ビットレート ストリーミング プロトコルです。XML で構成されたマニフェストには、動画コンテンツの初期化とダウンロードの方法に関するメタデータ情報の大部分が含まれています。Web Receiver Player がサポートする主なコンセプトは、<Period>
、<AdaptationSet>
、<Representation>
、<SegmentTemplate>
、<SegmentList>
、<BaseUrl>
、<ContentProtection>
です。
DASH マニフェストは、ルートの <MPD>
タグで始まり、内部には 1 つ以上のストリーミング コンテンツを表す 1 つ以上の <Period>
タグが含まれます。<Period>
タグを使用すると、ストリーミング コンテンツをさまざまに並べ替えることができます。また、メイン コンテンツとアドバタイズ、または連続した複数の動画コンテンツを分割するためによく使用されます。
<MPD>
の下の <AdaptationSet>
は、1 つのメディア ストリーム(ほとんどの場合、動画、音声、字幕)を表すセットです。一般的な MIME タイプは「video/mp4」、「audio/mp4」、「text/vtt」です。オプションの <ContentComponent contentType="$TYPE$">
を <AdaptationSet>
に含めることができます。
各 <AdaptationSet>
内に <Representation>
タグのリストがあり、Web Receiver Player が codecs
情報を使用して MSE ソースバッファを初期化し、bandwidth
情報を使用して適切な表現 / ビットレートを自動的に選択します。
<Representation>
ごとに、メディア セグメントは、単一セグメント表現の <BaseURL>
、セグメント リスト用の <SegmentList>
(HLS に類似)、または <SegmentTemplate>
を使用して記述されます。
<SegmentTemplate>
の場合、初期化セグメントとメディア セグメントをテンプレートでどのように表現できるかを示します。以下の例の $Number$
は、CDN から利用可能なセグメント番号を示します。そのため、再生が続けられると、seg1.m4s、seg2.m4s などに変換されます。
<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>
で一般的には、<SegmentTimeline>
タグを使用して、各セグメントの長さと繰り返されるセグメントを指定します。timescale
(1 秒を表す単位)は多くの場合、<SegmentTemplate>
の属性の一部として含まれ、この単位に基づいてセグメントの時刻を計算できます。以下の例では、<S>
タグはセグメント タグを示し、d
属性はセグメントの長さを示します。r
属性は、同じ期間のセグメント数を指定することにより、media
属性で指定されたメディア セグメントのダウンロードに対して $Time$
を適切に計算できるようにします。
<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>
を使用した表現については、次に例を示します。
<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>
単一セグメントのファイルでは、<SegmentBase>
がバイト範囲リクエストとともに使用され、<BaseURL>
ファイルのどの部分にインデックスが含まれるかが指定されます。残りの部分は、再生の継続時またはシークの発生時にオンデマンドで取得できます。ここで、Initialization
の範囲は初期メタデータの範囲を指定し、indexRange
はメディア セグメントのインデックスを指定します。現時点では、連続するバイト範囲のみがサポートされています。
<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>
どの表現を使用するかにかかわらず、ストリームが保護されている場合、<AdaptationSet>
の下に <ContentProtection>
セクションが表示され、schemeIdUri
により使用する DRM システムが一意に識別されます。一般的な暗号化用の鍵 ID を指定することもできます。
<!-- 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>
その他の例と詳細については、MPEG-DASH の仕様をご覧ください。 以下は、現在サポートされていないタグの追加の DASH 属性のリストです。
属性名 | 属性関数 |
---|---|
mediapresentationDuration | 動画コンテンツの長さ。 |
minimumUpdatePeriod | <MPD> タグの属性。マニフェストを再読み込みする必要がある頻度を指定します。 |
type | <MPD> タグの属性。ライブ ストリームであることを示す「dynamic」です。 |
プレゼンテーション時間オフセット | <SegmentBase> タグの属性。期間の先頭からのプレゼンテーション時間オフセットを指定します。 |
開始番号 | プレゼンテーション内の最初のメディア セグメントの数を期間で指定します。これは多くの場合、ライブ配信で使用されます。 |
DASH 用の MP4 フラグメント内の EMSG ボックスの認識もサポートし、デベロッパーには EmsgEvent
を提供しています。
現在の Web Receiver Player は DASH の主要なユースケースに対応していますが、以下に、現在の DASH 実装で無視される、または使用されない一般的な属性のリストを示します。つまり、マニフェストにそれらが含まれているかどうかにかかわらず、コンテンツの再生エクスペリエンスには影響しません。
- 可用性の開始日時
- SegmentsAlignment
HTTP Live Streaming(HLS)
HTTP ライブ ストリーミングの概要と仕様については、こちらをご覧ください。
Web Receiver Player の主な強みの 1 つは、MSE で HLS の再生をサポートできることです。マニフェストが 1 つのファイルに含まれている DASH とは異なり、HLS は、すべてのバリアント ストリームのリストを含むマスター再生リストをそれぞれの URL とともに送信します。バリエーション再生リストはメディア再生リストです。Web Receiver Player がマスター再生リストで現在サポートしている 2 つの主要な HLS タグは次のとおりです。
タグ名 | 機能 |
---|---|
#EXT-X-STREAM-INF | ビットレート/バリアント ストリームを指定します。アダプティブ ビットレート ストリーミングの選択をサポートする BANDWIDTH 属性は必須です。"avc1.42c01e,mp4a.40.2" など、MSE を初期化するために、CODECS 属性を使用することを強くおすすめします。指定しない場合、デフォルトのケースは H264 メイン プロファイル 3.0 動画と "mp4a.40.2" 音声エンコード コンテンツに設定されます。 |
#EXT-X-MEDIA | コンテンツを表す追加のメディア再生リストを URI 属性で指定します。これらは通常、他の形式(5.1 サラウンド音声)または言語の代替オーディオ ストリームです。VIDEO 、AUDIO 、SUBTITLES 、CLOSED-CAPTIONS のいずれかを含む TYPE の属性を指定できます。DEFAULT 属性を YES に設定すると、デフォルトでこの代替ストリームが選択されるようになります。 |
ウェブ レシーバ プレーヤーが現在メディア再生リストでサポートされている HLS タグは次のとおりです。
タグ名 | 機能 |
---|---|
#外部 | ストリーム情報(通常はセグメントの長さの秒数)。次の行にはセグメントの URL が含まれます。 |
#EXT-X-TARGETDURATION | 各セグメントの長さ(秒)。これは、ライブ配信の再生リスト マニフェストのダウンロード/更新頻度も決定します。Web Receiver Player では、0.1 秒より短い継続時間はサポートされていません。 |
#EXT-X-MEDIA-SEQUENCE | この再生リストの最初のセグメントが表すシーケンス番号(多くの場合、ライブ ストリームの場合)。 |
#EXT-X-KEY | DRM 鍵情報。METHOD 属性は、使用する鍵システムを指定します。現在、AES-128 と SAMPLE-AES がサポートされています。 |
#EXT-X-BYTERANGE | セグメント URL で取得するバイト範囲。 |
#EXT-X-DISCONTINUITY | 連続するセグメント間の不連続性を指定します。サーバーサイドの広告挿入では、広告ストリームがメイン ストリームの途中で表示されることがよくあります。 |
#EXT-X-PROGRAM-DATE-TIME | 次のセグメントの最初のサンプルの絶対時間(例: 2016-09-21T23:23:52.066Z)。 |
#EXT-X-ENDLIST | VOD かライブ配信か。 |
ライブ ストリームの場合は、#EXT-X-PROGRAM-DATE-TIME
と #EXT-X-MEDIA-SEQUENCE
を重要な要素として使用して、新しく更新されたマニフェストを統合する方法を判断します。存在する場合、#EXT-X-PROGRAM-DATE-TIME
は更新されたセグメントを照合するために使用されます。それ以外の場合は、#EXT-X-MEDIA-SEQUENCE
番号が使用されます。HLS の仕様では、照合にファイル名の比較は使用されません。
HLS 実装では、メインの音声再生として代替音声ストリーム(5.1 サラウンド音声など)を選択できます。これを行うには、#EXT-X-MEDIA
タグを代替コーデックで使用するとともに、ストリーム設定でセグメント形式を指定します。
ウェブレシーバー プレーヤーは、仕様に沿った特定の動作を期待します。たとえば、#EXT-INF
タグの後に URI が必要です。URI でない場合、たとえば #EXT-X-DISCOUNTINUITY
は、プレイリストの解析に失敗します。
#EXT-X-TARGETDURATION
秒ごとに再生リスト/マニフェストを再読み込みして新しいセグメント リストを取得し、すべてのセグメントの新しい内部表現を新しいセグメントに更新します。シークがリクエストされるたびに、シーク可能な範囲内の検索を行います。ライブでは、最後のリストの開始から最後の 3 つのターゲット時間まで、シークのみが許可されます。たとえば、10 セグメントのリストがあり、セグメント 6 を使用している場合、シークできるのは 7 個までで、8 個までです。
セグメント形式のサポート
CAF SDK は、音声の場合は HlsSegmentFormat
、動画の場合は HlsVideoSegmentFormat
のように、複数の形式で配信されるコンテンツの再生に対応しています。これには、暗号化と非暗号化の両方で、AAC や AC3 の再生などのパックオーディオのサポートが含まれます。コンテンツをプレーヤーに正しく記述するには、LoadRequestData
の MediaInformation
にこの情報を指定する必要があります。指定しない場合、デフォルトのプレーヤー構成で、トランスポート ストリームのパッケージ化コンテンツとしてコンテンツの再生が試行されます。このプロパティは、読み込みリクエスト データ(Android、iOS、ウェブ)内の任意の送信者から、またはメッセージ インターセプタを介して受信者内で設定できます。
ウェブ レシーバーでコンテンツを準備する方法の詳細については、以下のサンプルコード スニペットまたは contentId、contentUrl、エンティティを使用してメディアを読み込むガイドをご覧ください。
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;
});
コンテンツの保護
上記の #EXT-X-KEY
タグのセクションに記載されているように、Cast SDK はキーまたは初期化ベクトルの URI を指定できる SAMPLE-AES
または SAMPLE-AES-CTR
をサポートしています。
EXT-X-KEY: METHOD=SAMPLE-AES, \
URI="data:text/plain;base64,XXXXXX", \
IV=0x6df49213a781e338628d0e9c812d328e, \
KEYFORMAT="com.widevine", \
KEYFORMATVERSIONS="1"
現在サポートしている Widevine は KEYFORMAT
であり、URI には BASE64 でエンコードされた DRM 情報 XXXXXXX
が含まれています。デコード時には、次の鍵 ID が含まれます。
{
"content_id": "MTQ1NjkzNzM1NDgxNA==",
"key_ids": [
"xxxxxxxxxxxxxxxx"
]
}
バージョン 1 では次の属性が定義されています。
属性 | 例 | 説明 |
---|---|---|
KEYFORMATVERSIONS |
"1" |
このプロポーザルでは、キー形式バージョン 1 が定義されています。 |
KEYFORMAT |
"urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" |
UUID は、DASH IF IOP の Widevine UUID です。MPD では、Widevine で暗号化されたストリームと同じ文字列が使用されます。 |
URI |
"data:text/plain;base64, <base64 encoded PSSH box>" |
データ型と PSSH ボックスを含むストリームの URI。 |
METHOD |
SAMPLE-AES-CTR |
コンテンツを暗号化する際に使用される暗号化暗号を示します。SAMPLE-AES は、コンテンツが cbcs で暗号化されていることを示します。SAMPLE-AES-CTR は、AES-CTR 保護スキームのいずれか(つまり「cenc」)を使用して、コンテンツが暗号化されていることを示します。 |
DASH MPD にマッピングされた属性:
属性 | 説明 |
---|---|
KEYFORMAT |
ContentProtection 要素の schemeIdUri 属性。 |
URI |
cenc:pssh 要素のコンテンツ。 |
KEYID |
MPEG DASH の default_kid と同じロールを持つキー ID をエンコードする 16 バイトの 16 進文字列。階層型キースキームを使用する場合は「root」キーになります。 |
V2 シグナリングを含む HLS プレイリストの例:
#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
以下に、現在使用されていない、またはサポートされていない HLS の機能とタグの一覧を示します。表示の有無はストリーミングの動作に影響しません。
#EXT-X-STREAM-INF
のRESOLUTION=
属性は無視されます。#EXT-X-MEDIA
のAUTOSELECT=
属性は使用されません。代わりにDEFAULT=
に依存します。- マスター再生リストの
#EXT-X-I-FRAME-STREAM-INF
は無視されます。 #EXT-X-DISCONTINUITY-SEQUENCE
は無視されます#EXT-X-PLAYLIST-TYPE:EVENT
はライブ ストリームに存在し、#EXT-X-PLAYLIST-TYPE:VOD
は VOD ストリームに存在しますが、現時点では、ウェブ レシーバ プレーヤーが#EXT-X-ENDLIST
の存在のみに基づいてライブ VOD を比較しています。
スムーズなストリーミング
Microsoft の公式の Smooth Streaming 仕様。
スムーズ ストリーミングでは、HTTP を介してアダプティブ ストリーミング プロトコルと XML 仕様が提供されます(DASH と同様)。DASH とは異なり、Smooth Streaming ではメディア セグメントに MPEG-4 パッケージのみ推奨します。
次の表に、Web Receiver Player が現在サポートしている Smooth Streaming で最も一般的なタグと属性を示します。多くのコンセプトについては、前述の DASH セクションをご覧ください。
タグ/属性 | 使用方法 |
---|---|
<SmoothStreamingMedia> | マニフェストのメインタグには、次の属性が含まれます。
|
<ストリームのインデックス> | DASH の AdaptationSet と同様のストリームのセット。タイプは通常、「テキスト」、「動画」、「オーディオ」です。Url 属性には通常、ビットレートや開始時間などの情報を使用して、テンプレート化されたフラグメント URL が含まれます。 |
<品質レベル> | 各 QualityLevel タグには、ビットレートと FourCC コーデックを指定します。FourCC コードは多くの場合、「H264」、「AVC1」、「AACL」などです。動画の場合は、MaxWidth と MaxHeight によって解像度を指定します。音声の場合は、SamplingRate とチャンネル数を使用して周波数(44100 など)を指定します。 |
<c> | ストリーム フラグメント要素。含む:
|
<保護> | <SmoothStreamingMedia> タグで使用するシステム DRM の ID のリストを含むオプションの SystemID 属性を含むタグ。 |
<ProtectionHeader> | <Protection> に、SystemID の属性とカスタムデータ(通常は Base64 エンコード)を含めることができます。Widevine の場合は、キー ID、キー長、アルゴリズム ID(AESCTR、LA_URL(ライセンス取得 URL)、LUI_URL(ライセンス ユーザー インターフェース URL)、DS_ID(ドメイン サービス ID)など)が含まれます。 |
コンテンツの保護
保護システム ID を適切にエンコードするには、次のマッピングを使用してください。
- WIDEVINE: 'EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED'、
- CLEARKEY: '1077EFEC-C0B2-4D02-ACE3-3C1E52E2FB4B',
- MPEG_DASH_MP4PROTECTION: 'URN:MPEG:DASH:MP4PROTECTION:2011'
<ProtectionHeader>
の場合、Base64 でエンコードされたデータの例を次に示します。デコードされたデータは、上記の DASH コンテンツ保護のサポートで説明されているのと同じデコード形式になります。
<Protection>
<ProtectionHeader SystemID="9a04f079-9840-4286-ab92-e65be0885f95">
$BASE64ENCODED_DATA
</ProtectionHeader>
</Protection>
以下に、3,000 秒のコンテンツを含むライブ スムース ストリーミング マニフェストの例を示します。
<?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>
動画ストリームの上記の例では、URL テンプレートは次のようになります。
QualityLevels({bitrate})/Fragments(video={start time})
したがって、最初の 2 つのセグメント(インデックス 2 の品質レベルであると仮定)は次のようになります。動画 StreamIndex の t="80649401378125" から初期時間が抽出され、セグメントごとに 4 秒 × 10000000 ずつ増加します。
QualityLevels(2)/Fragments(video=80649401378125) QualityLevels(2)/Fragments(video=80649441378125) ...
以下に、スムーズ ストリーミング属性のリストを示します。現在、この機能は無視され、提供されているかどうかにかかわらず、ストリーミング エクスペリエンスには影響しません。
<SmoothStreamingMedia>
タグの CanSeek、CanPause。<StreamIndex>
タグ内の Chunks、QualityLevels。代わりに、実際のQualityLevel
タグや<c>
タグなど、<StreamIndex>
内で提供された情報に基づいて、セグメントの数と品質レベルが計算されます。<QualityLevel>
の BitsPerSample、PacketSize は使用されません。
表示タイプを確認する
canDisplayType
メソッドは、渡されたメディア パラメータを検証してブール値を返すことで、ウェブレシーバー デバイスの動画と音声の機能を確認します。最初のパラメータ以外はすべて省略可能です。指定するパラメータが多いほど、チェックは正確になります。
署名は canDisplayType(<em>mimeType</em>,<em>codecs</em>,<em>width</em>,<em>height</em>,<em>framerate</em>)
です
例:
ウェブ レシーバ デバイスとディスプレイが、次の特定のコーデック、サイズ、フレームレートで video/mp4 MIME タイプをサポートしているかどうかを確認します。
canDisplayType("video/mp4", "avc1.42e015,mp4a.40.5", 1920, 1080, 30)
幅 3,840、高さ 2,160 を指定して、このコーデックのウェブレシーバ デバイスとディスプレイが 4K 動画形式をサポートしているかどうかを確認します。
canDisplayType("video/mp4", "hev1.1.2.L150", 3840, 2160)
このコーデック、サイズ、フレームレートで、Web Receiver デバイスとディスプレイが HDR10 をサポートしているかどうかを確認します。
canDisplayType("video/mp4", "hev1.2.6.L150", 3840, 2160, 30)
ウェブ レシーバ デバイスとディスプレイが、次のコーデック、サイズ、フレームレートでドルビー ビジョン(DV)をサポートしているかどうかを確認します。
canDisplayType("video/mp4", "dvhe.04.06", 1920, 1080, 30)
DRM
注: Web Receiver SDK を使用する主なメリットの 1 つは、MPL を読み込んでメディアの再生を個別に処理する必要がなくなることです(Web Receiver SDK によって自動的に処理されます)。
一部のメディア コンテンツではデジタル著作権管理(DRM)が必要になります。DRM ライセンス(およびキー URL)がマニフェスト(DASH または HLS)に保存されているメディア コンテンツの場合は、Cast SDK がこの処理を行います。そのコンテンツのサブセットには、復号鍵を取得するために必要な licenseUrl
が必要です。Web Receiver では、必要に応じて PlaybackConfig
を使用して licenseUrl
を設定できます。
次のコード スニペットは、withCredentials
などのライセンス リクエストのリクエスト情報を設定する方法を示しています。
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 アシスタントを統合している場合は、コンテンツに必要な認証情報などの DRM 情報が、OAuth/SSO などのメカニズムを介して Google アカウントに直接リンクされる場合があります。そのような場合、メディア コンテンツが音声で読み込まれるか、クラウドから取り込まれると、クラウドからその認証情報を提供するキャスト デバイスに対して setCredentials
が呼び出されます。これにより、ウェブ レシーバ アプリを作成するアプリケーションは、setCredentials
情報を使用して、必要に応じて DRM を運用できます。認証情報を使用してメディアを構成する例を次に示します。
ヒント: contentId、contentUrl、entity を使用してメディアを読み込むもご覧ください。
音声チャンネル処理
キャスト プレーヤーがメディアを読み込むと、単一の音源バッファが設定されます。同時に、メイントラックの MIME タイプに基づいて、バッファで使用する適切なコーデックを選択します。新しいバッファとコーデックを設定した場合:
- 再生が開始されると、
- 広告ブレークのたびに
- メイン コンテンツが再開するたび。
バッファは単一のコーデックを使用します。コーデックはプライマリ トラックに基づいて選択されるため、セカンダリ トラックが除外されて音声が再生されないことがあります。これは、メディア プログラムのメイン トラックがサラウンド音声で、セカンダリ オーディオ トラックがステレオ サウンドを使用している場合に発生します。サブトラックは、異なる言語のコンテンツを提供するために使用されることが多いため、多数のトラックを含むメディアを提供すると、多くの視聴者が母国語でコンテンツを聴けなくなるなど、大きな影響を与える可能性があります。
次のシナリオは、プライマリ トラックとセカンダリ トラックに同じ数のチャンネルが含まれているプログラミングの提供が重要である理由を示しています。
シナリオ 1 - プライマリ トラックとセカンダリ トラックにまたがるチャンネル パリティのないメディア ストリーム:
- 英語 - AC-3 5.1 チャンネル(メイン)
- スウェーデン語 - AAC 2 チャンネル
- フランス語 - AAC 2 チャンネル
- ドイツ語 - AAC 2 チャンネル
このシナリオでは、プレーヤーの言語が英語以外に設定されている場合、ユーザーが期待するトラックが再生されません。これは、再生中に 2 つのチャンネル トラックがすべて除外されるためです。再生できるトラックはプライマリ AC-3 5.1 チャンネルのみになり、言語が英語に設定されている場合にのみ再生されます。
シナリオ 2 - プライマリ トラックとセカンダリ トラックにまたがるチャンネル パリティを備えたメディア ストリーム:
- 英語 - AC-3 5.1 チャンネル(メイン)
- スウェーデン - AC-3 5.1 チャンネル
- フランス語 - AC-3 5.1 チャンネル
- ドイツ語 - AC-3 5.1 チャンネル
このストリームのトラックはすべて同じ数のチャンネルであるため、選択された言語にかかわらず、オーディエンスはトラックを聴きます。
Shaka 音声チャンネル処理
Shaka プレーヤー(DASH)では、セカンダリ オーディオ トラック間で同等のメディアがないときの緩和策として、デフォルトでチャンネル数が 2 に設定されています。
メイントラックがサラウンド サウンド(2 チャンネルのステレオ トラックなど)でない場合、Shaka プレーヤーはデフォルトで 2 つのチャンネルになり、2 つ以上のチャンネルがあるセカンダリ メディア トラックは自動的に除外されます。
Shaka の優先オーディオ チャンネル数は、cast.framework.PlaybackConfig の shakaConfig
プロパティで preferredAudioChannelCount
を設定して構成することもできます。
例:
shakaConfig = { "preferredAudioChannelCount": 6 };
preferredAudioChannelCount
を 6 に設定すると、Shaka Player は、サラウンド サウンド コーデック(AC-3
または EC-3
)に対応しているかどうかを確認し、優先チャンネル数に適合しないメディア トラックを自動的に除外します。