【发布时间】:2012-08-06 20:35:23
【问题描述】:
我正在用 Emgu 写一个简单的视频播放,它是 opencv 的 c# 包装器。
现在我可以播放视频了,但我发现 fps 不准确,比正常快一点。
在我的代码中,我使用Thread.sleep() 在两帧之间等待一段时间。代码是:
int fps = getFromFile(file); // which is 30
while (true) {
var frame = CvInvoke.cvQueryFrame(capture);
if (frame.ToInt32() == 0) break;
Image<Bgr, byte> dest = new Image<Bgr, byte>(Convert.ToInt32(width), Convert.ToInt32(height));
CvInvoke.cvCopy(frame, dest, IntPtr.Zero);
box.Image = dest;
Thread.Sleep(1000 / Convert.ToInt32(fps));
}
哪里出了问题,如何解决?
更新
代码中的box是Emgu.UI.ImageBox,是线程安全的,我可以直接从其他线程访问:box.Image = dest
【问题讨论】:
-
1) Thread.Sleep 不是非常精确或保证 2) 等待时间需要考虑未等待的时间和其他时间偏移,也许考虑到总时间(参见 #1)3 ) 通常不建议在 UI 线程中休眠 .. 并且 UI 元素只能从 UI(希望创建)线程访问。
-
'简单视频' - 不存在。
-
有趣的是,你说它更快,因为我认为它会更慢,因为你正在睡眠 33.3333 毫秒,但高于睡眠的操作也需要时间。你应该睡 (1000 / fps - )。
-
@ananthonline,我认为它应该比正常慢。但是我用我的播放器和一个著名的播放器打开同一个视频,他们同时开始,但很快我的播放器就开始播放了。
-
你应该知道 OpenCV 不是为像视频显示这样的事情而构建的。所有关于 fps、帧数、视频位置的信息通常都是不准确的。 VideoCapture 对象只是为了帮助快速制作图像处理应用程序的原型——它可以加载帧——但是缺少了制作优秀视频播放器的所有小细节
标签: c# multithreading video opencv emgucv