2010-02-25
■[html5][javascript] html5で videoの任意のフレームをcanvasに描画するメモ
デブサミ2010のhtml5セッションで見たデモ(Movement tracker)*1 が、
衝撃的だったので video x canvas をちょっと勉強した。
1.videoの任意のフレームをそのままcanvasに描画させてみる
<video id="v" src="video.ogv" autobuffer controls></video> <canvas id="c"></canvas> <input type="button" value="copy frame" onclick="copyFrame()" />
copy frameボタンで呼び出されるjavascriptはこんな感じ。
function copyFrame() { var cEle = document.getElementById('c'); var cCtx = cEle.getContext('2d'); var vEle = document.getElementById('v'); cEle.width = vEle.videoWidth; // canvasの幅と高さを、動画の幅と高さに合わせる cEle.height = vEle.videoHeight; cCtx.drawImage(vEle, 0, 0); // canvasに関数実行時の動画のフレームを描画 }
これで、動画再生させながらcopy frameボタンをポチポチすると、
とっても簡単。
2.videoから取得したフレームの情報をいじってみる
単純なグレースケール化をしてみる。
htmlはそのまま。
javascriptにちょっとだけコードを追加。
function copyFrame() { var cEle = document.getElementById('c'); var cCtx = cEle.getContext('2d'); var vEle = document.getElementById('v'); cEle.width = vEle.videoWidth; cEle.height = vEle.videoHeight; cCtx.drawImage(vEle, 0, 0); // ここから下を追加 var imgdata = cCtx.getImageData(0, 0, vEle.videoWidth, vEle.videoHeight); // pixelデータを取得 for (var i=0; i<imgdata.data.length; i+=4) { // imgdata.data: [R,G,B,alpha,R,G,B,alpha...] var gray = (imgdata.data[i] + imgdata.data[i+1] + imgdata.data[i+2]) / 3; // グレースケール値計算 imgdata.data[i] = imgdata.data[i+1] = imgdata.data[i+2] = gray; // RGB imgdata.data[i+3] = 255; // alpha } cCtx.putImageData(imgdata, 0, 0); // 描画 }
これでcanvasに描画されるフレームが、グレースケールに。
drawImage()せずに、直接videoからpixelデータを取得したかったけど、
それっぽいメソッドが見つからなかったorz
各メソッドなどの詳細は、Canvasリファレンス - HTML5.JP を参照。
トラックバック - http://d.hatena.ne.jp/favril/20100225/1267099197
リンク元
- 331 http://d.hatena.ne.jp/yanagia/20100226/1267193521
- 82 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cts=1331084776882&ved=0CDIQFjAA&url=http://d.hatena.ne.jp/favril/20100225/1267099197&ei=5L1WT9vVGYT5mAXqtY3kCQ&usg=AFQjCNGEW31tCZYvNfkhD9I9uDexU9cPAg&sig2=ZbQ52iSesd7NYIV8V0ukRg
- 41 http://www.google.co.jp/url?sa=t&rct=j&q=html5 canvas video&source=web&cd=1&sqi=2&ved=0CCcQFjAA&url=http://d.hatena.ne.jp/favril/20100225/1267099197&ei=XWXETs_RIvD2mAXc8NyQCw&usg=AFQjCNGEW31tCZYvNfkhD9I9uDexU9cPAg
- 36 http://d.hatena.ne.jp/efcl/20100226/1267139645
- 29 http://www.google.co.jp/url?sa=t&rct=j&q=html5 canvas ?????? &source=web&cd=3&sqi=2&ved=0CEUQFjAC&url=http://d.hatena.ne.jp/favril/20100225/1267099197&ei=3BGlTrf8D4OimQWQzrnFAQ&usg=AFQjCNGEW31tCZYvNfkhD9I9uDexU9cPAg&sig2=XaGY
- 28 http://d.hatena.ne.jp/yanagia/
- 26 http://reader.livedoor.com/reader/
- 25 http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=html5+canvas+video
- 23 http://www.google.co.jp/search?aq=f&sourceid=chrome&ie=UTF-8&q=html5+video
- 23 http://www.google.co.jp/url?sa=t&rct=j&q=canvas video&source=web&cd=1&ved=0CCoQFjAA&url=http://d.hatena.ne.jp/favril/20100225/1267099197&ei=V9CfTq6JNMOJrAeOurD-Ag&usg=AFQjCNGEW31tCZYvNfkhD9I9uDexU9cPAg&sig2=C5TGCm-5YqOlOpLqMmn7-w&cad=rja