スマホとWebSocketで連携するテレビ用SPA(Single-Page Application)の作り方:Chromecastアプリ開発入門(2)(4/5 ページ)
メディアストリーミングデバイス「Chromecast」用アプリの開発方法を一から解説する連載。今回は、Senderのコマンドを受信してHTML5のvideo要素を使ってメディアを再生したり画面を写したりするReceiverアプリの概要と作り方などを解説します。
Adaptive Bitrate Streaming/DRMのメディアの再生
前回の記事でも解説しましたが、Adaptive Bitrate Streamingはネットワーク状況に応じてビデオ/オーディオの品質を変化させる技術、DRMはデジタルデータのコンテンツの著作権を保護して利用を制限する技術です。
Video on HTML5のAdaptive Bitrate Streaming/DRMメディア拡張
HTML5では、Adaptive Bitrate Streaming/DRMのメディアを扱えるようにいくつかの拡張がされています。
■Media Source Extensions(MSE)
MSEはAdaptive Bitrate StreamingをサポートするためのHTMLMediaElementの拡張で、メディアソースに対してより細かい制御ができるようになります。これにより、JavaScriptでチャンク単位にストリームを扱えるようになるため、ネットワークやメディア レンダリングのさまざまなボトルネックに対応して、品質レベルを調整してストリーミングすることが可能となります。Chromecastでは、HTTP Live Streaming (HLS)、MPEG-DASH、Smooth Streamingがサポートされています。
■Encrypted Media Extensions(EME)
EMEはDRMをサポートするためのHTMLMediaElement の拡張で、ブラウザーでサポートされている保護システムを検出し、DRM保護されたメディアを再生するために、キーの交換、暗号化されたメディアの複合を行うためのAPI仕様を提供します。実際の暗号解除処理は後述のCDMが行います。
■Content Decryption Modules(CDM)
CDMはDRM暗号解除処理モジュールです。各暗号方式ごとに用意され、クライアントサイドに実装されたソフトウェアまたはハードウェアモジュールです。クライアントアプリケーションは、前述のEMEのAPIを通して、メディアのDRM方式に応じて複合化を行います。Chromecastでは、PlayReadyとWidevineのCDMが組み込まれています。
より詳しい内容は、W3Cや以下のサイトで確認してください。
- Encrypted Media Extensions
- Media Source Extensions
- EME WTF?: An introduction to Encrypted Media Extensions - HTML5 Rocks
Chromecastでは、アプリケーションが上記の拡張機能を簡単に使用できるように、「Media Player Library」が提供されています。このライブラリを使用してAdaptive Bitrate Streaming/DRMメディアを再生可能です。
Adaptive Bitrate Streaming/DRMメディア再生
それでは、Media Player Libraryを使用してAdaptive Bitrate Streaming/DRMメディア再生の実装を進めていきます。
■Media Player Libraryを組み込む
まずはコード9の通りMedia Player LibraryをReceiverに組み込みます。
<html> <head> <!-- (1)Google Cast Receiver SDKの設定 --> <script type="text/javascript" src="//www.gstatic.com/cast/sdk/libs/receiver/2.0.0/cast_receiver.js"></script> <!-- (a)Media Player Libraryの参照設定 --> <script type="text/javascript" src="//www.gstatic.com/cast/sdk/libs/mediaplayer/1.0.0/media_player.js"> </script> </head> <body> 〜省略〜
(a)Media Player Libraryの参照を設定
Google Cast Receiver SDKの参照の設定と同じように、セルフホストせずに、Googleのサーバーを指定します。ライブラリのアップデートの内容は、「Google Cast Release Notes」で確認できます。
■メディア情報の取得
Media Player Libraryを利用すると、メディアを再生するようにコマンドメッセージを受け取ったときに、メディア情報を取得できます。ChromecastのSDKで定義されているメディアプレーヤーのメッセージから取得できるメディア情報は表3の通りです。
| Name | Type | Description |
|---|---|---|
| contentId | string | メディアのURL |
| streamType | enum (string) | メディアの種類:NONE、BUFFERED、LIVE |
| contentType | string | MIME:メディアのコンテントタイプ |
| metadata | object | (オプション)メタ情報 0:GenericMediaMetadata 1:TvShowMediaMetadata 2:MovieMediaMetadata 3:MusicTrackMediaMetadata 4:PhotoMediaMetadata |
| duration | double | (オプション)メディアの長さ |
| customData | object | (オプション)アプリケーションで固有のカスタムデータ。SenderとReceiverで扱えるようにデータ定義する |
メタ情報はいくつか定義があり、取得するメタ情報を指定できますが、今回は汎用的に利用できるGenericMediaMetadataを使用する前提とします。GenericMediaMetadataから取得できるメタ情報は表4の通りです。
| Name | Type | Description |
|---|---|---|
| metadataType | integer | 0 GenericMediaMetadata |
| title | string | (オプション)メディアのタイトル |
| subtitle | string | (オプション)メディアのサブタイトル |
| images | Image[] | (オプション)メディアのサムネイル画像のURLの配列 |
| releaseDate | string (ISO 8601) | (オプション)メディアのリリース日時 |
| 参照:MediaInformation | ||
メディアを再生するようにコマンドメッセージを受け取ったときに実行されるonLoadメソッドで、上記のメディア情報とメタ情報を取得できます。メディア情報からコンテンツのURLを取得するにはコード10のように記述します。
〜省略〜
//(4.1)onLoad をオーバーライド
window.mediaManager.onLoad = (function() {
var origOnLoad = mediaManager.onLoad;
return function(event) {
// (4.2) メディアのメタ情報からタイトルを表示
window.mediaTitle.innerHTML = event.data['media']['metadata']['title'];
//(b)メディアの情報からコンテンツのURLを取得
var url = event.data['media']['contentId'];
〜省略〜
■Adaptive Bitrate Streamingのメディアを再生
Adaptive Bitrate Streamingのメディアを再生するには、Media Player Libraryで提供されている、Host/Player/Protocolクラスを使用します。
Hostは、Receiverとメディアプレーヤーとのやりとりのために使用します。Receiverがメディアプレーヤーの動作をカスタマイズする場合、Hostクラスの各メソッドをオーバーライドします。
MediaElementとURLを指定してHostのコンストラクターを呼び出します(コード11)。それぞれ以下の値を設定します。
- mediaElement:ページ内のvideo要素
- uri:メディアのURL
//(c)ホストのオブジェクトを作成
window.mediaHost = new cast.player.api.Host({
'mediaElement': mediaElement,
'url': url
});
◇Cookie、カスタムヘッダーを利用する
メディアサーバーが、メディアにアクセス時にCookieとカスタムヘッダーが必要とされる場合、コード12のように記述します。
- HostのupdateSegmentRequestInfoメソッドをオーバーライド
- XML HTTP request 情報を表すcast.player.api.RequestInfoクラスの withCredentials のプロパティを有効に設定
- カスタムヘッダーを設定
//(d)withCredentials とカスタムヘッダーの設定
window.mediaHost.updateSegmentRequestInfo = function(requestInfo) { //……1.
requestInfo.withCredentials = true; //……2.
requestInfo.headers['content-type'] = 'text/xml;charset=utf-8'; //……3.
};
◇プレーヤーのエラーハンドリング
プレーヤーのエラーをハンドリングしたい場合は、HostクラスのonErrorメソッドをオーバーライドします(コード13)。
//(e)エラーハンドリング
window.mediaHost.onError = function (errorCode, requestStatus) {
console.error('### HOST ERROR - Fatal Error: code = ' + errorCode);
if (window.mediaPlayer !== null) {
window.mediaPlayer.unload();
window.mediaPlayer = null;
}
}
Playerは、MediaElementとメディアソースと通信するために使用します。Hostを指定してPlayerのコンストラクターを呼び出します(コード14)。
//(f)Playerのインスタンスを作成 window.mediaPlayer = new cast.player.api.Player(window.mediaHost);
Protocolは、HostにAdaptive Bitrate Streamingの種類を伝えるために使用します。Adaptive Bitrate Streamingの種類によってそれぞれクラスが提供されています。
URLに含まれる拡張子でAdaptive Bitrate Streamingの種類を判断して、適切なProtocolのインスタンスを作成します(コード15)。
//(g)Protocolのインスタンスを作成
var protocol = null;
if (url.lastIndexOf('.m3u8') >= 0) {
// HLS
protocol = cast.player.api.CreateHlsStreamingProtocol(window.mediaHost);
} else if (url.lastIndexOf('.mpd') >= 0) {
// MPEG-DASH
protocol = cast.player.api.CreateDashStreamingProtocol(window.mediaHost);
} else if (url.lastIndexOf('.ism/') >= 0 || url.lastIndexOf('.isml/') >= 0) {
// Smooth Streaming
protocol = cast.player.api.CreateSmoothStreamingProtocol(window.mediaHost);
}
Protocolと再生開始位置を指定して、メディアをロードします(コード16)。
//(h)Protocolを指定してメディアをロード window.mediaPlayer.load(protocol, initStart);
以上の処理で、Adaptive Bitrate Streamingのメディアを再生することが可能となります。
■DRMの処理
Chromecastデバイスには、DRMエージェント機能が搭載されています。Media Player Library(MPL)を介してデバイスのDRMエージェント機能を使用することで、ReceiverでのDRM処理が可能となります。HTML5の拡張機能であるEMEのAPIやCDMを、Receiverが直接呼び出す必要はありません。
Receiverは、ライセンスを取得する先のURLと、カスタムデータの指定を行うだけでよく、後はMPLが処理してくれます。また、MPLを利用してライセンス処理時のレスポンスデータの取得を行うこともできます(コード17)。
//(i)ライセンス取得先URLを指定
window.mediaHost.licenseUrl = licenseUrl;
//(j)カスタムデータを設定
window.mediaHost.licenseCustomData = customData;
//(k)レスポンスデータの処理をオーバーライド
window.mediaHost.processLicense = function(responseArray) {
// Uint8ArrayをStringへ変換
var response = String.fromCharCode.apply(null, responseArray);
// TODO: レスポンスデータの処理
// 必ず最後にレスポンスデータをリターンする必要がある
return responseArray;
}
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
Windows OS/Androidの画面をChromecast経由でテレビに表示する
会議室のテレビにWindows OSの画面を映してプレゼンテーションしたい。でもケーブルをつなぐのはスマートではない。こんなとき、テレビにChromecastを接続し、Windows OSにGoogle Chromeをインストールすれば、画面をWi-Fi経由でテレビに表示できるようになる。
米グーグルがChromecastのSDKを公開
モバイル端末とTVの垣根を超えるChromecast用のSDKをGoogleが公開。Chromeの拡張機能とiOS向けのGoogle Cast SDKは即日提供を開始、Android版も数日中にリリース予定だという。
グーグルのプレスイベントで見るグーグル新時代の幕開け
新型Nexus 7タブレットやAndroid 4.3、さらには新デバイスChromecastの発表から、グーグルの新世代戦略を読み解きます。
YouTube動画を家中のディスプレイで再生できたら
YouTubeビデオを、ブラウザからリビングのテレビやタブレットに飛ばせたら。HTML5のPlayコマンドをテレビに送信して再生する方法を紹介します
Android L、Android Wear、Android TV、Android Autoの開発者向け現状まとめ
米グーグルが「Google I/O 2014」で発表した次期Android「Android L」「Android TV」「Android Auto」の開発者プレビュー、そして「Android Wear」の正式版。これらに対応したアプリを開発するには、どこを見ればいいのか。概要とともに簡単にまとめてみた。
第17回 iPhoneの画面をApple TVでテレビに表示する
iPhoneの画面をテレビに映してプレゼンしたい。こんなとき、会議室にApple TVを用意しておくと便利。たった3ステップでiPhoneの画面をテレビに映せるようになる。
Windows OSの画面をApple TV経由でテレビに表示する
会議室のテレビにWindows OSの画面を映してプレゼンテーションしたい。でもケーブルをつなげるのは少々スマートではない。こんなとき、テレビにApple TVを接続し、Windows OSに「AirParrot」をインストールすれば、画面をWi-Fi経由でテレビに表示できるようになる。
WebSocketでスマートテレビをリアル接続するぷらら
ひかりTV独自のスマートテレビリモコンの接続方法はWebSocketを用いた常時接続だ。その仕組みと開発意図を聞いた。
さまざまなデバイスがWebと結び付いていく
テレビやカーナビ、家電とWebが連携していく「Web of Things」。NHKなど、最前線の取り組みが語られたカンファレンスをレポートする
テレビのスマート化とYouTubeのテレビ化
YouTubeなどネットの攻勢に対し、何もしないと「テレビは死ぬ」。それは明らかだ。テレビ局がよいサービスを開発できるかどうかが要となる。
スマートテレビはチャンスだぞ
テレビもスマート、なんだと。アメリカからGoogle TVやApple TVがやってくる。米テレビ局の映像配信Huluも上陸している。もちろん、日本だって手を打っている- 今度こそテレビとWebの統合なるか:「Google TV」は従来のWebテレビと何が違うのか?
- 頭脳放談第120回:Google TVがVIA Technologiesも救う?
- WebとUIをつなぐトリックスター(2):テレビでYahoo!デバイスが変わればUIデザインも変わる
制作の要となるエンジニアとデザイナのチームワークのツボを探る連載。今回はヤフーのテレビ向けサービスのデザイン担当に話を聞いた