来自IP摄像机的MJPEG视频太快

MJPEG Video from IP Camera too fast

本文关键字:视频 MJPEG IP 摄像机 来自      更新时间:2023-10-16

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

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

相机是通过http访问的,所以我使用libcurl来访问它。这很好,我也可以下载流,没有任何问题。我已经选择将流数据保存到*.avi文件中(希望这是正确的…?)。

但现在问题是:我可以打开视频(尝试使用图腾视频播放器和VLC),也可以查看所有录制的内容——但速度太快了。整个视频大约持续5秒(而不是40秒)。在MJPEG中,头中是否有任何信息可以放在哪里,比如视频总长度或fps?我的意思是,视频播放器一定缺少一些信息,这样他们才能快速播放?

更新:

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

CCD_ 2。............................ ....&"((

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

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

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

[…]没有任何文档定义了一种确切的格式公认为"运动JPEG"的完整规范用于所有上下文。

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

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

您可能还会发现此项目非常有用:http://mjpeg.sourceforge.net/

编辑:

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

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

我建议你:

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

通过这种方式,您也可以指定所需的帧速率。

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

在un*x系统(linux、osx…)上,可以使用file cmdline工具(通常很好)猜测文件格式。

--myboundary表示流是通过HTTP作为多部分内容流式传输的常规M-JPEG。没有已知的文件格式可以"原样"保存此流并可播放(也就是说,如果将其重命名为AVI,则不应该播放)。

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