如何在C ++中解析MJPEG HTTP Stream?

时间:2011-01-26 06:36:46

标签: c++ http opencv mjpeg

我需要访问和读取从网络摄像机发送实时MJPEG素材的http流,以便对图像进行一些opencv图像处理。

我可以通过VLC访问相机的镜头,或者只需转到chrome或firefox中的URL即可。但是,当服务器只发送连续数据时,如何以编程方式访问http服务器并分离每个帧?

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

然而,这听起来非常复杂,我不太清楚我从哪里开始。你们知道那里有没有图书馆,或者只是一个我忽视的简单方法,这可以让这一切变得更容易吗?

非常感谢

2 个答案:

答案 0 :(得分: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
...

答案 1 :(得分:1)

在此页面中:

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

使用Java解析MJPEG流,我在Java中实现了完美的结果。

如果您尝试使用C ++,您会发现一些错过的内容:套接字连接和渲染画布,libcurl似乎是http请求的一个很好的选择,但仍然缺少画布,您可以使用类似GLUT或Qt的东西。

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

我希望这有帮助。