我只是想从 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 的单一图片格式。那么这是否甚至可能意味着整个视频文件只是一些“无脑”的链接图片?而我的玩家只是假设他应该一张一张地显示这些图片,而不知道帧率?