2010-10-21 65 views
0

我正在用相机在Windows下编写一些视频文件。
我需要的数据保持不变 - 而不是MP4的“未压缩”,即。没有YUV,没有颜色插值 - 只是原始相机传感器字节流。自定义avi/MP4文件编写器

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

我可以添加一个自定义标题,但即使实际的视频数据不能被任何非我的应用程序读取,使用AVI文件至少会给我一个相对标准的标题来存储所有的相机参数,也意味着解析度,长度等将显示在资源管理器中。

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

编辑:MP4也许会更好,我有一个摄像头的配置,是不是在AVI标准大量元数据的

+0

为什么你要写AVI头到相机字节流?字节流可能不是任何可解码的视频格式。我会建议临时编写自定义标题并稍后重新处理该流以使其成为AVI。 – arbithero 2010-10-21 20:50:31

+1

我自己的头文件需要存储宽度/高度/ fps /颜色 - 与avi完全一样。如果我使用AVI,那么Windows资源管理器至少可以显示这些东西 - 为什么要创建另一种文件格式? – 2010-10-21 21:03:54

回答

1

那么,在弄清楚什么是'合理的'AVI头文件是你的流(例如,如果你使用自定义编解码器fourcc,没有应用程序可能会做到有用的事情 - 所以为什么要打扰AVI? ) 你可以在你的文件开头写一个预构建的RIFF-AVI头文件。找出价值并不难。然后每个帧必须包含在它自己的RIFF块中(4字节类型:“00db”+ 4字节长+你的数据)。 事实上,您必须修复头中的num_frames和一些长度字段。对于大于2GB的文件,不要忘记标题的OpenDML扩展名。

+0

不知道2Gb AVI限制,我在<9秒内击中了!看起来我需要为所有额外的标题信息使用MP4。但现在我只会为标题信息编写一个单独的文本文件。 – 2010-10-21 23:29:46

+0

您还可以使用自己的类型编写自定义即兴块,以获取额外的标题。对于MP4/QT,您必须为每个帧的文件位置添加一个表格,以将数据流添加到页眉(可以是页脚)中。哦,我忘记了RIFF块必须填充2字节对齐。 – smilingthax 2010-10-22 00:01:51

1

马丁,因为你是在OpenCV的精通,不能你只需要使用cvCreateVideoWriter()用于创建未压缩的.avi

CvVideoWriter* cvCreateVideoWriter(const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1) 

关于foucc PARAM,文档指出:

在Win32下,同时使用一个AVI文件名,将创建一个用于创建一个压缩的AVI文件的视频作家如果传递0。

+0

opencv2.2视频编写器仅适用于24位彩色图像。我刚刚提交了一堆补丁,允许读/写8/16位灰度级fourcc =“Y800”,“Y160”,但即使使用ffmpeg也是如此。但它现在支持openDML格式,所以> 2Gb。我现在正在考虑如何调用ffmpeg来处理标题部分,并自己进行流处理。 – 2011-04-01 21:32:15

+0

好消息,感谢@Martin。 – karlphillip 2011-04-01 21:33:34

+0

@karlphilip - 刚刚从opencv收到一封电子邮件,他们已经包含了这些补丁,以便现在可以读取/写入未压缩的8位数据。 – 2011-06-24 16:39:24