12

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

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

任何提示/提示?

4

3 回答 3

3

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

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

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

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

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

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

于 2016-02-24T00:28:04.397 回答
0

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

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

于 2014-06-24T08:45:08.313 回答
0

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。有用!!!

于 2018-06-21T09:07:31.760 回答