9

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

使用多个源视频(长度大致相同),我需要生成一个输出视频,该视频由所有原始源组成,每个源都在自己的区域中运行(比如一堆不同大小的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 密集型的(这是我目前的处理瓶颈),我觉得必须有一种更有效的方法来实现我的目标。我在视频处理方面没有太多经验,也不知道有什么选择。

任何人都可以提出一种更有效的处理方式吗?

4

1 回答 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
于 2011-09-28T10:55:45.660 回答