最終更新日:190227原本2014-11-14 

Chromecastアプリ開発入門(2):
スマホとWebSocketで連携するテレビ用SPA(Single-Page Application)の作り方 (2/5)

Custom Receiver型のメディアストリーミングアプリの開発

 それでは、具体的にメディアストリーミングアプリ(Custom Receiver)の開発について解説したいと思います。

メディアストリーミングアプリの基本

 メディアの操作などは、video要素として定義されたMediaElement、MediaManagerとCastReceiverManagerのイベントをオーバーライドして処理を追加していきます。まずはMediaElement、MediaManager、CastReceiverManagerを初期化します(コード1)。

  1. <html>
  2. <head>
  3. <!-- (1)Google Cast Receiver SDKの設定 -->
  4. <script type="text/javascript" src="//www.gstatic.com/cast/sdk/libs/receiver/2.0.0/cast_receiver.js"></script>
  5. </head>
  6. <body>
  7. <video id='vid' />
  8. <script type="text/javascript">
  9. window.onload = function() {
  10. //(2)デバッグレベルの設定
  11. cast.receiver.logger.setLevelValue(cast.receiver.LoggerLevel.DEBUG);
  12. //(3)VideoタグのElementオブジェクトを取得
  13. window.mediaElement = document.getElementById('vid');
  14. //(4)Videoタグを指定してメディアマネージャを作成
  15. window.mediaManager = new cast.receiver.MediaManager(window.mediaElement);
  16. //(5)レシーバーマネージャのスタート
  17. window.castReceiverManager = cast.receiver.CastReceiverManager.getInstance();
  18. castReceiverManager.start();
  19. };
  20. </script>
  21. </body>
  22. </html>
コード1 Custom Receiverの基本コード

 以下、コード1について詳細に説明します。

(1)Google Cast Receiver SDKの参照を設定

 必ずこのURLを指定する必要があります。バグフィックスや新機能のアップデートが行われた場合、セルフホストしていると内容が反映されません。

(2)デバッグレベルの設定

 Cast receiver libraryのデフォルトではデバッグが無効となっています。リモートデバッグを可能にするには、ログレベルをデバッグに設定する必要があります。開発時にはリモートデバッグを有効に設定し、アプリケーションリリース時に無効に設定するとよいでしょう。

(4)MediaManagerの作成

 メディアストリームを流したいvideo要素を引数にMediaManagerの作成を行います。

(5)ReceiverManagerの開始

 メディアストリームを流したいvideo要素を引数にMediaManagerを作成し、レシーバーマネージャを開始します。

HTML5のVideo APIを使ってメディアを操作する

 HTML5のvideo要素には、メディアを操作するAPI、イベントとプロパティが用意されています。これらを使用して、JavaScriptからメディアの操作・状態の取得を行います。

コラム「HTML5のvideo要素について詳細に知りたい方は」

 W3Cにデモページ「HTML5 Video」がありますので、そこでどのような操作時にどのようなイベントが発生し、プロパティがどのように変化するか確認できます。

 また、video要素のイベントについての解説は「Media events - Web developer guide | MDN」に記述されているので参考にしてください。

 一般的なメディアプレーヤーでは、メディア再生時にメタ情報と再生状態を表示するかと思います。ここでは例として、図3のようなメディアプレーヤーに対して代表的なイベントに応じてプレーヤーの表示を変更する処理を実装してみます。

図3 プレーヤー画面
  • プレーヤー領域:video要素を画面全体に表示
  • ステータスパネル
    1. タイトルを表示
    2. 再生/一時停止状態を表示
    3. 再生時間を表示
    4. プログレスバー:メディア再生の進捗率を表示
    5. コンテンツ時間を表示

イベント処理の仕様

 図3のサンプルアプリケーションに対する、イベント処理の仕様は以下の通りです。

  1. 再生の開始前(メディアの読み込み開始時)に【1】タイトルを更新
  2. 再生が開始したら【2】再生/一時停止状態を再生状態に、【3】再生時間/【4】プログレスバー/【5】コンテンツ時間を更新
  3. 再生の開始後一定時間後にステータスパネルを隠す
  4. 再生中は、【3】再生時間と【4】プログレスバーを更新し続ける
  5. 再生が一時停止したらステータスパネルを表示し、【2】再生/一時停止状態を一時停止状態に変更
  6. 再生が再開したら1.へ戻る

