1

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

我一直在使用 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 在他们同时观看视频和查看数据时发生变化。

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

4

2 回答 2

1

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

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

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

希望这可以帮助

于 2012-07-19T16:17:58.213 回答
1

对于大多数网络摄像头(除了极少数例外和可以为您提供对捕获过程的精细控制的高端摄像头),您对摄像头帧速率没有足够的控制权。对于给定的操作模式,相机将以最大帧速率捕获帧流,尤其是。受限于分辨率和数据带宽,在低电平条件下可能会降低速率。

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

于 2012-07-19T16:58:33.480 回答