如何解决cv::VideoCapture解码错误?

14

我正在使用OpenCV的VideoCapture(编译了ffmpeg支持)从IP摄像机中流式传输H264内容。

到目前为止,一切都运行良好,但偶尔会出现解码错误(我认为来自ffmpeg):

[h264 @ 0x103006400] mb_type 137 in I slice too large at 26 10
[h264 @ 0x103006400] error while decoding MB 26 10
[h264 @ 0x103006400] negative number of zero coeffs at 25 5
[h264 @ 0x103006400] error while decoding MB 25 5
[h264 @ 0x103006400] cbp too large (421) at 35 13
[h264 @ 0x103006400] error while decoding MB 35 13
[h264 @ 0x103006400] mb_type 121 in P slice too large at 20 3
[h264 @ 0x103006400] error decoding MB 20 3

这些消息会显示在控制台中。有没有一种清晰的方式可以监听到它们?我想跳过处理出现故障的帧。

有什么提示或建议吗?


面对相同的问题.... 有任何解决方案吗??? - tod
3个回答

3

最近我解决了同样的问题并尝试解释我所遵循的步骤。

我更新了最新的opencv_ffmpeg.dll(我将opencv_ffmpeg.dll重命名为opencv_ffmpeg310.dll以与OpenCV 3.1一起使用,还将相同的dll重命名为opencv_ffmpeg2412.dll以与OpenCV 2.4.12一起使用)。

通过这样做,仅捕获帧并显示基本上没有问题。但是,如果进行一些图像处理或检测,则仍会出现相同的问题,导致捕获帧之间出现延迟。

为了解决第二个问题,我使用了一个线程来连续抓取帧并更新全局Mat用于处理。

在这里您可以找到我的测试代码(它需要一些改进,如在更新Mat时使用互斥锁和锁定内存)

我希望这些信息对您有用(对不起我的英语不好)


我还没有尝试过这个,但它看起来比尝试将错误消息和跳帧传递更加优雅。 - George Profenza
最近我的方法在Mare的博客上得到了解释。 - sturkmen

0

我有同样的问题。我觉得问题出在流的源头比解码器慢。也许对于解码,你有一个无限循环读取帧并解码它们的过程,这可能比你的源头发送给你的速度更快。

我不知道如何停下来等待缓冲区充满…我正在使用一个文件,我的相机源写入一个文件,我从中读取帧到我的解码程序。到目前为止,我还没有能够将它们同步起来。


你说得对,我遇到了一个无限循环的问题,但是还没有找到解决方案。我正在考虑从 opencv/ffmpeg 中通过控制台输出进行管道传输,并仅在没有解码错误时使用帧作为 hacky 工作。不过,我还没有实现这个方法,也没有找到更优雅的解决方案。 - George Profenza
我也考虑过这个问题,但是我不知道该怎么做。。 :/ - Nacho

0

sturkmen所说的绝对正确,opencv版本是2413,由于某些原因,我无法将opencv更新至310,我知道在opencv310中不会出现任何解码错误。所以首先,我将库 opencv_ffmpeg310_64.dll 复制到我的可执行文件路径 E:\ GITHUB \ JpegRtspCamera \ vs2013 \ JpegRtspCamera \ x64 \ Release

然后我只需删除 opencv_ffmpeg2413.dll 并将名称更改为 opencv_ffmpeg310_64.dll 的 opencv_ffmpeg2413.dll 。 它正常工作!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接