我可以使用 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 libfaac
H.264 / AAC 视频和音频。
3. 连接视频
现在,使用concat
协议我们可以将文件重新合并在一起:
ffmpeg -f concat -i <(for f in tmp/*.webm; do echo "file '$f'"; done) -c copy output.webm
这就是你所需要的。它通过动态创建串联文件来工作。否则,你必须根据文档concat
。
最后您可以清理您的tmp
文件夹。