多个视频源合二为一

时间:2011-09-28 10:17:00

标签: c# ffmpeg video-processing flash-video processing-efficiency

我正在寻找一种有效的方法来执行以下操作:

使用几个源视频(长度大致相同),我需要生成一个输出视频,该输出视频由在其自己的区域中运行的所有原始源组成(就像一堆PIP个不同的尺寸)。因此,最终结果是所有原始文件并排运行,每个都在自己的区域/框中。

源和输出需要为flv,我使用的平台是Windows(Windows 7 64位开发,部署到Windows Server 2008)。

我查看了avisynth但遗憾的是它无法处理flv以及我尝试过的插件和flv分离器。

我当前的流程以下列方式使用ffmpeg

  1. 使用ffmpeg为每个视频每秒生成25 png,根据需要调整原始大小。
  2. 使用System.Drawing命名空间将每组帧组合成一个新图像,从静态背景开始,然后将每个帧加载到Image并绘制到背景Graphics对象 - 这给了我组合的框架。
  3. 使用ffmpeg将生成的图像合并到视频中。
  4. 所有这些都是IO密集型(这是我目前的处理瓶颈),我觉得必须有一种更有效的方法来实现我的目标。我没有太多的视频处理经验,也不知道那里有什么选择。

    有人能建议一种更有效的方法来处理这些吗?

1 个答案:

答案 0 :(得分:11)

在ffmpeg内做所有事情。你可以用video filters做很多事情。例如,并排加入两个视频:

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