我在Mac终端上使用bash命令。对于目录中的250个.mp4文件,我需要创建一个新的输出文件,该文件从每个输入文件中提取4个子剪辑:第一个子剪辑(从第二个子剪辑(从第二个子剪辑到第二个)、第二个子剪辑(在输入文件的33%阶段上的10秒)、第三个子剪辑(在输入文件的66%上的10秒)和第四个子剪辑(从输入文件结束前30秒开始的10秒)。每个输入文件的长度不同,大约为10-15分钟。
我尝试使用一个inputfile,下面的bash脚本可以工作:
#!/bin/bash
for file in *.mp4; do ffmpeg -i "$file" -vf "select='between(t, 10, 20) + between(t, 197, 207) + between(t, 393, 403) + between(t, 570,580)',
setpts=N/FRAME_RATE/TB" -qscale 0 -af "aselect='between(t, 10, 20) +
between(t, 197, 207) + between(t, 393, 403) + between(t, 570, 580)',
asetpts=N/SR/TB" outputfile.mp4; done但是,我不知道如何在250个mp4文件上循环它。具体来说,我有两个问题:
总之,我有一个包含10-15分钟长的inputfile的目录:
inputfile1.mp4
inputfile2.mp4
inputfile3.mp4
.......
inputfile250.mp4我希望将inputfile和outputfile放在一起的目录:
inputfile1.mp4
inputfile1_1.mp4 #this is 40 seconds long
inputfile2.mp4
inputfile2_1.mp4 #this is 40 seconds long
inputfile3.mp4
inputfile3_1.mp4 #this is 40 seconds long
.......
inputfile250.mp4
inputfile250_1.mp4 #this is 40 seconds long先谢谢你。
发布于 2018-06-29 20:11:40
制造是一条单线线,不能提高可读性.
所以,你要做的是:
#!/bin/bash
for file in *.mp4; do
ffmpeg -i "$file" \
-vf "select='between(t, 10, 20) \
+ between(t, 197, 207) + between(t, 393, 403) \
+ between(t, 570,580)', \
setpts=N/FRAME_RATE/TB" \
-qscale 0 \
-af "aselect='between(t, 10, 20) \
+ between(t, 197, 207) \
+ between(t, 393, 403) \
+ between(t, 570, 580)', \
asetpts=N/SR/TB" \
outputfile.mp4
done详细说明:
for file in *.mp4; do这意味着您将对目录中的每个文件执行ffmpeg。正如Shelter所指出的,这实际上是遍历所有不同的文件。但是,由于您正在写入一个固定的文件名(outputfile.mp4),所以只剩下一个输出文件:循环中最后一个mp4的缩短版本。
因此,如果您将输出写入不同的文件,您将看到,实际上,对所有输入文件都执行了ffmpeg。
如果您对循环不确定,请尝试插入echos来告诉您发生了什么。
至于输出文件的变量:${file%.mp4}_1.mp4可能可以。
因此,这意味着:
#!/bin/bash
for file in *.mp4; do
outputfile=${file%.mp4}_1.mp4
echo "Doing $file -> $outputfile"
# the ffmpeg command
donehttps://stackoverflow.com/questions/51106599
复制相似问题