我只是想从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一样的单一图片格式。那么这甚至可能意味着整个视频文件只是一些“无脑”的链式图片?我的播放器只是假设他应该一个接一个地展示这些图片,而不知道帧速率?
答案 0 :(得分:6)
没有一种格式可用于MJPEG。来自维基百科:
[...]没有定义单一确切格式的文档 被普遍认为是“Motion JPEG”的完整规范 用于所有情况。
格式因供应商而异。我的建议是仔细检查你下载的文件。检查它是否真正 AVI容器。 (有些相机可以发送包装在MIME容器中的帧。)
明确容器格式后,您可以查看该容器的文档,并查找具有该格式和所需 fps 的文件。然后,您可以开始调整下载的文件以获得所需的效果。
您可能还会发现此项目很有用:http://mjpeg.sourceforge.net/
修改强>
根据您的示例数据,您的相机会将打包的帧发送到MIME容器中。 (第一行是边界,然后是标题,直到遇到空行,然后是文件数据itseld,跟随边界等等。)
这些是JPEG文件,如标题所示:image/jpeg
。 JFIF the standard file format用于存储JPEG数据。
我建议你:
这样您也可以指定所需的帧速率。
如果相机动态地插入AOI(感兴趣的区域),它可能会使事情变得更复杂,这意味着它只能发送更改发生的图像的较小部分。但是,如果简单的方法有效,你应该先检查一下。
答案 1 :(得分:1)
在un * x系统(linux,osx,...)上,您可以使用file
cmdline工具对文件格式做出(通常是好的)猜测。
答案 2 :(得分:1)
--myboundary
表示该流是通过HTTP传输为多部分内容的常规M-JPEG。没有众所周知的文件格式可以“按原样”保存此流并且可以播放(即如果将其重命名为AVI
则不应该播放)。
格式本身是(boundary, subheader, JPEG image)
,(boundary, subheader, JPEG image)
,...
等的序列。流没有时间戳,因此播放速度完全取决于播放器。