从IP摄像机读取h264流

7
目前,我正在尝试使用opencv从我的佳能VB-H710F相机读取视频。为此,我尝试了两种不同的解决方案:
解决方案1:从rtsp地址读取流
 VideoCapture cam ("rtsp://root:camera@10.0.4.127/stream/profile1=u");

 while(true)
  cam >> frame;

在这种情况下,我正在使用opencv直接从H264编码流(profile1)中读取数据,但是出现了与此处报告的相同问题http://answers.opencv.org/question/34012/ip-camera-h264-error-while-decoding/。如前一个问题所建议的那样,我尝试在opencv安装中禁用FFMPEG支持,这解决了h264解码错误,但引发了其他问题。当通过gstreame使用opencv访问流时,总是会有很大的延迟。使用这种解决方案,我可以实现15 FPS,但有5秒钟的延迟,考虑到我需要实时应用程序,这是不可接受的。

解决方案2:从http地址读取帧 while(true) { startTime=System.currentTimeMillis();

        URL url = new URL("h t t p://[IP]/-wvhttp-01-/image.cgi");
        URLConnection con = url.openConnection();
        BufferedImage image = ImageIO.read(con.getInputStream());   
        showImage(image);
        estimatedTime=System.currentTimeMillis()-startTime;
        System.out.println(estimatedTime);
        Thread.sleep(5);
}

这种策略只需从相机提供的url中获取帧。该代码使用Java编写,但使用curl库的C++结果相同。

此解决方案避免了第一种解决方案的延迟,但每个帧需要超过100毫秒,这意味着我只能平均实现10 FPS。

我想知道如何使用c++或另一个c++开发的库来读取视频?

3个回答

5

我曾遇到类似的问题,并且使用libVLC和OpenCV解决了一些问题。FFMPEG似乎存在不能正确解码H264的问题,而且新版本(2.4.11)中已经包含了FFMPEG的TCP修复。无论如何,我在Windows 7和8.1上使用MS Visual Studio。

详细信息请参见此处:http://answers.opencv.org/question/65932


0
个人建议您使用ffmpeg从IP摄像机读取rtsp流,然后使用openCV从ffmpeg的解码缓冲区中读取。ffmpeg对H.264解码有非常好的优化,性能不应该是一个关键问题。
您可以使用ffmpeg二进制文件来验证是否可以正确工作:
ffmpeg -i "rtsp://root:camera@10.0.4.127/stream/profile1=u" -vcodec copy -acodec none test.mp4

如果 test.mp4 可以成功播放,那么将 ffmpeg 库集成到您的项目中肯定是没问题的。
祝你好运!

感谢您的回答。尽管能够成功地以15 fps记录视频,但这个解决方案并不适合我的目的,因为在您的示例中,ffmpeg只是将视频复制到文件中而没有解码,在我的情况下我需要实时解码。 - João Neves
是的,我明白您需要提取每个帧并对每个帧进行处理。FFmpeg示例用于测试输入信号是否适合处理以及是否可以正确使用FFmpeg进行处理。经过验证,现在您可以开始编译FFmpeg库,并使用FFmpeg库手动解码帧数据,解码后的帧数据将在解码管道中可用。互联网上有许多FFmpeg开发手册可供参考。 - JasonYang
我已经尝试过了,但问题仍然存在,因为我只能访问过去2秒的帧(我认为这与ffmpeg的缓冲区大小有关)。您知道有什么方法可以减小此缓冲区的大小,同时保持实时解码吗?我已经在网上搜索过了,但没有找到任何解决方案。再次感谢。 - João Neves

0

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