如何将帧写入视频文件?

Posted

技术标签:

【中文标题】如何将帧写入视频文件?【英文标题】:How to write frames to a video file? 【发布时间】:2010-11-20 21:58:27 【问题描述】:

我目前正在编写一个应用程序,它从相机读取帧、修改它们并将它们保存到视频文件中。我打算用ffmpeg来做。很少有关于 ffmpeg 的文档。我找不到办法。有人知道怎么做吗?

我需要在 unix 和 C 或 C++ 中完成。有没有人可以提供一些说明?

谢谢。

编辑:

对不起,我没有写清楚。我希望一些开发人员 API 将帧写入视频文件。我打开相机流,获取每一帧,然后使用 ffmpeg 的公共 API 中可用的 API 将它们保存到视频文件中。所以使用命令行工具实际上对我没有帮助。我在 ffmpeg src 文件夹下看到了 output_example.c。我可以直接复制代码的某些部分而无需更改,这真是太好了。我仍在寻找更简单的方法。

另外,我正在考虑将我的应用程序移植到 iPhone,据我所知,只有 ffmpeg 已移植到 iPhone 上。 GStreamer 基于 glib,而且都是 GNU 的东西。我不确定我是否可以在 iPhone 上使用它。所以 ffmpeg 仍然是目前最好的选择。

感谢任何 cmets。

【问题讨论】:

【参考方案1】:

如果 ffmpeg 以外的其他解决方案对您来说是可行的,您可能需要查看 GStreamer。我认为这可能适合您的情况,并且那里有很多文档。

【讨论】:

【参考方案2】:

这可能会帮助您入门 - 文档可用,但更新的功能往往会记录在 ffmpeg 的手册页中。

帧需要按顺序编号。

ffmpeg -f image2 -framerate 25 -i frame_%d.jpg -c:v libx264 -crf 22 video.mp4
-f 定义格式 -framerate 定义帧率 -i 定义输入文件/s ... %d 指定编号文件 .. 添加 0 指定填充,例如%05d 用于填充零的五位数字。 -vcodec 选择视频编解码器 -crf 指定速率控制方法,用于定义 x264 流如何 编码 video.mp4 是输出文件

有关详细信息,请参阅Slideshow guide。

【讨论】:

【参考方案3】:

您可以在不使用库的情况下执行您需要的操作,因为在 unix 中您可以将 RGBA 数据通过管道传输到程序中,因此您可以这样做:

在你的程序中:

char myimage[640*480*4];
// read data into myimage
fputs(myimage,1,640*480*4,stdout);

在运行你的程序的脚本中:

./myprogram | \
mencoder /dev/stdin -demuxer rawvideo -rawvideo w=640:h=480:fps=30:format=rgba \
-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=9000000 \
-oac copy -o output.avi

相信你也可以这样使用ffmpeg,或者x264。您还可以从程序中启动编码器,然后写入管道(如果您使用库,则整个过程非常简单)。

虽然不是你想要的,也不适合 iPhone 开发,但它确实具有 Unix 会自动使用第二个处理器进行编码的优势。

【讨论】:

以上是关于如何将帧写入视频文件?的主要内容,如果未能解决你的问题,请参考以下文章

使用opencv将视频写入文件时遇到问题

OpenCV将帧附加到现有视频(.avi)文件?

python如何以不同的名称保存视频?

Java:从帧制作动画/视频

从相机帧创建视频

如何使用 FFMPEG 和 C 将音频和视频写入同一个文件?