当前位置: 首页 > 面试题库 >

使用HTML5和JavaScript从视频捕获帧

陶瀚玥
2023-03-14
问题内容

我想每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的图像。


问题答案:

原因

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

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

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

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

// 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
    }
});


 类似资料:
  • 问题内容: 我试着看看是否有办法用HTML5录制音频无济于事。但没有用。我猜他在说尚无任何浏览器支持时,确实是真的。 我想念什么吗?也许已经有可能?在基于浏览器的应用程序上录制音频有哪些选择? 请只开放源代码:) 问题答案: 你可能想看看HTML媒体捕获和它的API。 (注意:请注意,设备元素和相关的API在任何浏览器中均不可用,并且这些API可能会在此之前发生变化。)但是,它为您提供了一个大概的

  • 我尝试用全高清分辨率的罗技C920摄像头捕捉视频。它提供30 fps与此分辨率。 它以30 fps的速度与windows摄像头应用程序配合使用,但无论我如何尝试,我都无法通过opencv videoCapture获得这种fps速度。 注意:我使用windows 10和vs15。我尝试了不同的usb端口,opencv版本和编解码器。结果是相同的,〜5 fps。 我测量fps忽略前10帧。下面是我的计

  • 如果您要为屏幕共享,语音备忘录等构建应用程序,音频和视频捕获是重要的特性。如果您需要应用程序来捕获配置文件图片,它们也很有用。 我们将使用getUserMedia HTML5 API通过Electron捕获音频和视频流。 让我们首先在main.js文件中设置我们的主进程,如下所示 - const {app, BrowserWindow} = require('electron') const ur

  • 我试图从谷歌驱动器流200MB视频文件。我已经尝试嵌入一个24MB的文件,共享给每个人,这工作: 当我在浏览器中正常导航到这个网址时,会显示一个我必须接受的安全请求。我相信这就是问题所在,因为它阻止了下载。也许我在URL中丢失了一些参数?我如何流较大的文件没有谷歌驱动器阻止请求?

  • function checkVideo() { if(!!document.createElement('video').canPlayType) { var vidTest=document.createElement("video"); oggTest=vidTest.canPlayType('video/ogg; codecs="theora, vorbis"'); if (!oggTest

  • 硬件: 1.树莓派2 2.树莓派相机 软件: 1。OpenCV 2.4。11 2。用C语言编程 我有以下简单的代码,可以从摄像机捕获视频并在窗口中显示 帧大小始终为640 x 480,尝试更改帧的宽度和高度(如注释行所示)没有帮助,并且保持为640 x 480。 我正在寻找一种方法,将帧的宽度和高度从我的代码(而不是外壳)更改为1920 x 1080 如果可以通过OpenCV或V4l2驱动程序完成