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

6
我需要访问并读取一个http流,该流从网络摄像头发送实时MJPEG图像以便在图像上进行一些opencv图像处理。我可以通过VLC或仅通过在chrome或firefox中打开URL来访问摄像头的图像。但是当服务器传送连续的视频帧时,如何以编程方式访问http服务器并分离每个帧呢?数据似乎简单格式化,循环在HTTP头和JPEG数据之间。我能想到的唯一方法是向服务器发送请求,解析数据并将头和实际的jpeg数据分离,并逐次将其传递给opencv。然而,这听起来非常复杂,我不确定从哪里开始。你们是否知道是否有任何库或更简单的方法可供使用,使所有这些变得更容易?谢谢。
2个回答

7

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

据我所知,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
在这个页面中:

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很难)。

希望这有所帮助。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接