好的,所以我在网络摄像头捕获方面遇到了一些困难,并且需要帮助才能找到以一致的帧速率捕获视频的方法。
我一直在使用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在观看视频和同时查看数据时发生变化。
任何指针或提示都会非常感激,因为我想不出从这里开始的方法。
答案 0 :(得分:1)
我可以看到两个主要问题:
writer.write()它是在一个单独的线程中发生的吗?如果不是,则需要时间,因此时间可能不准确。
第二个thread.sleep()表示 at-least 40 ms的睡眠时间完全 40 ms ..为了获得更好的结果,将等待时间减少到5 ms并且在循环中进行..使用系统时间来实际计算出你睡了多久然后进行帧捕获。
希望这有帮助
答案 1 :(得分:1)
对于大多数网络摄像头(除了极少数例外情况和高端摄像头可以很好地控制捕获过程),您无法对摄像头帧速率进行足够的控制。对于给定的操作模式,相机将以其最大帧速率捕获帧流,尤其是。由分辨率和数据带宽限制,在低水平条件下可能具有较低的速率。
没有Thread.Sleep
会帮助你,因为它太慢而且没有响应 - 为了捕获25 fps,硬件需要平稳运行而不会出现任何中断和明确的指令,以便捕获下一帧现在"在另一端弹出捕获的帧时,在队列的一端推送新数据。即使使用不错的硬件,您通常也会有一些视频帧滞后。