プラグインは要らない!音声/動画対応したHTML5 - <audio>/<video>要素
TIPS 050:音声/動画ファイルの状態に応じて処理を実行する
HTMLAudioElement/HTMLVideoElementオブジェクトには、さまざまなイベントが用意されています。これらイベントを利用することで、音声/動画再生の状況に応じた処理を実施できます。
たとえば以下は、動画の再生/停止時にページ先頭に[再生中]というメッセージを表示/非表示する例です。
[リスト10]動画の再生/停止時にメッセージを表示するコード(event.html)
window.addEventListener('DOMContentLoaded', function() { var mark = document.querySelector('#mark'); var v = document.querySelector('#v'); // 再生開始時にメッセージを表示 v.addEventListener('play', function (e) { mark.style.display = 'block'; }); // 停止時にメッセージを非表示 v.addEventListener('pause', function (e) { mark.style.display = 'none'; }); } ); ...中略... <div id="mark" style="background-color:Yellow">再 生 中</div> <video id="v" src="./video/sample.ogv" controls autoplay width="320" height="180"></video>
HTMLAudioElement/HTMLVideoElementオブジェクトで利用できる再生関連のイベントには、以下のようなものがあります。
表10:再生関連のイベント
イベント | 発生タイミング |
---|---|
loadstart | データの読み込みを開始した |
progress | データの読み込み中 |
loadmetadata | メタデータの読み込みが完了した |
loadeddata | 現在の再生位置で読み込みを完了した |
load | データの読み込みを完了した |
canplay | 再生を開始可能になった |
canplaythrough | 最後まで再生可能になったと判断した |
play | 再生を開始した |
playing | 再生中 |
timeupdate | 再生位置が変更された |
pause | 再生を停止した |
サンプルでは、この中からplay/pauseイベントを利用して、再生開始/一時停止時に[再生中]メッセージの表示/非表示を切り替えています。
その他、たとえばprogress/loadイベントを利用してデータの読み込み状況を表示したり、timeupdateイベントを利用することで、現在の再生時間(秒数)を取得し、スライダーやプログレスバーに表示するなどの効果を演出することもできるでしょう。
TIPS 051:音声/動画ファイル再生時のエラーを処理する
HTMLAudioElement/HTMLVideoElementオブジェクトのerrorイベントを利用することで、音声/動画ファイルのダウンロード時のエラーを検知することもできます。
たとえば以下は、ダウンロードエラー時にエラーメッセージを表示する例です。
[リスト11]
window.addEventListener('DOMContentLoaded', function() { if (HTMLVideoElement) { var v = document.querySelector('#v'); var err = document.querySelector('#error'); // エラー発生時の処理を定義 v.addEventListener('error', function (e) { // エラーメッセージを配列で管理(1) var msg = [ '', 'ファイルの取得が中断されました。', 'ネットワークエラーです。', 'ファイルをデコードできませんでした。', 'ファイルを再生できません。' ]; // 対応するメッセージを表示(2) err.innerHTML = msg[v.error.code]; }); } } ); ...中略... <div id="error"></div> <video id="v" src="./video/sample2.mp4" width="320" height="180"></video>
errorイベントリスナでエラーの種類を識別するには、イベントオブジェクトのerrorプロパティを利用します。errorプロパティの戻り値は、以下のとおりです。
表11:codeプロパティの戻り値
戻り値 | 値 | 概要 |
---|---|---|
MEDIA_ERR_ABORTED | 1 | ユーザによってダウンロードが中止された |
MEDIA_ERR_NETWORK | 2 | ネットワークエラー |
MEDIA_ERR_DECODE | 3 | データのデコードに失敗 |
MEDIA_ERR_SRC_NOT_SUPPORTED | 4 | ファイル指定が不適切/未サポート |
サンプルでは、あらかじめエラーメッセージを配列msgとして用意しておきます(1)。こうしておくことで、あとは(2)のように「msg[v.error.code]」とするだけでエラーコードに対応するメッセージを取得できるというわけです(たとえばエラーコードが1であれば、msg[1]がエラーメッセージとなります)。
TIPS 052:音声/動画に対するユーザの操作を検出する
音声/動画ファイルに対するユーザの操作に応じて、処理を実行してみましょう。
たとえば以下は、ボリューム/再生速度を変更した時に、現在の値をラベル表示する例です。ボリューム/再生速度そのものを変更する方法については、TIPS 046を参照してください。
[リスト12]ボリューム/再生速度の現在値を表示するコード(ope.html)
window.addEventListener('DOMContentLoaded', function() { if (HTMLVideoElement) { var v = document.querySelector('#v'); var vol = document.querySelector('#vol'); var mute = document.querySelector('#mute'); var speed = document.querySelector('#speed'); ...中略... // ボリューム変更時に、現在のボリューム表示を更新 v.addEventListener('volumechange', function (e) { document.querySelector('#vol_v').innerHTML = vol.value; }); // 再生速度の変更時に、現在の再生速度表示を更新 v.addEventListener('ratechange', function (e) { document.querySelector('#speed_v').innerHTML = speed.value; }); } } ); ...中略... <video id="v" src="./video/sample.ogv" autoplay loop width="320" height="180"></video> <div> 音量:<input id="vol" type="range" min="0" max="1" step="0.01" value="1" /> <span id="vol_v">1</span> (ミュート<input id="mute" type="checkbox" />)<br /> 速度:<input id="speed" type="range" min="0" max="2" step="0.01" value="1" /> <span id="speed_v">1</span>
HTMLAudioElement/HTMLVideoElementオブジェクトでユーザの操作に関わるイベントには、以下のようなものがあります。
表12:ユーザ操作に関わるイベント
イベント | 発生タイミング |
---|---|
volumechange | ボリュームが変更された時 |
ratechange | 再生速度が変更された時 |
seeking | 再生位置への移動中 |
seeked | 再生位置への移動が完了した時 |
サンプルでは、このうちvolumechange/ratechangeイベントを利用して、ボリュームと再生速度が変更されたら、現在のボリューム値、速度を表示しています。
<audio>、<video>要素を使ってブラウザだけで音声/動画を再生するサンプル
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- JavaScriptでローカルファイルを自在に操る- File API
- 動画・音声のブラウザ対応状況、canvasによる描画
- スマホアプリ開発にも便利な位置情報API- Geolocation API-
- デスクトップアプリライクな操作性を実現するドラッグ&ドロップAPI
- HTML+JavaScriptだけでブラウザに図形描画(3)- Canvas API-
- クッキーより便利になったブラウザ標準ストレージ- Web Storage
- HTML+JavaScriptだけでブラウザに図形描画(2)- Canvas API-
- HTML+JavaScriptだけでブラウザに図形描画- Canvas API-
- 「TAURI」で「丸アートお絵描き」アプリを作ろう
- HTML5のドラッグ&ドロップAPI、File API、Web Storage