2014-10-04 153 views
5

目前,我正尝试使用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++开发的其他库来读取视频?

回答

0

就个人而言,我建议你使用ffmpeg从IP摄像机读取rtsp流,然后使用openCV从ffmpeg的解码缓冲区读取数据。 ffmpeg对H.264解码有很好的优化,性能不应该是一个关键问题。

可以使用的ffmpeg二进制来验证这是否可以正常工作:

ffmpeg -i "rtsp://root:[email protected]/stream/profile1=u" -vcodec copy -acodec none test.mp4 

如果test.mp4可以正常播放,那么它肯定好为你的ffmpeg库集成到项目。

祝你好运!

+0

谢谢你的回答。尽管能够以15fps的速度成功录制视频,但该解决方案并不适合我的目的,因为在您的示例中,ffmpeg只是将视频复制到文件而无需解码,而在我的情况下,我需要实时解码。 – 2014-10-17 16:07:53

+0

是的,我知道你需要提取帧并在每个帧上进行处理。ffmpeg示例是测试输入信号是否正确处理以及是否可以使用ffmpeg正确处理。在您验证之后,您现在可以开始编译ffmpeg库,并使用ffmpeg lib手动使用代码对帧进行解码,并且帧数据将在解码管道中供您使用。互联网上提供了各种ffmpeg开发手册。 – JasonYang 2014-10-18 02:25:57

+0

我已经尝试过,但问题仍然存在,因为我只能访问过去2秒的帧(我认为这与ffmpeg的缓冲区大小有关)。你知道一些方法来减少这个缓冲区的大小,同时保持实时解码吗?我已经在网上搜索,但是我找不到任何解决方案。再次感谢你 – 2014-10-18 13:34:52

4

我挣扎着类似的问题,并认为我解决了一些使用libVLC和OpenCV的问题。 FFMPEG似乎没有正确解码H264的问题,加上新版本(2.4.11)似乎已经有FFMPEG的TCP修复。无论如何,我在Windows 7和8.1上使用MS Visual Studio。

详情在这里给出:http://answers.opencv.org/question/65932