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

bash ffmpeg使用输入文件名作为输出视频文件名,bash,for-loop,video,ffmpeg,Bash,For Loop,Video,Ffmpeg,我在Mac终端上工作。我在一个目录中有250个视频文件。对于每一个,我想要一个20秒的子循环,介于10秒和20秒之间,以及179秒和207秒之间。我希望输出文件的名称与输入文件的名称相同,并加上一个“_1”后缀,以便区分它们。目前,我有以下代码: #!/bin/bash for %%f in (*.mp4) do ffmpeg -i "%%f" -vf "select='between(t, 10, 20) + between(t, 197, 207)', setpts=N/FRAME_RAT

我在Mac终端上工作。我在一个目录中有250个视频文件。对于每一个,我想要一个20秒的子循环,介于10秒和20秒之间,以及179秒和207秒之间。我希望输出文件的名称与输入文件的名称相同,并加上一个“_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”(即我所需的输出文件名),它会起作用。对于上面代码中的输出文件名,建议“~nf”从输入文件中删除扩展名(即“.mp4”),因此我随后添加了“_1.mp4”

有什么建议吗?提前谢谢。

您的循环应该是

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

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

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

最后,有效的方法如下所示:

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

%%f
语法是批处理windows cmd,但第一行表示您正在使用bash,您想使用哪种语言?@Nahuel Fouilleul正在使用bash。我在Mac终端上。