HTML5のvideo/audio+JavaScript APIテクニック:HTML5“とか”アプリ開発入門(11)
HTML5の<video>や<audio>タグとJavaScript APIで、自由に動画や音声を楽しもう。カスタムのビデオプレイヤーだって作れる
video/audio要素のAPIやイベントを利用する
video/audio要素は、JavaScriptを用いた細かい制御を行えるのも特徴の1つです。
カスタムのビデオプレイヤーを作ることも容易ですし、動画からフレームを切り出してCanvasに投影し、グラフィックとして取り扱う、なんてテクニックもあります。
今回は、そうしたJavaScript APIの利用方法について見ていきましょう。なお、この記事は2011年5月25日版の仕様に基づいています。
video/audioに共通のメソッド、プロパティ
video要素とaudio要素は、メソッドやプロパティの多くが共通です。そうしたメソッドやプロパティを表すのが以下の一覧です。
- MediaError error……エラーを表すオブジェクト。MediaErrorは、codeというプロパティを持ち、こちらの仕様で定義されている
- DOMString src……src属性の値
- DOMString currentSrc……現在再生中のメディアリソースのURL
- unsigned short networkState……ネットワーク状態。この値の定数は、こちらの仕様で定義されている
- DOMString preload……preload属性の値
- TimeRanges buffered……バッファ済みの範囲を表す。時間の範囲は、こちらの仕様で表されるTimeRangesインターフェイスで表される
- void load()……メディアデータのロードを行う
- DOMString canPlayType(DOMString type)……リソースのMIMEタイプを与えられると、そのリソースを再生できるかどうかを" probably"(codecsパラメータの値も参照した上で、恐らく再生可能)、""(再生できない)、"maybe"(どれにも当てはまらない)といった文字列で返す
- boolean seeking……シーク中かどうか
- double currentTime……現在の再生時間
- double initialTime……再生開始時間
- double duration……メディアの再生時間長
- Date startOffsetTime……再生が開始された時刻(NaNの場合もある)
- boolean paused……一時停止中かどうか
- double defaultPlaybackRate……デフォルトの再生速度。初期値は1.0
- double playbackRate……再生速度。初期値は1.0
- TimeRanges played……再生済みの時間の範囲を表す
- TimeRanges seekable……シーク可能な時間の範囲を表す
- boolean ended……再生が終了しているかどうか
- boolean autoplay……autoplay属性の値
- boolean loop……loop属性の値
- void play()……再生を開始する
- void pause()……一時停止する
- DOMString mediaGroup……mediagroup属性の値
- MediaController controller……複数のメディアを同期させて操作することができるコントローラ。mediagroup属性の値が同じメディアデータが、同じコントローラを共有する。コントローラを明示的に作成して、プロパティにセットすることも可能
- boolean controls……controls属性の値(ブラウザデフォルトのコントローラを使用するかどうか)
- double volume……音声のボリューム。0.0から1.0の間
- boolean muted……muted属性の値
- boolean defaultMuted……デフォルトでミュートされていたかどうか
- MultiplaTrackList audioTracks……音声トラックの情報。複数トラックを切り替えたり、有効/無効にすることが可能
- ExclusiveTrackList videoTracks……動画トラックの情報。複数トラックを切り替えることが可能
- TextTrack[] textTracks……テキストトラックの情報(字幕やチャプタータイトルなど)
- MutableTextTrack addTextTrack(DOMString kind, DOMString label, DOMString language)……テキストトラックを追加する
video要素に固有のメソッド、プロパティ
video要素は、前述のものに加えて以下のようなプロパティを利用できます。
- unsigned long width……動画の幅
- unsigned long height……動画の高さ
- unsigned long videoWidth……再生中の動画のもともとの幅
- unsigned long videoHeight……再生中の動画のもともとの高さ
- DOMString poster……poster属性の値
document.getElementById()などで要素のDOMオブジェクトを取得すれば、こうしたメソッドやプロパティを利用できます。
例えば、JavaScriptを用いて動画の再生、停止を行うには、以下のようなコードを記述します。
<<!DOCTYPE html> <meta charset="UTF-8"> <script> function playVideo() { var video = document.getElementById("v"); video.play(); // ビデオの再生 } function pauseVideo() { var video = document.getElementById("v"); video.pause(); // ビデオの一時停止 } </script> <video id="v" width="400"> <source src="http://download.blender.org/peach/trailer/trailer_480p.mov"> <source type="video/ogg" src="http://download.blender.org/peach/trailer/trailer_400p.ogg"> </video><br> <button onclick="playVideo();">再生</button> <button onclick="pauseVideo();">停止</button>
上記のコードでは、play()やpause()といったメソッドを用いて、動画の制御を行っています。
audio要素に固有のメソッド、プロパティ
audio要素に固有のAPIとしては、「Audio」コンストラクタを用いてDOMオブジェクトを作成できることがあげられます。
Audioコンストラクタは、引数に音声データのURLを取れます(省略可能)。
var audio = new Audio("http://example.com/audio.aac");
このようにして生成されたオブジェクトは、指定されたURLの音声データを自動的に読み込みます(preload属性がtrueの状態)。音声データを先読みしておく、などの用途に用いられるでしょう。
メディアデータの再生に伴うイベント
- emptied……要素が初期化された際に発生するイベント
- loadstart……データの読み込みを開始した
- progress……データの読み込み中(断続的に何度も発生する)
- loadedmetadata……メディアのメタデータ(再生時間、動画の幅や高さなど)を読み込んだ
- loadeddata……メディアデータを読み込んだ
- canplay……再生を開始できる(程度にデータを読み込んだ)
- canplaythrough……このままのダウンロード速度が続けば、最後まで再生できる(程度にデータを読み込んだ)
- load……データのダウンロードが完了した
- stalled……データのダウンロードが意図せず中断された
- suspend……データのダウンロードが中断された(エラーではない)
- abort……データのダウンロードがエラーにより中止された
- error……エラーが発生した
- loadend……データの読み込みが(理由はどうあれ)完了した。load、abort、error後に発生する
- playing……一時停止やネットワーク遅延から復帰し、再生が再開された
- waiting……次のフレームを描画するためのデータ待ち
- seeking……シーク中
- seeked……シークが完了した
- ended……再生が完了した
- durationchange……duration属性の値が変更された
- timeupdate……再生位置が変更された
- play……再生が開始された
- pause……再生が一時停止された
- ratechange……再生速度が変更された
- volumechange……ボリュームが変更された
こうしたイベントを利用して、独自の動画プレイヤーに磨きをかけてみましょう。以下のサンプルは、rangeタイプの入力フィールドを利用して、動画の再生位置を制御できるようにしたものです。
動画の再生位置が進むに従い、スライダーの位置が変化します。スライダーの位置を変更すると、動画の再生位置もそれに合わせて変化します。
<!DOCTYPE html> <meta charset="UTF-8"> <!-- ビデオ --> <video id="v" width="400"> <source src="http://download.blender.org/peach/trailer/trailer_480p.mov"> <source type="video/ogg" src="http://download.blender.org/peach/trailer/trailer_400p.ogg"> </video> <!-- メディアプレイヤー --> <div id="controller"> <button id="playOrPauseButton">再生</button> <button id="stopButton">停止</button> <input type="range" id="playback" disabled> </div> <script> // ビデオ要素 var video = document.getElementById("v"); // 現在の再生位置を示すバー var playback = document.getElementById("playback"); // 再生/中断ボタン var playOrPauseButton = document.getElementById("playOrPauseButton"); // 停止ボタン var stopButton = document.getElementById("stopButton"); // ビデオのメタデータを読み込んだら、スライダーを利用可能にする video.addEventListener("loadedmetadata", function() { playback.disabled = false; playback.min = playback.value = video.initialTime || 0; playback.max = video.duration; }, false); // 再生が開始されたら、ボタンのラベルを変更 video.addEventListener("play", function() { playOrPauseButton.textContent = "中断"; }, false); // 一時中断されたら、ボタンのラベルを変更 video.addEventListener("pause", function() { playOrPauseButton.textContent = "再生"; }, false); // 再生時間が変化するたび、スライダーの位置を更新 video.addEventListener("timeupdate", function() { playback.value = video.currentTime; }, false); // スライダーの値が変化したら、動画の再生位置を変更 playback.addEventListener("change", function() { video.currentTime = this.valueAsNumber; }, false); // 再生/中断ボタンを押された playOrPauseButton.addEventListener("click", function() { if (video.paused) { video.play(); } else { video.pause(); } }, false); // 終了ボタンをクリックされたら、ビデオを一時停止し、 // 再生位置を初期に戻す stopButton.addEventListener("click", function() { video.pause(); video.currentTime = video.initialTime || 0; }, false); </script>
まとめ
今回はvideo/audio要素のAPIやイベントを利用する方法についてお話ししました。次回以降は、HTML5仕様の外で策定が進みつつある、マルチメディア関連のAPIについて順次解説していく予定です。
著者紹介
株式会社オープンウェブ・テクノロジー 代表
白石俊平(@Shumpei)
Google API Expert(HTML5)
HTML5開発者コミュニティ「html5-developers-jp」管理人
最近は、「テクノロジーを社会貢献に活かしつつビジネスにする」ことを目指しつつ、日々奮闘中。「社会貢献×テクノロジー」をテーマにしたブログ「GOODxTech Blog」(http://blogs.itmedia.co.jp/goodxtech/)始めました!
- HTML5のvideo/audio+JavaScript APIテクニック
- video/audio要素 HTML5で動画や音声を利用しよう!
- フォーム関連要素(終) HTML5で仕様になった入力値チェック+便利な3Tips
- フォーム関連要素(3) サイトのフォームを多機能にするHTML5の新要素5選
- フォーム関連要素(2) HTML5でinput要素に追加された新しいタイプ13連発
- フォーム関連要素(1) HTML5で既存のinputタイプに加わった6つの変更点
- (文書構造編:後編)HTML5 Outlinerで文書の“アウトライン”を確認する
- (文書構造編:前編)HTML5のセクションで“文書構造”を理解する
- HTML5の登場で、XHTMLは結局どうなったの?
- HTML5でWebページをマークアップするための基礎知識
- Webの3つの問題を解決する「HTML5」とは何なのか
Copyright © ITmedia, Inc. All Rights Reserved.