7

我正在寻找一种有效的方式来做到以下几点:多个视频源合并成一个

使用多个来源的视频(的长度大致相同),我需要生成一个由所有的输出视频每个原始资源都在自己的区域中运行(例如几个不同尺寸的一堆PIP)。所以,最终的结果是所有的原件都并排运行,每个都在自己的区域/箱子中。

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

我看过avisynth,但不幸的是,它不能处理flv和我尝试工作的插件和flv分离器。

我目前的进程以下列方式使用ffmpeg

  1. 使用的ffmpeg生成每视频每秒25点PNG的,调整原来的需要。
  2. 使用System.Drawing命名空间将每组帧组合为一个新图像,从静态背景开始,然后将每个帧加载到Image并绘制到背景Graphics对象 - 这给了我合并的帧。
  3. 使用ffmpeg将生成的图像组合到视频中。

这一切都是非常密集的IO(这是我目前的处理瓶颈),我觉得必须有一个更有效的方式来达到我的目标。我没有太多的视频处理经验,也不知道有哪些选择。

任何人都可以提出一个更有效的方式来处理这些?

回答

10

做一切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 
+0

感谢您的答案 - 你有一个图片,在图片的命令行的例子吗? – Oded

+1

伟大的第二个例子 - 我将如何指定超过2个来源?或者我需要用不同的叠加多次调用它? – Oded

+0

它看起来像'overlay'不会调整原始大小 - 我想我需要使用'scale'来达到这个目的? – Oded