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.