使用 ffmpeg 将视频文件拆分为多个片段

xra*_*alf 5 bash ffmpeg shell-script

当您想从第 2 分钟到第 4 分钟提取两分钟的视频文件时,您将使用命令

ffmpeg -i input.mpg -sameq -ss 00:02:00 -t 00:02:00 output.mpg
Run Code Online (Sandbox Code Playgroud)

我想将视频分成两分钟的片段。我有一个使用 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
Run Code Online (Sandbox Code Playgroud)

您知道如何更正我使用$i表达式的脚本中的错误吗?或者有什么更好的解决方案?

roz*_*acz 8

您忘记$( )seq调用中使用反引号 - 或者更好:subshel​​l - 。这有效:

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
Run Code Online (Sandbox Code Playgroud)

另一件事是,您可能不想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
Run Code Online (Sandbox Code Playgroud)

大括号的另一个好处是您可以在名称中使用前导零(对于将来的文件排序非常有用):

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)