ウェブレシーバー プレーヤーのストリーミング プロトコル

Web Receiver SDK は現在、次の 3 種類のストリーミング プロトコルをサポートしています。

DASHHTTP Live Streaming Smooth Streaming

このドキュメントでは、各ストリーミング プロトコルのサポートについて説明します。なお、各プロトコルでサポートされるタグの説明は、詳細なプロトコル仕様と比べてかなり省略されています。各プロトコルの使用方法と、ストリーミング エクスペリエンスを提供するために Cast 対応デバイスでサポートされているプロトコルの機能を一目で理解できるようにすることが目標です。

Dynamic Adaptive Streaming over 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>、セグメントのリスト(HLS に類似)の場合は <SegmentList>、または <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 の範囲は init メタデータの範囲を指定し、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>

使用する表現に関係なく、ストリームが保護されている場合は <ContentProtection> セクションが <AdaptationSet> の下に表示される可能性があります。ここで、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> タグの属性。ライブ ストリームであることを示す「動的」。
presentationTimeOffset <SegmentBase> タグの属性。期間の先頭からの表示時間オフセットを指定します。
startNumber ある期間におけるプレゼンテーション内の最初のメディア セグメントの数を指定します。ライブ配信でよく使用されます。

また、DASH の MP4 フラグメント内の EMSG ボックスの認識もサポートし、デベロッパーに EmsgEvent を提供します。

現在の Web Receiver Player は主要な DASH ユースケースをサポートしていますが、DASH の現在の実装で無視される、または使用されない一般的な属性のリストを次に示します。つまり、マニフェストに含まれているかどうかにかかわらず、コンテンツの再生エクスペリエンスには影響しません。

  • availabilityStartTime
  • segmentAlignment

HTTP Live Streaming(HLS)

HTTP Live ストリーミングの概要と仕様については、こちらをご覧ください。

Web Receiver Player の主な強みの一つは、MSE で HLS の再生をサポートできることです。マニフェストが 1 つのファイルに含まれる DASH とは異なり、HLS では、すべてのバリアント ストリームのリストとそれぞれの URL を含むマスター プレイリストが送信されます。バリエーション再生リストはメディア再生リストです。Web Receiver Player がマスター プレイリストで現在サポートしている主要な HLS タグは、次の 2 つです。

タグ名 機能
#EXT-X-STREAM-INF ビットレート/バリアント ストリームを指定します。アダプティブ ビットレート ストリーミングの選択をサポートする BANDWIDTH 属性が必要です。"avc1.42c01e,mp4a.40.2" などの MSE を初期化する場合は、CODECS 属性を使用することを強くおすすめします。指定しない場合、デフォルトのケースは H264 メイン プロファイル 3.0 の動画と "mp4a.40.2" の音声でエンコードされたコンテンツに設定されます。
#EXT-X-MEDIA コンテンツを表す追加のメディア再生リスト(URI 属性内)を指定します。通常は、他の形式(5.1 サラウンド音声)や言語の代替音声ストリームです。VIDEOAUDIOSUBTITLESCLOSED-CAPTIONS のいずれかを含む TYPE の属性を使用できます。DEFAULT 属性を YES に設定すると、デフォルトでこの代替ストリームが選択されます。

Web Receiver Player が現在メディア プレイリストでサポートしている HLS タグは次のとおりです。

タグ名 機能
#EXTINF ストリーム情報。通常はセグメントの長さ(秒)が続き、次の行はセグメントの URL です。
#EXT-X-TARGETDURATION 各セグメントの長さ(秒)です。これにより、ライブ ストリームの再生リストのマニフェストをダウンロードまたは更新する頻度も決まります。Web Receiver Player は 0.1 秒未満の再生時間をサポートしていません。
#EXT-X-MEDIA-SEQUENCE この再生リストの最初のセグメントが表すシーケンス番号(ライブ ストリームでよく使用されます)。
#EXT-X-KEY DRM 鍵情報。METHOD 属性は、使用する鍵システムを示します。現在、AES-128SAMPLE-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 仕様に従い、マッチングにファイル名の比較は使用されません。

