以恒定帧速率捕获网络摄像头视频的方法?

Posted

技术标签:

【中文标题】以恒定帧速率捕获网络摄像头视频的方法?【英文标题】:Does anyone know a way to capture webcam video at a constant framerate?有谁知道 【发布时间】:2012-07-19 16:11:59 【问题描述】:

好的,所以我在网络摄像头捕捉方面遇到了一些困难,我需要帮助来找到以一致的帧速率捕捉视频的方法。

我一直在使用 Aforge.AVIWriter 和 Aforge.VideoFileWriter,但无济于事,并且还在 Google 中输入了我能想到的任何相关短语。

我查看了 DirectShowLib,但还没有发现它更准确。

视频必须具有至少 25fps 的最低帧速率,并且还应与同时收集的其他数据同步显示。

我也试过无限循环:

        for (; ; )
        
            if (recvid == false)
            
                break;
            
            if (writer.IsOpen)
            
                Bitmap image = (Bitmap)videoSourcePlayer1.GetCurrentVideoFrame();
                if (image != null)
                
                    writer.WriteVideoFrame(image);
                
                Thread.Sleep(40);
            


        

尽管这对于计时来说更准确,但用户可以在他们同时观看视频和查看数据时看到 fps 的变化。

任何指针或提示将不胜感激,因为我想不出从这里开始的方法。

【问题讨论】:

【参考方案1】:

我可以看到的两个主要问题:

writer.write() 它发生在一个单独的线程中吗?如果不是,则需要时间,因此时间可能不准确。

second thread.sleep() 表示睡眠 至少 40 毫秒而不是完全 40 毫秒。为了获得更好的结果,将等待时间减少到 5 毫秒,并且循环执行..使用系统时间来实际计算出您睡了多长时间,然后进行帧捕获。

希望对你有帮助

【讨论】:

基本上你想最小化这个线程在每次睡眠之间完成的计算,并确保睡眠是准确的......每次你进入睡眠状态和从睡眠状态出来时以毫秒为单位打印系统时间。 . 可能不会相差 40 毫秒 好吧,我认为任何人都可以做到这一点,谢谢。我一直在寻找一种同步视频的方法,我能找到的最好的方法是使用具有 TimeStamp 属性的 Aforges VideoFileWriter,我在搜索时没有注意到这一点,但它似乎是我能找到的最接近的找到并且似乎大部分都保持在 200 毫秒内【参考方案2】:

对于大多数网络摄像头(可能是极少数例外情况和可让您对捕捉过程进行精细控制的高端摄像头),您无法充分控制摄像头帧速率。对于给定的操作模式,相机将以最大帧速率捕获帧流,尤其是。受限于分辨率和数据带宽,在低电平条件下可能会降低速率。

Thread.Sleep 不会在这方面为您提供帮助,因为它太慢且反应迟钝 - 为了捕获 25 fps,硬件需要平稳运行而没有任何中断和“立即捕获下一帧”推送新数据的明确指令在队列的一端,您在另一端弹出捕获的帧。即使硬件不错,您通常也会延迟几个视频帧。

【讨论】:

以上是关于以恒定帧速率捕获网络摄像头视频的方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用小程序从 Java 中的网络摄像头捕获视频?

如何使用 c++ 使用 v4l2 API 连续捕获 h264 视频?

OpenCv - 从网络摄像头捕获帧时发生内存泄漏

Opencv/c++ - 在线程中录制实时视频,在另一个线程中处理图像?

将网络摄像头中的帧捕获为位图 - VFW - WINAPI

从网络摄像头捕获帧,它在 opencv cv2.VideoCapture() 中仅返回 1 帧