来自IP Camera的MJPEG视频太快了

时间:2012-01-25 08:44:52

标签: c++ video mjpeg ip-camera

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

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

通过http访问摄像头,因此我使用libcurl来访问它。这工作正常,我也可以下载流没有任何麻烦。我选择将流数据保存到* .avi文件中(希望这是正确的......?)。

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

更新

正如答案中所建议的,我用hexeditor打开了文件,我发现了这个:

--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图片都有这个标题。

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

3 个答案:

答案 0 :(得分:6)

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

  

[...]没有定义单一确切格式的文档   被普遍认为是“Motion JPEG”的完整规范   用于所有情况。

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

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

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

修改

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

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

我建议你:

  1. 将文件内容解压缩为多个jpeg文件(例如munpack),然后
  2. use ffmpeg or mplayer从jpeg系列中创建一个电影文件。
  3. 这样您也可以指定所需的帧速率。

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

答案 1 :(得分:1)

在un * x系统(linux,osx,...)上,您可以使用file cmdline工具对文件格式做出(通常是好的)猜测。

答案 2 :(得分:1)

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

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