Google の HLS 実装では、5.1 サラウンド音声などの代替音声ストリームをメインの音声再生として選択できます。そのためには、ストリーム構成でセグメント形式を指定するだけでなく、代替コーデックを指定した #EXT-X-MEDIA タグを使用します。

Web Receiver Player は、仕様に従った特定の動作を想定しています。たとえば、#EXT-INF タグの後は URI を想定しています。URI でない場合、たとえば #EXT-X-DISCOUNTINUITY はプレイリストの解析が失敗します。

#EXT-X-TARGETDURATION 秒ごとにプレイリスト/マニフェストを再読み込みして新しいセグメント リストを取得し、すべてのセグメントの新しい内部表現を新しいセグメントに更新します。シークがリクエストされるたびに、シーク可能な範囲内でのみシークします。ライブの場合、新しいリストの最初から、最後のターゲット期間までのみシークできます。たとえば、セグメント リストが 10 個あり、セグメント 6 に存在する場合、シークできるのは最大 7 個で、8 個はシークできません。

セグメント形式のサポート

CAF SDK は、音声用の HlsSegmentFormat と動画用の HlsVideoSegmentFormat で参照されているように、複数の形式で配信されたコンテンツの再生をサポートしています。これには、AAC や AC3 再生などのパックされたオーディオのサポートが含まれます(暗号化の有無は問いません)。LoadRequestDataMediaInformation でこの情報を指定することで、プレーヤーに対してコンテンツを適切に説明できます。指定しなかった場合、デフォルトのプレーヤー構成では、コンテンツをトランスポート ストリームのパッケージ コンテンツとして再生しようとします。このプロパティは、読み込みリクエスト データ内の任意の送信者(AndroidiOSウェブ)から、またはメッセージ インターセプタを介してレシーバー内から設定できます。

Web Receiver でコンテンツを準備する方法について詳しくは、以下のサンプルコード スニペットまたは 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 は SAMPLE-AES または SAMPLE-AES-CTR をサポートしています。ここでは、初期化ベクトルを指定できるキーの URI を指定できます。

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

現在サポートしている KEYFORMAT は Widevine です。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 です。Widevine で暗号化されたストリームの MPD でも、まったく同じ文字列が使用されます。
URI "data:text/plain;base64, <base64 encoded PSSH box>" データ型と PSSH ボックスを含むストリームの URI。
METHOD SAMPLE-AES-CTR コンテンツを暗号化する際に使用される暗号化暗号を指定します。SAMPLE-AES は、コンテンツが「cbcs」で暗号化されていることを通知します。SAMPLE-AES-CTR は、AES-CTR 保護スキームの 1 つである「cenc」を使用して、コンテンツが暗号化されていることを通知します。

DASH MPD にマッピングされる属性:

属性 説明
KEYFORMAT ContentProtection 要素の schemeIdUri 属性。
URI cenc:pssh 要素の内容。
KEYID キー ID をエンコードする 16 バイトの 16 進文字列。MPEG DASH の default_kid と同じロールを持ちます。階層型鍵スキームを使用する場合、これが「ルート」鍵になります。

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-INFRESOLUTION= 属性は無視されます。
  • #EXT-X-MEDIAAUTOSELECT= 属性は使用されていません。代わりに 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 と VOD の判定を行います。

スムーズなストリーミング

Microsoft の公式の Smooth Streaming 仕様

スムーズ ストリーミングでは、HTTP 経由のアダプティブ ストリーミング プロトコルと XML 仕様(DASH と同様)が提供されます。DASH とは異なり、スムーズ ストリーミングではメディア セグメントに MPEG-4 パッケージのみを推奨します。

次の表に、Web Receiver Player が現在サポートしている Smooth Streaming の最も一般的なタグと属性を示します。多くのコンセプトについては、上の DASH セクションですでに説明されています。

タグ/属性 使用状況
<SmoothStreamingMedia> マニフェストのメインタグ。次の属性が含まれます。
  • TimeScale: 1 秒を表す単位数。通常は 10,000,000 単位で指定します。
  • 長さ: タイムスケールでのコンテンツの長さ。Web Receiver Player は 0.1 秒未満の再生時間をサポートしていません。
  • IsLive: マニフェストがライブメディアかどうか。
