当你想提取一个视频文件中第2分钟到第4分钟的两分钟时,你将使用命令
ffmpeg -i input.mpg -sameq -ss 00:02:00 -t 00:02:00 output.mpg
我想将视频分成两分钟的片段。我有一个使用 bash 脚本的想法,但有一些错误。
for i in seq 50;
do ffmpeg -i input.mpg -sameq -ss 00:`expr $i \* 2 - 2`:00 -t 00:02:00 output.mpg; done
您知道如何纠正我使用表达式的脚本中的错误吗$i
?或者有更好的解决方案吗?
答案1
您忘记在调用中使用反引号 - 或更好:$( )
subshell seq
。这有效:
for i in $( seq 50 );
do ffmpeg -i input.mpg -sameq -ss 00:`expr $i \* 2 - 2`:00 -t 00:02:00 output.mpg; done
另一件事是您可能不希望output.mpg
在每次运行中都被覆盖,是吗? :)$i
也可用于输出文件名。
除此之外:在 bash 中,您可以只使用$(( ))
or$[ ]
代替expr
- 它看起来也更清晰(在我看来)。另外,不需要seq
- 大括号扩展就是获得序列所需的全部。这是一个例子:
for i in {1..50}
do ffmpeg -i input.mpg -sameq -ss 00:$[ i* 2 - 2 ]:00 -t 00:02:00 output_$i.mpg
done
大括号的另一个好处是您可以在名称中包含前导零(对于将来的文件排序非常有用):
for i in {01..50}
do ffmpeg -i input.mpg -sameq -ss 00:$[ i* 2 - 2 ]:00 -t 00:02:00 output_$i.mpg
done
另请注意,如果您只需更改范围,则i*2 - 2
可以轻松简化为:i*2
for i in {00..49}
do ffmpeg -i input.mpg -sameq -ss 00:$[ i*2 ]:00 -t 00:02:00 output_$i.mpg
done