C++ 来自IP摄像头的MJPEG视频太快

C++ 来自IP摄像头的MJPEG视频太快,c++,video,mjpeg,ip-camera,C++,Video,Mjpeg,Ip Camera,我只是想从IP摄像头(Basler BIP-1280c)读取视频流。 我想要的流保存在相机的缓冲区中,长度为40秒,用MJPEG解码 现在,如果我通过我的webbrowser访问流,它会显示40秒没有任何问题。 但实际上,我需要一个应用程序,它能够下载和保存自己的流 摄像头是通过http访问的,所以我使用libcurl来访问它。这很好,我也可以下载流没有任何问题。我选择将流数据保存到*.avi文件中(希望是正确的…?) 但现在的问题是:我可以打开视频(尝试使用图腾视频播放器和VLC),也可以查看

我只是想从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)@(02400060)/(1280x0720)。运动=00000(否)
[00000 | 00000 | 00000 | 00000]。报警=0000(否)。IO
=000.RtTrigger=0…Basler..BIP2-1280c..1970:01:05 23:08:10.8
98286……JFIF……
&“((

这个头在整个文件中重复出现(后面是大量字节的二进制数据)。这实际上没关系,因为我在相机手册中读到所有MJPEG图片都有这个头


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

MJPEG没有单一的格式。来自维基百科:

[…]没有一个文档定义了一种完全相同的格式 公认为“运动JPEG”的完整规范 适用于所有环境

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

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

您可能还会发现此项目很有用:

编辑:

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

正如标题所示,这些是JPEG文件:
image/JPEG
。JFIF用于存储JPEG数据

我建议你:

  • 将文件内容提取到多个jpeg文件中(例如,使用),然后
  • 从JPEG系列中创建电影文件
  • 这样,您也可以指定所需的帧速率

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

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

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


    格式本身是一系列
    (边界,副标题,JPEG图像)
    (边界,副标题,JPEG图像)
    等。流没有时间戳,因此播放速度完全取决于播放机。

    检查为avi文件指定的帧速率值。计算写入avi的帧数,然后计算在40秒内播放这些帧的帧速率。
    avi
    容器已损坏(图像可能是好的,但时间戳不是),如果您对文件格式有其他选择,也许您会想尝试另一种选择。AVI的固定每文件帧速率不适合IP摄像头流。但我实际上无法选择文件格式。我可以访问流数据,然后需要将其转储到文件中。因此,我对数据的存储方式没有影响,我可以使用c使用文件扩展名。已经为您准备好了一个实现!您对我如何确定容器格式有什么建议吗?MIME不是邮件格式吗?它是否也用于视频传输?或者我是否完全搞错了?//编辑:我实际上试着用“Avidemux”()但是它无法打开…所以我猜相机没有将其保存为正确的avi格式..?@Toby在十六进制编辑器中打开文件。前四个字节可能会告诉您格式。MIME也是一种容器格式(但并不特别适用于多媒体)。它可以将多个文件封装到一个文件中。抱歉,我花了这么长时间才回答,但我生病了…我现在用hexeditor打开了文件,我看到的是第一个o