イベント処理の設定

 前述のイベント処理仕様の通りに設定していきましょう。イベント処理は、MediaElementに対してaddEventListenerを使ってイベントハンドラーを登録することで設定できます(コード2)。ここではイベント処理の設定についてのみ解説し、再生時間や進捗率などの取得方法については後述します。

  1. <body>
  2. <!-- プレーヤー-->
  3. <video id='vid' />
  4. <!-- ステータスパネル -->
  5. <div id="mediaStatus">
  6. <div id="mediaTitle"></div>
  7. <div id="mediaControl">
  8. <div id="play"></div>
  9. <div id="pause"></div>
  10. <div id="current">00:00:00</div>
  11. <div id="duration">00:00:00</div>
  12. <div id="progress"></div>
  13. </div>
  14. </div>
  15. <script type="text/javascript">
  16. window.onload = function() {
  17. //(3)VideoタグのElementを取得
  18. window.mediaElement = document.getElementById('vid');
  19. // イベントリスナーを登録
  20. // メディアの読み込み開始した
  21. window.mediaElement.addEventListener('loadstart', function(e) {
  22. console.debug('######### MEDIA ELEMENT LOAD START' + e);
  23. //(3.1)ステータスパネルを表示しタイトルを更新する。……1.
  24. window.mediaStatus.style.display = "block";
  25. window.play.style.display = "block";
  26. window.pause.style.display = "none";
  27. window.mediaTitle.innerHTML = “タイトル....;
  28. });
  29. // メディアの再生が開始した
  30. window.mediaElement.addEventListener('playing', function(e) {
  31. console.debug('######### MEDIA ELEMENT PLAYING' + e);
  32. //(3.2)ステータスパネルを一定時間後に隠す。……2.
  33. window.setTimeout(function() {
  34. window.mediaStatus.style.display = "none";
  35. }, 5000);
  36. });
  37. // メディアの再生が一時停止した
  38. window.mediaElement.addEventListener('pause', function(e) {
  39. console.debug('######### MEDIA ELEMENT PAUSE' + e);
  40. //(3.3)ステータスパネルを表示する。……5.
  41. window.mediaStatus.style.display = "block";
  42. });
  43. // 一時停止した後、メディアの再生を再開した
  44. window.mediaElement.addEventListener('play', function(e) {
  45. console.debug('######### MEDIA ELEMENT PLAY' + e);
  46. //(3.2)ステータスパネルを一定時間後に隠す。……2.
  47. window.setTimeout(function() {
  48. window.mediaStatus.style.display = "none";
  49. }, 5000);
  50. });
  51. // メディアを読み込もうとしているが、予期しない理由で読み込めない
  52. window.mediaElement.addEventListener('stalled', function(e) {
  53. console.debug('######### MEDIA ELEMENT STALLED' + e);
  54. // エラー処理
  55. });
  56. // メディアの読み込み中にエラーが発生した
  57. window.mediaElement.addEventListener('error', function(e) {
  58. console.debug('######### MEDIA ELEMENT ERROR ' + e);
  59. // エラー処理
  60. });
  61. // メディアの再生位置が変更された
  62. window.mediaElement.addEventListener('timeupdate', function() {
  63. //console.debug('######### MEDIA ELEMENT TIMEUPDATE ' + e);
  64. //(3.4)ステータスパネルの更新 ……4.
  65. window.current.innerHTML = “[現在の再生時間]”;
  66. window.progress.style.width = [進捗率]
  67. });
  68. // メディアの再生が完了した
  69. window.mediaElement.addEventListener('ended', function(e) {
  70. console.debug('######### MEDIA ELEMENT ENDED' + e);
  71. // プレーヤー停止処理など
  72. });
  73. // メディアの再生が中断した
  74. window.mediaElement.addEventListener('abort', function(e) {
  75. console.debug('######### MEDIA ELEMENT ABORT ' + e);
  76. // プレーヤー停止処理など
  77. });
  78. };
コード2 イベントハンドラーの登録