c++ - 来自 IP 摄像机的 MJPEG 视频速度太快

标签 c++ video mjpeg ip-camera

我只是想从 IP 摄像机 (Basler BIP-1280c) 读取视频流。 我想要的流保存在相机的缓冲区中,长度为 40 秒,并以 MJPEG 格式解码。

现在,如果我通过我的网络浏览器访问流,它会毫无问题地显示 40 秒。 但实际上我需要一个能够自行下载和保存流的应用程序。

摄像头是通过 http 访问的,所以我使用 libcurl 来访问它。这工作正常,我也可以毫无问题地下载流。我选择将流数据保存到 *.avi 文件中(希望这是正确的……?)。

但现在问题来了:我可以打开视频(尝试使用 Totem Video Player 和 VLC)并查看所有已录制的内容 — 但速度太快了。整个视频持续 5 秒(而不是 40 秒)。在 MJPEG 中,标题中是否有任何内容可以放置诸如总视频长度或 fps 之类的信息?我的意思是视频播放器一定缺少一些信息,所以他们播放速度很快?

更新:

按照答案中的建议,我用十六进制编辑器打开文件,发现的是:

--myboundary..Content-Type: image/jpeg..Content-Length: 39050..*Exif..II*........ ......................................2................ ...0210............帧号=000398732 6.AOI=(0800x0720)@(0240,0060)/(1280x0720).Motion=00000(无) [00000 | 00000 | 00000 | 00000 | 00000].Alarm=0000(无).IO =000.RtTrigger=0...Basler..BIP2-1280c..1970:01:05 23:08:10.8 98286......JFIF.............................. ...&"((

这个 header 在整个文件中重复出现(后面跟着很多字节的二进制数据)。这实际上没问题,因为我在相机手册中读到所有 MJPEG 图片都有这个标题。

在最后一行的 JFIF 中更有趣。正如答案中所建议的那样,这可能是文件格式的指示符。但是afaik JFIF和jpg一样是单图格式。那么这是否意味着整个视频文件只是一些“无脑”的链接图片?而我的播放器只是假设他应该一张接一张地显示这些图片,而不知道帧率?

最佳答案

没有一种格式可用于 MJPEG。来自维基百科:

[...] there is no document that defines a single exact format that is universally recognized as a complete specification of “Motion JPEG” for use in all contexts.

格式因供应商而异。我的建议是仔细检查您下载的文件。检查它是否真的是一个 AVI 容器。 (一些相机可以发送包裹在 MIME 容器中的帧)。

容器格式 清楚后,您可以查看该容器的文档并查找具有该格式和所需fps 的文件。然后您可以开始调整下载的文件以获得所需的效果。

您可能还会发现这个项目很有用:http://mjpeg.sourceforge.net/

编辑:

根据您的示例数据,您的相机将打包到 MIME 容器中的帧发送出去。 (第一行是边界,然后是标题,直到遇到空行,然后是文件数据本身,然后是边界等等)。

如标题所示,这些是 JPEG 文件:image/jpeg。 JFIF 是 the standard file format存储 JPEG 数据。

我建议你:

  1. 将文件内容解压成多个jpeg文件(以munpack为例),然后
  2. use ffmpeg or mplayer从一系列 jpeg 文件中创建电影文件。

这样您也可以指定所需的帧速率。

如果相机动态改变 AOI(感兴趣区域),这会使事情变得更加复杂,这意味着它只能发送图像中发生变化的较小部分。但是您应该首先检查简单方法是否有效。

关于c++ - 来自 IP 摄像机的 MJPEG 视频速度太快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8999835/

相关文章:

flash - 使用 as3 通过 flash 加载和播放 mjpeg - 套接字错误

c++ - 我可以使用 C 风格的转换将派生类转换为私有(private)基类吗?

c++ - 无法让 RTC 工作

c# - 从内存流播放视频

objective-c - 如何将 MJPEG 帧解码为 JPEG

node.js - 无边界MJPEG流

c++ - 用 map 反向查找

C++ std::string 语法 "new (&y) std::string(x);"

c++ - 使用 SDL_Flip 的 SDL 视频叠加层闪烁

android - FFMPEG : Adding font to Video gives error