【问题标题】:How to parse MJPEG HTTP Stream within C++?如何在 C++ 中解析 MJPEG HTTP 流?
【发布时间】:2011-01-26 06:36:45
【问题描述】:

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

我可以通过 VLC 访问摄像机的素材,或者只需访问 chrome 或 firefox 中的 URL。但是,当服务器只是发送连续的提要时,我如何以编程方式访问 http 服务器并分隔每个帧?

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

但是,这听起来非常令人费解,我不太确定从哪里开始。你们知道那里是否有任何库,或者只是我忽略的一种更简单的方法,可以让这一切变得更容易吗?

非常感谢

【问题讨论】:

    标签: c++ http opencv mjpeg


    【解决方案1】:

    对于 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
    ...
    

    【讨论】:

      【解决方案2】:

      在此页面中:

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

      我希望这会有所帮助。

      【讨论】:

      猜你喜欢
      • 2014-03-09
      • 2011-08-26
      • 2013-01-19
      • 1970-01-01
      • 2015-08-22
      • 2016-11-06
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      相关资源
      最近更新 更多