有没有人知道以恒定帧速率捕获网络摄像头视频的方法?

时间:2012-07-19 16:12:00

标签: c# webcam video-capture recording frame-rate

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

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

我看过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在观看视频和同时查看数据时发生变化。

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

2 个答案:

答案 0 :(得分:1)

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

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

第二个thread.sleep()表示 at-least 40 ms的睡眠时间完全 40 ms ..为了获得更好的结果,将等待时间减少到5 ms并且在循环中进行..使用系统时间来实际计算出你睡了多久然后进行帧捕获。

希望这有帮助

答案 1 :(得分:1)

对于大多数网络摄像头(除了极少数例外情况和高端摄像头可以很好地控制捕获过程),您无法对摄像头帧速率进行足够的控制。对于给定的操作模式,相机将以其最大帧速率捕获帧流,尤其是。由分辨率和数据带宽限制,在低水平条件下可能具有较低的速率。

没有Thread.Sleep会帮助你,因为它太慢而且没有响应 - 为了捕获25 fps,硬件需要平稳运行而不会出现任何中断和明确的指令,以便捕获下一帧现在"在另一端弹出捕获的帧时,在队列的一端推送新数据。即使使用不错的硬件,您通常也会有一些视频帧滞后。