多个视频源合并成一个。

9
我正在寻找一种高效的方法来完成以下任务:
使用多个源视频(长度大致相同),我需要生成一个输出视频,其中包括所有原始源,每个源在其自己的区域内运行(就像几个不同大小的 PIP一样)。因此,最终结果是所有原始文件并排运行,每个文件都在自己的区域/框中。
源和输出需要为flv,我使用的平台是Windows(在Windows 7 64位上进行开发,在Windows Server 2008上部署)。
我已经查看了 avisynth,但不幸的是它无法处理flv,我尝试过的所有插件和flv分离器都无法正常工作。
我的当前流程使用 ffmpeg以以下方式:
  1. 使用ffmpeg为每秒的视频生成25个png,根据需要调整原始大小。
  2. 使用命名空间将每组帧合并成新图像,从静态背景开始,然后将每帧加载到中,并绘制到背景对象中 - 这给了我合并的帧。
  3. 使用ffmpeg将生成的图像组合成视频。

所有这些都非常依赖于IO(这是我目前的处理瓶颈),我觉得必须有一种更有效的方式来达到我的目标。我没有太多视频处理经验,也不知道有什么选择。

有人能建议一种更有效的处理方式吗?

1个回答

11

一切都在ffmpeg内完成。您可以使用视频过滤器做很多事情。例如,要将两个视频并排拼接:

ffmpeg -i input0.avi -vf "movie=input1.avi [in1]; [in]pad=640*2:352[in0]; [in0][in1] overlay=640:0 [out]" out.avi

@Oded: 这基本上是这个命令的作用。你可以删除pad过滤器,并更改overlay过滤器的参数以将第二个视频移动到任何位置。

ffmpeg -i big.avi -vf "movie=small.avi [small]; [in][small] overlay=10:10 [out]" out.avi

我提供的链接描述了筛选器语法。你可以将多个筛选器链接在一起:

ffmpeg -i big.avi -vf "movie=small0.avi [small0]; [in][small0] overlay=10:10 [tmp];\
                       movie=small1.avi [small1]; [tmp][small1] overlay=30:10 [out]" out.avi

谢谢你的回答 - 你有一个画中画命令行的例子吗? - Oded
1
很棒的第二个例子 - 我如何指定超过2个源?还是我需要多次调用它并使用不同的叠加层? - Oded
感谢@Banthar提供的解决方案。用这个方法,我成功地完成了拼接。 :) 拼接后的视频可以在这里观看:http://www.youtube.com/watch?v=YX4aY8_jv9U - akauppi
这是我用于将两个视频拆分成中间部分的命令行:ffmpeg-iin1.webm -vf"in2.webm [in1];[in1]crop=640:720:640:0[in3];[in]pad=640*2:0[in0];[in0][in3]overlay=640:0[out]"-crf5-b:v8M out.webm - robertc
使用vstack或hstack是否比pad + overlay更好? - Leo
显示剩余2条评论

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