合并来自不同视频的片段 ffmpeg

合并来自不同视频的片段 ffmpeg

我可以使用 ffmpeg 制作一个从不同视频中截取不同片段的视频吗?

1.webm, 2.webm, 3.webm, 4.webm 

这些是我的 4 个视频文件。我想要每个视频的 10 秒。片段由我指定。

ffmpeg -i 1.webm -1 2.webm -i 3.webm -i 4.webm -ss 00:00:00 -t 10 -ss 00:00:10  \
-t 10 -ss 00:00:20 -t 10 -ss 00:00:30 -t 10;

上面的命令并不是真正有效的命令。我可以通过编程获得类似的结果吗?

答案1

您无法通过单个命令执行此操作。但是,假设您在 Linux 上运行并使用 Bash(或类似的)作为 shell,则只需两个命令即可。请注意,这仅在视频都具有精确的相同的视频和音频编解码器和时间基准(fps 等)。

1. 创建视频和开始时间列表

首先,您必须制作一个包含以下内容的编辑列表。我们称之为videos

1.webm 00:00:00
2.webm 00:00:10
3.webm 00:00:20

请注意,这不支持带空格的视频名称。

2. 分割视频

现在我们将创建一个临时文件夹来保存较小的视频。我们将其命名为tmp。然后您可以像这样拆分文件:

while read video time; do ffmpeg -i $video -ss $time -t 10 -c copy tmp/$video; done < videos

这里,-t 10表示我们将从视频中剪切 10 秒,从 定义的时间戳开始-ss。您也可以使用-to而不是-t来剪切直到一個特定的點。

如果您输入的视频都具有不同的视频和音频编解码器,则此时需要重新编码视频。为此,您应该-c copy用特定的视频和音频编解码器设置替换该部分,例如-c:v libx264 -c:a libfaacH.264 / AAC 视频和音频。

3. 连接视频

现在,使用concat协议我们可以将文件重新合并在一起:

ffmpeg -f concat -i <(for f in tmp/*.webm; do echo "file '$f'"; done) -c copy output.webm

这就是你所需要的。它通过动态创建串联文件来工作。否则,你必须根据文档concat

最后您可以清理您的tmp文件夹。

相关内容