如何将帧写入视频文件?

6
我正在编写一个应用程序,它从相机读取帧,修改它们,并将它们保存到视频文件中。我打算使用ffmpeg来完成。然而,关于ffmpeg的文档很少,我找不到方法。有人知道如何做吗?
我需要在Unix上使用C或C++来完成。有人能提供一些指导吗?
谢谢。
编辑:
抱歉,我没有表达清楚。我想要一些开发者API来将帧写入视频文件。我打开相机流,获取每一帧,然后使用ffmpeg的公共API将它们保存到视频文件中。因此,使用命令行工具并不能帮助我。我已经看过ffmpeg源代码文件夹下的output_example.c。这很棒,我可以直接复制一些代码部分而不用改变。但我仍在寻找更简单的方法。
另外,我考虑将我的应用程序移植到iPhone上,据我所知,只有ffmpeg已经被移植到了iPhone上。GStreamer基于glib,而且都是GNU的东西。我不确定是否能让它在iPhone上运行。因此,目前ffmpeg仍然是最好的选择。
欢迎任何评论。
3个回答

5

这可能有助于您入门-文档可用,但较新的功能往往在ffmpeg的手册中记录。

帧需要按顺序编号。

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

有关更多信息,请参见幻灯片指南


0

你可以在不使用任何库的情况下实现你所需的功能,就像在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会自动为编码使用第二个处理器。


0

如果你觉得除了ffmpeg还有其他可行的解决方案,那么你可能想看看GStreamer。我认为它可能正是你的情况所需要的,而且有很多文档可以参考。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接