我想每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驱动程序完成