我正在使用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
这些消息显示在控制台中。有没有干净的方式来听这些?我想跳过处理毛刺的帧。
任何提示/提示?
答案 0 :(得分:3)
最近我解决了同样的问题并尝试解释我遵循的步骤。
我更新了最近的opencv_ffmpeg.dll(我将opencv_ffmpeg.dll重命名为opencv_ffmpeg310.dll以用于OpenCV 3.1,同样重命名为dll opencv_ffmpeg2412.dll以用于OpenCV 2.4.12
通过这样做,基本的捕获帧和显示成功而没有问题。但是如果我进行一些图像处理或检测导致捕获帧之间的延迟仍然是同样的问题。解决第二个问题我用一个线程连续抓取帧并更新全局Mat
进行处理。
here 你可以找到我的测试代码(它需要一些改进,比如在更新Mat时使用互斥锁和锁定内存)
我希望这些信息有用(抱歉我的英语不好)
答案 1 :(得分:0)
我有同样的问题。在我看来,问题来自于发起流的源比一个解码慢的事实。可能对于解码而言,您有一个无限循环读取帧并对其进行解码,这可能比您的源可以发送给您的更快。
我不知道如何停下来等到缓冲区已满。我正在使用一个文件,这样我的相机源会写一个文件,我在解码程序中从中读取帧。到目前为止,我还没有能够同步它们
答案 2 :(得分: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 。它有效!