多个video源合并为一个
我正在寻找一种有效的方法来做到以下几点:
使用几个源video(长度大致相同),我需要生成一个输出video,该video由在其自己的区域中运行的所有原始源组成(就像一堆不同大小的PIP )。 因此,最终结果是所有原件并排运行,每个原件都在自己的区域/盒子中。
源和输出需要是flv
,我使用的平台是Windows(Windows 7 64位开发,部署到Windows Server 2008)。
我看过avisynth,但不幸的是它无法处理flv
和非插件和我尝试过的flv分离器。
我当前的进程以下列方式使用ffmpeg :
- 使用ffmpeg为每个video生成每秒25个png,根据需要调整原始大小。
- 使用
System.Drawing
命名空间将每组帧组合成一个新图像,从静态背景开始,然后将每个帧加载到一个Image
并绘制到背景Graphics
对象 – 这给了我组合的帧。 - 使用ffmpeg将生成的图像合并到video中。
所有这些都是IO密集型(这是我目前的处理瓶颈),我觉得必须有一种更有效的方法来实现我的目标。 我没有太多的video处理经验,也不知道那里有什么选择。
有人能建议一种更有效的方法来处理这些吗?
做ffmpeg里面的一切。 你可以用videofilter做很多事情。 例如,并排加入两个video:
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
filter并更改overlay
filter的参数,以便在您喜欢的任何位置移动第二个video。
ffmpeg -i big.avi -vf "movie=small.avi [small]; [in][small] overlay=10:10 [out]" out.avi
我提供的链接描述了filter语法。 您可以将多个filter链接在一起
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