我在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。
有什么建议吗?预先谢谢你。
答案 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