<StreamIndex> DASH の AdaptationSet と同様、1 つのストリーム セット。タイプは通常、「text」、「video」、「audio」です。URL 属性には通常、ビットレートや開始時間などの情報を使用して、テンプレート化されたフラグメント URL を含めます。
<QualityLevel> 各 QualityLevel タグでは、ビットレートと FourCC コーデックを指定します。FourCC コードは多くの場合、「H264」、「AVC1」、「AACL」などです。動画の場合は、MaxWidth と MaxHeight によって解像度を指定します。音声の場合は、SamplingRate とチャンネル数によって周波数(44100 など)を指定します。
<c> ストリーム フラグメント要素。以下のものが含まれます。
  • d: フラグメントの期間
  • t: フラグメントのメディア時間。
<保護> オプションの SystemID 属性を含むタグ。<SmoothStreamingMedia> タグの下で使用するシステム DRM の ID をリストします。
<ProtectionHeader> <Protection> の下に SystemID の属性とカスタムデータ(通常は Base64 でエンコード)を含めることができます。Widevine の場合、鍵 ID、鍵の長さ、AESCTR などのアルゴリズム ID、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 であると仮定)は次のようになります。video StreamIndex で t="80649401378125" から抽出された最初の時刻と、4 秒 × 1,0000,000(セグメントあたり)の時間単位で抽出します。

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

以下に、現在無視し、ストリーミング エクスペリエンスに影響を与えないスムーズ ストリーミング属性を示します。この属性が提供されているかどうかによらず:

  • <SmoothStreamingMedia> タグで CanSeekCanPause を使用できます。
  • ChunksQualityLevels<StreamIndex> タグ内)。代わりに、実際の QualityLevel タグや <c> タグなど、<StreamIndex> 内で提供される情報に基づいて、セグメント数と品質レベルの数を計算します。
  • <QualityLevel>BitsPerSamplePacketSize は使用しません。

表示タイプを確認する

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 を指定して、Web Receiver デバイスとディスプレイがこのコーデックの 4K 動画形式をサポートしているかどうかを確認します。

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

ウェブ レシーバー デバイスとディスプレイが、このコーデック、サイズ、フレームレートについて HDR10 をサポートしているかどうかを確認します。

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

ウェブ レシーバー デバイスとディスプレイが、このコーデック、サイズ、フレームレートについてドルビー ビジョン(DV)をサポートしているかどうかを確認します。

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

DRM

一部のメディア コンテンツにはデジタル著作権管理(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 がクラウドからキャスト デバイスに対して呼び出され、その認証情報が提供されます。Web Receiver アプリを作成するアプリは、必要に応じて setCredentials 情報を使用して DRM を操作できます。次に、認証情報を使用してメディアを作成する例を示します。

ヒント: contentId、contentUrl、エンティティを使用してメディアを読み込むもご覧ください。

音声チャンネル処理

キャスト プレーヤーはメディアを読み込むときに、単一のオーディオ ソース バッファをセットアップします。同時に、プライマリ トラックの 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 channel
  • ドイツ語 - AC-3 5.1 チャンネル

このストリームのトラックはすべて同じ数のチャンネルを持つため、選択した言語に関係なく、視聴者にトラックが再生されます。

Shaka 音声チャンネル処理

Shaka プレーヤー(DASH)は、セカンダリ音声トラック間のパリティがないメディアを検出した場合の緩和策として、デフォルトで優先チャンネル数 2 に設定されます。

プライマリ トラックがサラウンド音声でない場合(2 チャンネルのステレオ トラックなど)、Shaka プレーヤーはデフォルトで 2 チャンネルに設定され、2 チャンネルを超えるセカンダリ メディア トラックは自動的に除外されます。

Shaka の優先する音声チャンネル数は、cast.framework.PlaybackConfigshakaConfig プロパティで preferredAudioChannelCount を設定することでも構成できます。

例:

shakaConfig = { "preferredAudioChannelCount": 6 };

preferredAudioChannelCount を 6 に設定すると、Shaka Player はサラウンド サウンド コーデック(AC-3 または EC-3)をサポートできるかどうかを確認し、優先されるチャンネル数に適合しないメディア トラックを自動的に除外します。