HTML5の<video>や<audio>タグとJavaScript APIで、自由に動画や音声を楽しもう。カスタムのビデオプレイヤーだって作れる
video/audio要素は、JavaScriptを用いた細かい制御を行えるのも特徴の1つです。
カスタムのビデオプレイヤーを作ることも容易ですし、動画からフレームを切り出してCanvasに投影し、グラフィックとして取り扱う、なんてテクニックもあります。
今回は、そうしたJavaScript APIの利用方法について見ていきましょう。なお、この記事は2011年5月25日版の仕様に基づいています。
video要素とaudio要素は、メソッドやプロパティの多くが共通です。そうしたメソッドやプロパティを表すのが以下の一覧です。
video要素は、前述のものに加えて以下のようなプロパティを利用できます。
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要素に固有のAPIとしては、「Audio」コンストラクタを用いてDOMオブジェクトを作成できることがあげられます。
Audioコンストラクタは、引数に音声データのURLを取れます(省略可能)。
var audio = new Audio("http://example.com/audio.aac");
このようにして生成されたオブジェクトは、指定されたURLの音声データを自動的に読み込みます(preload属性がtrueの状態)。音声データを先読みしておく、などの用途に用いられるでしょう。
こうしたイベントを利用して、独自の動画プレイヤーに磨きをかけてみましょう。以下のサンプルは、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/)始めました!
Copyright © ITmedia, Inc. All Rights Reserved.