bash ffmpeg使用输入文件名作为输出视频文件名

时间:2018-06-29 12:23:23

标签: bash for-loop video ffmpeg

我在Mac终端上工作。我的目录中有250个视频文件。对于每一个,我都希望在10秒和20秒之间以及179和207秒之间有20秒的子剪辑。我希望将输出文件命名为与输入文件相同的名称,再加上一个“ _1”后缀,以便区分它们。目前,我有以下代码:

#!/bin/bash

for %%f in (*.mp4) do ffmpeg -i "%%f" -vf "select='between(t, 10, 20) +
between(t, 197, 207)', setpts=N/FRAME_RATE/TB" -qscale 0 -af "aselect='between(t, 10, 20) + 
between(t, 197, 207)', asetpts=N/SR/TB" "%%~nf_1.mp4"

执行时,它给我以下错误:意外标记'('

附近的语法错误

如果我删除循环,然后尝试使用特定的“ inputfilename.mp4”和“ inputfilename_1.mp4”(即我所需的输出文件名),则可以正常工作。至于上述代码中的输出文件名,this post建议“〜nf”从输入文件中删除扩展名(即“ .mp4”),因此我在之后添加了_1.mp4。

有什么建议吗?预先谢谢你。

2 个答案:

答案 0 :(得分:0)

您的循环应该是

for %%f in *.mp4 do
换句话说,请丢失括号。循环的“输入”部分需要一个参数列表。 * .mp4将扩展为包含所有匹配的文件名。

如果您有两个文件a.mp4和b.mp4,则* .mp4将在循环执行之前扩展为:

for %%f in a.mp4 b.mp4 do

答案 1 :(得分:0)

最后,工作的样子如下:

for file in *.mp4; do ffmpeg -i "$file" -vf "select='between(t, 10, 20) + between(t, 197, 207) + between(t, 10, 20) + between(t, 197, 207)', setpts=N/FRAME_RATE/TB" -qscale 0 -af "aselect='between(t, 10, 20) + between(t, 197, 207) + between(t, 10, 20) + between(t, 197, 207)', asetpts=N/SR/TB" "${file%.mp4}_1.mp4"; done