【发布时间】:2017-11-01 23:45:44
【问题描述】:
我正在尝试构建一个从 JavaScript 视频中提取帧的函数。这是我想出的代码。该函数接收源和回调。从那里,我用源创建一个视频,我想在画布中以设定的间隔绘制视频的帧。
很遗憾,返回的帧都是透明图片。
我尝试了一些不同的方法,但无法成功。有人可以帮忙吗? 谢谢。
const extractFramesFromVideo = function(src, callback) {
var video = document.createElement('video');
video.src = src;
video.addEventListener('loadeddata', function() {
var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');
canvas.setAttribute('width', video.videoWidth);
canvas.setAttribute('height', video.videoHeight);
var frames = [];
var fps = 1; // Frames per seconds to
var interval = 1 / fps; // Frame interval
var maxDuration = 10; // 10 seconds max duration
var currentTime = 0; // Start at 0
while (currentTime < maxDuration) {
video.currentTime = currentTime;
context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
var base64ImageData = canvas.toDataURL();
frames.push(base64ImageData);
currentTime += interval;
if (currentTime >= maxDuration) {
console.log(frames);
callback(frames);
}
}
});
}
export default extractFramesFromVideo;
【问题讨论】:
-
如果我将
context.drawImage移到 while 之外,它会绘制第一帧。 -
我认为这个问题是在更改
video.currentTime之后,您实际上需要等待视频搜索到该位置并更新帧数据,然后您才能提取它。它可能需要下载一些数据,所以它不是同步的。loadeddata事件仅表示第一帧已下载(至少)。我认为,在更改currentTime之后,您需要等待seeked事件。
标签: javascript video canvas frame