使用HTML5和JavaScript从视频捕获帧

林:

我想每5秒从视频中捕获一帧。

这是我的JavaScript代码:

video.addEventListener('loadeddata', function() {
    var duration = video.duration;
    var i = 0;

    var interval = setInterval(function() {
        video.currentTime = i;
        generateThumbnail(i);
        i = i+5;
        if (i > duration) clearInterval(interval);
    }, 300);
});

function generateThumbnail(i) {     
    //generate thumbnail URL data
    var context = thecanvas.getContext('2d');
    context.drawImage(video, 0, 0, 220, 150);
    var dataURL = thecanvas.toDataURL();

    //create img
    var img = document.createElement('img');
    img.setAttribute('src', dataURL);

    //append img in container div
    document.getElementById('thumbnailContainer').appendChild(img);
}

我的问题是,第一次生成的两个图像是相同的,而持续时间为5秒的图像却没有生成。我发现缩略图是在< video>标记中显示特定时间的视频帧之前生成的

例如,当时video.currentTime = 5,生成帧0s的图像。然后视频帧跳到时间5s。因此,当时video.currentTime = 10,将生成帧5s的图像。

用户1693593:

原因

问题在于(通过设置currentTime查找视频是异步的。

您需要收听seeked事件,否则可能会冒实际的当前帧的风险,这很可能是您的旧值。

由于它是异步的,因此您也不能使用,setInterval()因为它也是异步的,并且当寻求下一帧时,您将无法正确同步。无需使用,setInterval()因为我们将利用seeked事件来代替,这将使所有内容保持同步。

通过稍微重写代码,您可以使用该seeked事件来遍历视频以捕获正确的帧,因为此事件可确保我们实际上位于通过设置该currentTime属性所请求的帧

// global or parent scope of handlers
var video = document.getElementById("video"); // added for clarity: this is needed
var i = 0;

video.addEventListener('loadeddata', function() {
    this.currentTime = i;
});

将此事件处理程序添加到聚会中:

video.addEventListener('seeked', function() {

    // now video has seeked and current frames will show
    // at the time as we expect
    generateThumbnail(i);

    // when frame is captured increase, here by 5 seconds
    i += 5;

    // if we are not passed end, seek to next interval
    if (i <= this.duration) {
        // this will trigger another seeked event
        this.currentTime = i;
    }
    else {
        // Done!, next action
    }
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用HTML5和iPad捕获签名

获取HTML5视频中的帧号

HTML5捕获暂停的视频流的图像并保存

如何使用JavaScript和HTML5播放器更改当前正在播放的YouTube视频的播放速度?

HTML5视频/音频播放器控件可使用AngularJS播放和暂停

在html5画布上逐帧绘制视频并使用滑块进行控制

HTML5和JavaScript中的视频音量滑块

使用Javascript下载HTML5 mp4视频

HTML5视频帧准确

使用HTML5 canvas和Javascript显示多帧dicom图像

HTML5视频未捕获的TypeError:.play不是函数

使用JavaScript获取HTML5视频的宽度和高度?

HTML和JavaScript-无法取消html5视频的静音

如何使用javascript缓冲/预加载html5视频

如何使用HTML5 WebRTC录制和保存视频

使用NODE.JS和html5的低延迟(50ms)视频流

使用jQuery和in-view.js自动播放/暂停HTML5视频

如何使用HTML5和Jquery从视频中捕获缩略图(帧)?

使用HTML5或Javascript的P2P视频冲突

无法使用JavaScript在HTML4中获取HTML5视频ID?

如何使用html5和javascript创建变量步骤

使用JavaScript / HTML5嵌入来自http://api.liveviewtech.com的在线视频

使用HTML5和javascript在全屏播放器而非背景全屏模式下自动播放视频

将html5视频设置为特定的帧

html5 getusermedia()捕获没有ssl的视频

使用 Jquery(Html5 视频元素)恢复视频

带有 html5 视频和 javascript 注入的 c# WPF 浏览器

如何使用 HTML5 和 Javascript 读取 Firebase 数据?

使用 lightgallery 创建图像和 html5 视频的单个幻灯片