動画をcanvasで再生する[HTML5]
HTML5のcanvasで「MPEG-4/H.264(mp4)、WebM(webm)、Ogg Theora(ogv)」の動画を再生する方法です。
canvasで再生といっても、実際はvideoタグで再生している最中に動画の画像を抽出してcanvasに描画する手法となります。
サンプルコードの実行イメージ
サンプルコード
動画を読み込んだ時点で、動画をvideoタグとcanvasの両方で再生します。停止する場合は停止ボタンか、F5でリロードして下さい。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script>
// ビデオ
var src_video;
// キャンバス
var src_canvas;
var src_ctx;
// タイマーのID
var interval_id ;
window.onload = function(){
src_canvas = document.getElementById("SrcCanvas");
src_ctx = src_canvas.getContext("2d");
src_video = document.getElementById("SrcVideo");
}
// 停止
function stopMovie(){
src_video.loop=false;
src_video.pause();
clearInterval(interval_id);
}
// タイマーイベント
function onNotify(){
src_ctx.drawImage(src_video,0,0,src_video.width,src_video.height);
}
// ユーザーによりファイルが追加された
function onAddFile(event) {
var files;
var filename;
if(event.target.files){
files = event.target.files;
}else{
files = event.dataTransfer.files;
}
if (files[0] != undefined){
filename = files[0].name;
// 拡張子の取得
var ext = filename.split('.');
ext = ext[ext.length-1].toUpperCase();
// 動画が再生できる状態になった時
src_video.onloadeddata = function(){
// 最大横幅を640にする
var size = 640;
if(src_video.videoWidth > size){
var aspectratio = src_video.videoWidth / size;
var another = Math.round(src_video.videoHeight / aspectratio);
src_video.width = size;
src_video.height = another;
}else{
src_video.width = src_video.videoWidth;
src_video.height = src_video.videoHeight;;
}
src_canvas.width = src_video.width;
src_canvas.height = src_video.height;
// タイマー発動(60fps)
interval_id = setInterval(onNotify,1000 / 60);
// 再生
src_video.play();
};
src_video.onerror = function(e){
alert('このファイルは読み込めません。');
};
// 以前のURLオブジェクトを削除する
if(src_video.src){
src_video.pause();
window.URL.revokeObjectURL(src_video.src) ;
}
// MIMEを指定して動画を読み込む
var mime = "video/mp4";
if(ext == "WEBM"){
mime = "video/webm";
}else if (ext == "OGG" || ext == "OGX" || ext == "OGV"){
mime = "video/ogg";
}
src_video.src = URL.createObjectURL(new Blob([files[0]], { type: mime }));
}
document.getElementById("inputfile").value = '';
}
</script>
</head>
<body>
<h4>画像の読み込み</h4>
<p></p>
<input type="file" id="inputfile" accept="video/mp4,video/webm,video/ogg" onchange="onAddFile(event);">
<p><button onclick="stopMovie(); ">停止</button></p>
<h4>videoタグで再生</h4>
<video id="SrcVideo"></video>
<h4>canvasで再生</h4>
<canvas id="SrcCanvas"></canvas>
<p></p>
</body>
</html>
基本的なコードの流れはsetIntervalでタイマーを発動させて、フレームレート「60fps」の間隔でvideoから静止画像を取得してcanvasへ描画しています。
これを応用するとニコニコ動画のように動画を再生しながら、コメントを表示する事や動画に対してもエフェクト処理などを行う事も可能です。
私はとりあえず、以下の2つを作ってみました。
| アプリ名 | 内容 |
|---|---|
| 動画の画像変換 | ブラウザで動画ファイルを静止画像へ変換する。 |
| 動画のGIFアニメ変換 | ブラウザで動画ファイルをGIFアニメへ変換する。 |
各ブラウザの動画ファイルの対応表
| H.264(mp4) | WebM(webm) | Ogg Theora(ogv) | |
|---|---|---|---|
| Internet Explorer 11 | 対応 | プラグインが必要 | - |
| Edge | 対応 | 2016年夏 対応予定 | - |
| Chrome | 対応 | 対応 | 対応 |
| FireFox | 対応 | 対応 | 対応 |
| Opera | 対応 | 対応 | 対応 |
| Safari | 対応 | - | - |
スポンサーリンク
関連記事
公開日:2016年05月17日
記事NO:01961
プチモンテ ※この記事を書いた人
![]() | |
![]() | 💻 ITスキル・経験 サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。 画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ |
| 🎵 音楽制作 BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は抒情詩、抒情的な楽曲が多い。楽曲制作は🔰2023年12月中旬 ~ | |









