我只是想从IP摄像机(Basler BIP-1280c)中读取视频流 . 我想要的流保存在相机的缓冲区中,长度为40秒,并在MJPEG中解码 .
现在,如果我通过我的webbrowser访问流,它会向我显示40秒没有任何问题 . 但实际上我需要一个能够自行下载和保存流的应用程序 .
相机是通过http访问的,所以我使用 libcurl
来访问它 . 这工作正常,我也可以下载流没有任何麻烦 . 我选择将流数据保存到* .avi文件中(希望这是正确的......?) .
但现在问题是:我可以打开视频(尝试使用图腾视频播放器和VLC)并查看所有已录制的内容 - 但它太快了 . 整个视频持续5秒(而不是40秒) . MJPEG中是否有任何 Headers 可以放置总视频长度或fps等信息?我的意思是视频播放器必须缺少一些信息,以便它们能够快速播放?
Update:
正如答案中所建议的那样,我用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图片都有这个 Headers .
更有趣的是 JFIF
在最后一行 . 如答案所示,这可能是文件格式的指标 . 但afaik JFIF是一个像jpg一样的单一图片格式 . 那么这甚至可能意味着整个视频文件只是一些链式图片?而我的播放器只是假设他应该一个接一个地展示这些图片,而不知道帧率?
3 回答
没有一种格式可以与MJPEG一起使用 . 来自维基百科:
格式因供应商而异 . 我的建议是仔细检查你下载的文件 . 检查它是否是 really AVI容器 . (某些相机可以发送包含在MIME容器中的帧) .
在 container format 清除之后,您可以查看该容器的文档,并查找具有该格式和所需 fps 的文件 . 然后,您可以开始调整下载的文件以获得所需的效果 .
您可能还会发现此项目很有用:http://mjpeg.sourceforge.net/
Edit:
根据您的示例数据,您的相机会将打包的帧发送到MIME容器中 . (第一行是边界,然后是 Headers ,直到遇到空行,然后是文件数据itseld,跟随边界,依此类推) .
这些是JPEG文件,如 Headers 所示:
image/jpeg
. JFIF是the standard file format来存储JPEG数据 .我建议你:
将文件内容解压缩为多个jpeg文件(例如munpack),然后
use ffmpeg or mplayer从jpegs系列中创建一个电影文件 .
这样您也可以指定所需的帧速率 .
如果相机动态地插入AOI(感兴趣的区域),它可以使事情变得更复杂,这意味着它只能发送更改发生的图像的较小部分 . 但是你应该首先检查简单的方法是否有效 .
在un * x系统(linux,osx,...)上,您可以使用
file
cmdline工具对文件格式进行(通常是好的)猜测 .--myboundary
表示该流是通过HTTP传输为多部分内容的常规M-JPEG . 没有众所周知的文件格式可以保存此流"as is"并且可以播放(即如果您将其重命名为AVI
它不应该播放) .格式本身是
(boundary, subheader, JPEG image)
,(boundary, subheader, JPEG image)
,...
等序列 . 流没有时间戳,因此播放速度完全取决于播放器 .