2011-01-26 35 views
5

我需要访问并阅读从网络摄像机发送实时MJPEG素材的http流,以便对图像执行一些opencv图像处理。如何在C++中解析MJPEG HTTP Stream?

我可以通过VLC访问摄像机的镜头,或者简单地通过在Chrome或Firefox中访问URL。但是,当服务器只是发送一个连续的feed时,如何以编程方式访问http服务器并分离每个帧?

数据似乎是简单的格式化,在HTTP标头和JPEG数据之间循环。我能想到的解决这个问题的唯一方法是向服务器发送一个请求,解析数据并将其与实际的jpeg数据分离,然后将其传递给opencv。

但是,这听起来非常令人费解,我不太确定我会从哪里开始。你们知道有没有图书馆,或只是我忽略了一个更简单的方法,这可以使所有这些更容易?

非常感谢

回答

5

对于HTTP下载,你可以使用Libcurl库。

AFAIK MJPEG格式不是标准格式。它的实际字节格式因实现而异。但基本上只是jpeg文件与分隔符的串接。如果您使用十六进制编辑器查看字节,则可以轻松区分每个jpeg文件。

例如,FFmpeg的MJPEG输出的结构如下图所示:

0xff 0xd8 // start of jpeg 
{ ... } // jpeg body 
0xff 0xd9 // end of jpeg 
... 
0xff 0xd8 // start of jpeg 
{ ... } // jpeg body 
0xff 0xd9 // end of jpeg 
... 
+0

https://en.wikipedia.org/wiki/JPEG#Syntax_and_structure – user1742529 2016-12-29 08:33:56

1

在这个页面:

http://thistleshrub.net/www/index.php?controller=posts&action=show&id=2012-05-13DisplayingStreamedMJPEGinJava.txt

解析一个MJPEG流与Java,我实现了这个与完美导致的Java 。

如果试图++你会发现有些事情错过了与C使用方法:插座连接如和渲染帆布,libcurl的似乎是一个很好的选择,http请求,但仍然缺少画布,你可以使用像GLUT或Qt的。

我在一些论坛上读到,OpenCV可以读取MJPEG Streamer类型的输入流,但似乎他们需要成为OpenCV的最新版本(从零开始编译OpenCV很难)。

我希望这个帮助。

+0

我正在更新我的网站新网址是http://thistleshrub.net/www/index.php?controller=posts&action=show&id=2012- 05-13DisplayingStreamedMJPEGinJava.txt – shrub34 2015-06-27 12:52:02