目前,我正尝试使用opencv从佳能VB-H710F摄像头读取视频。从IP摄像机读取h264流
为此我尝试了两种不同的解决方案:
解决方案1:读取RTSP地址
VideoCapture cam ("rtsp://root:[email protected]/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地址 读取帧,同时(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编写的,但是C++和curl库的结果是一样的。 该解决方案避免了第一种解决方案的延迟,但是每帧抓取花费的时间略少于100 ms,这意味着我只能达到平均10 FPS。
我想知道如何使用C++或C++开发的其他库来读取视频?
谢谢你的回答。尽管能够以15fps的速度成功录制视频,但该解决方案并不适合我的目的,因为在您的示例中,ffmpeg只是将视频复制到文件而无需解码,而在我的情况下,我需要实时解码。 – 2014-10-17 16:07:53
是的,我知道你需要提取帧并在每个帧上进行处理。ffmpeg示例是测试输入信号是否正确处理以及是否可以使用ffmpeg正确处理。在您验证之后,您现在可以开始编译ffmpeg库,并使用ffmpeg lib手动使用代码对帧进行解码,并且帧数据将在解码管道中供您使用。互联网上提供了各种ffmpeg开发手册。 – JasonYang 2014-10-18 02:25:57
我已经尝试过,但问题仍然存在,因为我只能访问过去2秒的帧(我认为这与ffmpeg的缓冲区大小有关)。你知道一些方法来减少这个缓冲区的大小,同时保持实时解码吗?我已经在网上搜索,但是我找不到任何解决方案。再次感谢你 – 2014-10-18 13:34:52