目前,我正在尝试使用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解码错误但引发了其他问题。 当使用opencv访问流时,由gstreame支持,总是会有很大的延迟。 有了这个解决方案,我达到15 FPS,但我有5秒的延迟,考虑到我需要一个实时应用,这是不可接受的。
解决方案2:从http地址读取帧 而(真) { 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);
}
此策略只是从相机提供的网址抓取帧。代码是用Java编写的,但是在C ++中使用curl库的结果是相同的。 这个解决方案避免了第一个解决方案的延迟,但抓取每个帧只需要100毫秒,这意味着我只能达到平均10 FPS。
我想知道如何使用c ++或用c ++开发的其他库来阅读视频?
答案 0 :(得分:5)
我遇到了类似的问题,并认为我已经解决了一些使用libVLC和OpenCV的问题。 FFMPEG似乎没有正确解码H264的问题,加上新版本(2.4.11)似乎已经为FFMPEG进行了TCP修复。无论如何,我在Windows 7和8.1上使用MS Visual Studio。
答案 1 :(得分: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 libs集成到您的项目中。
祝你好运!答案 2 :(得分:0)
您也可以使用ffmpeg处理每个帧。您需要根据您的要求创建自己的过滤器。 https://trac.ffmpeg.org/wiki/FilteringGuide