2

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

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

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

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

更新:

正如答案中所建议的,我用十六进制编辑器打开了文件,我发现是这样的:

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

此标头在整个文件中重新出现(后跟大量的二进制数据字节)。这实际上没问题,因为我在相机手册中读到所有 MJPEG 图片都有这个 Header。

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

4

3 回答 3

6

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

[...] 没有文件定义了一种被普遍认可为在所有情况下使用的“Motion JPEG”的完整规范的精确格式。

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

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

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

编辑:

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

如标题所示,这些是 JPEG 文件:image/jpeg. JFIF 是存储 JPEG 数据的标准文件格式。

我建议你:

  1. 将文件内容提取到多个 jpeg 文件中(例如使用munpack),然后
  2. 使用 ffmpeg 或 mplayer从一系列 jpeg 中创建电影文件。

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

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

于 2012-01-25T08:57:15.253 回答
1

--myboundary指示该流是通过 HTTP 以多部分内容形式流式传输的常规 M-JPEG。没有众所周知的文件格式可以“按原样”保存此流并且可以播放(也就是说,如果您将其重命名为AVI它不应该播放)。

格式本身是 , 等的序列(boundary, subheader, JPEG image)(boundary, subheader, JPEG image)...没有时间戳,所以播放速度完全取决于播放器。

于 2012-01-30T15:41:08.143 回答
1

在 un*x 系统(linux、osx、...)上,您可以使用filecmdline 工具对文件格式进行(通常很好)猜测。

于 2012-01-25T11:37:08.443 回答