如何处理 cv::VideoCapture 解码错误?

Posted

技术标签:

【中文标题】如何处理 cv::VideoCapture 解码错误?【英文标题】:How to deal with cv::VideoCapture decode errors? 【发布时间】:2012-07-23 02:51:54 【问题描述】:

我正在使用来自 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

这些消息显示在控制台中。有什么干净的方法来听这些吗?我想跳过处理故障帧。

任何提示/提示?

【问题讨论】:

面临同样的问题....任何解决方案??? 【参考方案1】:

我也有同样的问题。在我看来,问题来自这样一个事实,即起源流的源比一个解码慢。可能对于解码,您有一个无限循环读取帧并对其进行解码,这可能比您的来源可以发送给您的要快。

我不知道如何停止并等到缓冲区已满.. 我正在使用一个文件,这样我的相机源写入一个文件并在我的解码程序中从中读取帧。到目前为止,我还无法同步它们

【讨论】:

你是对的,我有一个无限循环,但还没有找到解决问题的方法。我正在考虑在 opencv/ffmpeg 的控制台输出中进行管道处理,并且仅在没有遇到解码错误时才使用帧作为 hacky 解决方法,但还没有实现或找到更优雅的解决方案 我也有同样的想法,但我不知道如何做到这一点.. :/【参考方案2】:

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

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

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

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

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

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

【讨论】:

我还没有尝试过,但它看起来比尝试通过管道输入错误消息和跳过帧要优雅得多。 最近Mare在他的博客上解释了我的方法【参考方案3】:

sturkmen 说的很对,opencv 的版本是2413,不知什么原因,我不能把opencv 更新到310,我知道opencv310 不会出现这样的解码错误。所以首先,我将 lib opencv_ffmpeg310_64.dll 复制到我的可执行文件路径 E:\GITHUB\JpegRtspCamera\vs2013\JpegRtspCamera\x64\Release

然后我只需删除 opencv_ffmpeg2413.dll 并将名称 opencv_ffmpeg310_64.dll 更改为 opencv_ffmpeg2413.dll。好用!!!

【讨论】:

以上是关于如何处理 cv::VideoCapture 解码错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理java的乱码

GWT Autobean - 如何处理列表?

如何处理 Beautifulsoup 递归错误(或解析错误)

IIS无法启动报错配置文件的XML格式不正确如何处理

Mysql连接报错:1130-host ... is not allowed to connect to this MySql server如何处理

如何处理 Google Map Direction API 中的 0,0 标记错误?