C++ 自定义avi/MP4文件编写器

C++ 自定义avi/MP4文件编写器,c++,windows,video-capture,C++,Windows,Video Capture,我正在用相机在Windows下编写一些视频文件。 我需要的数据不变-不是MP4的'未压缩'即没有YUV,没有颜色插值-只是原始相机传感器ByTestStream 目前,我正在将此文件直接写入磁盘,稍后将其重新读取,以便重新编码为可用的视频。但由于没有标题,我必须分别跟踪图像大小、帧速率、颜色平衡等 我可以添加一个自定义标题,但即使实际的视频数据除了我的应用程序之外,其他任何东西都无法读取,使用AVI文件至少会给我一个相对标准的标题来存储所有相机参数,还意味着分辨率、长度等将显示在资源管理器中 有

我正在用相机在Windows下编写一些视频文件。
我需要的数据不变-不是MP4的'未压缩'即没有YUV,没有颜色插值-只是原始相机传感器ByTestStream

目前,我正在将此文件直接写入磁盘,稍后将其重新读取,以便重新编码为可用的视频。但由于没有标题,我必须分别跟踪图像大小、帧速率、颜色平衡等

我可以添加一个自定义标题,但即使实际的视频数据除了我的应用程序之外,其他任何东西都无法读取,使用AVI文件至少会给我一个相对标准的标题来存储所有相机参数,还意味着分辨率、长度等将显示在资源管理器中

有没有一种简单的方法可以生成AVI页眉/页脚,而无需通过directshow或vfw发送所有数据?数据以>250MB/s的速度输入,我不能丢失任何帧,因此除了将每个帧转储到磁盘之外,我没有时间做更多的事情


编辑:也许MP4会更好。我有很多关于相机配置的元数据,这些元数据不在AVI标准中。

听起来你真的可以从使用opencv中获益,它可能会很好地为你处理这些。看看它是否适合您的需要:

您可以使用OpenCV读写avi文件。


请注意,OpenCV还可以用于从相机抓取图像。

好吧,在弄清楚什么是适合您的流的“合理”AVI头之后(例如,如果您使用自定义编解码器fourcc,可能没有应用程序能够使用它做有用的事情——那么为什么要使用AVI呢?) 您可以在文件的开头编写一个预构建RIFF-AVI头。计算出这些值并不难

然后,每个帧必须包含在自己的RIFF块中(4字节类型:“00db”+4字节长度+您的数据)。
之后,您必须修复页眉中的num_帧和一些长度字段。对于大于2GB的文件,不要忘记标题的OpenDML扩展名。

马丁,既然你精通OpenCV,你就不能用它来创建一个未压缩的.avi

CvVideoWriter* cvCreateVideoWriter(const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1)
关于
foucc
param,文档中说明:

在Win32下,如果在使用avi文件名时传递了0,则将创建一个视频编写器,该编写器将创建一个未压缩的avi文件


为什么要将AVI头写入camera ByTestStream?ByTestStream可能不是任何可解码视频格式。我建议暂时编写自定义标题,然后重新处理流以使其成为AVI。我自己的标题需要存储宽度/高度/fps/颜色-与AVI完全相同。如果我使用avi,那么windows资源管理器至少可以显示这些东西——为什么要发明另一种文件格式呢?Opencv使用vfw进行摄像头和文件访问——它非常适合从网络摄像头读取VGA图像和编写未压缩的avi——但它无法处理以60帧/秒读取4K摄像头的问题!不知道2Gb AVI的限制,我在中提到,您也可以使用自己的类型编写自定义riff块以获得额外的头。对于MP4/QT,除了数据流之外,还必须在页眉(可以是页脚)中写入一个包含每个帧的文件位置的表。哦,我忘了RIFF块必须填充以进行2字节对齐。opencv2.2视频编写器只能处理24位彩色图像。我刚刚提交了一系列补丁,允许读/写8/16位灰度fourcc=“Y800”,“Y160”,但即使使用ffmpeg,速度也很慢。但它现在确实支持openDML格式,所以大于2Gb。我现在正在研究如何调用ffmpeg来处理标题部分并自己进行流媒体处理。@karlphilip-刚刚收到opencv的一封电子邮件,他们已经包含了补丁,现在它可以读取/写入未压缩的8位数据。