canvasに動画を表示し、毎秒15フレームのデータを切り出したいです。
video elementのcurrentTimeに時間を代入->描画->データ取得
という流れでコードを書きました。以下のコードは一応動作するのですが、下から7行目で1ミリ秒待っています。
この部分が無いとcanvasに描画されないのですが、ここで待たなければいけない理由がわかりません。ctx.drawImage()は、非同期実行なのでしょうか。そうだとすれば、どのようなイベントで描画が完了したことがわかりますでしょうか。
JavaScript
1const width = 800; 2const height = 600; 3 4const canvas = document.getElementsByTagName("canvas")[0]; 5const ctx = canvas.getContext("2d"); 6canvas.setAttribute("width", width); 7canvas.setAttribute("height", height); 8 9const videoElement = document.createElement("video"); 10videoElement.src = "../video.mp4"; 11 12 13const awaitForTimeupdate = (target) => { 14 return new Promise(resolve => { 15 const listener = resolve; 16 target.addEventListener("timeupdate", listener); 17 }); 18}; 19 20 21async function wait(millisec) { 22 await new Promise(resolve => setTimeout(resolve, millisec)); 23} 24 25// 毎秒15フレーム 26const FPS = 15; 27const Frames = 100;//100フレーム取る 28let nowTime = 0; 29 30 31async function start(){ 32 33 for (let i = 0; i < Frames; i++) { 34 await drawFrame(); 35 //取得したデータ 36 console.log(ctx.getImageData(0, 0, canvas.width, canvas.height).data); 37 38 //nowTimeのアップデート 39 nowTime = (i / FPS)*1000;//[ms] 40 } 41 42 43 async function drawFrame(){ 44 ctx.clearRect(0,0,canvas.width,canvas.height); 45 46 //currentTimeに代入 47 videoElement.currentTime = nowTime/1000; 48 49 await awaitForTimeupdate(videoElement); 50 51 ctx.drawImage(videoElement, 0,0,canvas.width,canvas.height); 52 53 //ここです 54 await wait(1); 55 } 56} 57 58document.querySelector("#start").addEventListener("click",()=>{ 59 start(); 60}); 61
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/04 03:18
2021/12/04 03:29