iro*_*and 3 shell bash ffmpeg time arithmetic
我想把视频剪成这样的大约 10 分钟的部分。
ffmpeg -i video.mp4 -ss 00:00:00 -t 00:10:00 -c copy 01.mp4
ffmpeg -i video.mp4 -ss 00:10:00 -t 00:10:00 -c copy 02.mp4
ffmpeg -i video.mp4 -ss 00:20:00 -t 00:10:00 -c copy 03.mp4
Run Code Online (Sandbox Code Playgroud)
有了for
它就会变成这样。
for i in `seq 10`; do ffmpeg -i video.mp4 -ss 00:${i}0:00 -t 00:10:00 -c copy ${i].mp4; done;
Run Code Online (Sandbox Code Playgroud)
但它仅在持续时间小于一小时时有效。如何在bash shell中将数字转换为时间格式?
BASH 对于这个问题并没有那么糟糕。您只需要使用非常强大但未充分利用的date
命令。
for i in {1..10}; do
hrmin=$(date -u -d@$(($i * 10 * 60)) +"%H:%M")
outfile=${hrmin/:/-}.mp4
ffmpeg -i video.mp4 -ss ${hrmin}:00 -t 00:10:00 -c copy ${outfile}
done
Run Code Online (Sandbox Code Playgroud)
date
命令解释date
具有-d
标志允许您设置哪些您要日期显示的(而不是当前的日期和时间,这是默认的)。在这种情况下,我通过在@
整数前添加符号将其设置为 UNIX 时间。本例中的整数是以十分钟为增量的时间(由 BASH 内置计算器计算:)$((...))
。
该+
符号date
表示您要指定显示结果的格式。在我们的例子中,我们只关心小时 ( %H
) 和分钟 ( %M
)。
最后,将-u
显示为 UTC 时间而不是本地时间。这在这种情况下很重要,因为我们在给它 UNIX 时间时将时间指定为 UTC(UNIX 时间始终为 UTC)。如果您没有指定,数字很可能不会从 0 开始-u
。
该date
命令提供了我们所需要的。但是文件名中的冒号可能有问题/不标准。所以,我们用':'代替'-'。这可以通过sed
orcut
或tr
命令来完成,但是因为这是一个如此简单的任务,为什么在 BASH 可以做到的情况下生成一个新的子 shell?
这里我们使用 BASH 的简单表达式替换。为此,变量必须包含在花括号 ( ${hrmin}
) 内,然后使用标准的正斜杠符号。第一个斜杠后的第一个字符串是搜索模式。第二个斜杠后的第二个字符串是替换。
BASH 变量替换和更多内容可以在http://tldp.org/LDP/abs/html/parameter-substitution.html找到。