我正在Mac终端上写Bash命令。为了能够使用循环,我想提取4个不同输入文件.mp4视频的子剪辑:第一个子剪辑(从第二个10到20),第二个子剪辑(从输入文件的33%开始到10秒),第三个子剪辑(从输入文件的66%开始到10秒),第四个子剪辑(在输入文件结束前30秒开始的10秒)。
到目前为止,我只知道如何使它与固定的时间(即秒)工作,但这些只对应于我的第一个视频(我有+200):
#!/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" ${file%.mp4}_1.mp4; done对于第一个子剪辑,我总是希望从第二个10到20,所以我可以保留它的现状,但对于第二至第四次,我需要一些公式,但不知道哪一个。有什么建议吗?
耽误您时间,实在对不起
发布于 2018-07-02 10:53:49
首先,您需要以秒为单位获取视频持续时间:
DURATION=$(ffmpeg -i $file 2>&1 | grep "Duration" | awk '{print $2}' | sed 's/\..*//g' | awk '{split($1, a, ":"); print 3600*a[1] + 60*a[2] + a[3]}')在这个命令中,您查询ffmpeg以获得视频持续时间,并通过以下方法解析结果:搜索“工期”关键字(grep)、获取时间域(awk)、丢弃厘米秒(sed)并将H:M:S字符串解析为若干秒(awk)。
然后,您可以计算所需的间隔:
START1=10
END1=20
START2=$(($DURATION*33/100))
END2=$(($START2+10))
START3=$(($DURATION*66/100))
END3=$(($START3+10))
START4=$(($DURATION-30))
END4=$(($START4+10))您需要整整几秒钟,所以使用返回整数的bash方法是一个很好的方法。
你应该确保你的视频持续至少30秒。
现在,您可以使用适当的时间替换来启动命令:
#!/bin/bash
for file in *.mp4
do
DURATION=$(ffmpeg -i $file 2>&1 | grep "Duration" | awk '{print $2}' | sed 's/\..*//g' | awk '{split($1, a, ":"); print 3600*a[1] + 60*a[2] + a[3]}')
START1=10
END1=20
START2=$(($DURATION*33/100))
END2=$(($START2+10))
START3=$(($DURATION*66/100))
END3=$(($START3+10))
START4=$(($DURATION-30))
END4=$(($START4+10))
ffmpeg -i "$file" -vf "select='between(t, $START1, $END1) + between(t, $START2, $END2) + between(t, $START3, $END3) + between(t, $START4, $END4)', setpts=N/FRAME_RATE/TB" -qscale 0 -af "aselect='between(t, $START1, $END1) + between(t, $START2, $END2) + between(t, $START3, $END3) + between(t, $START4, $END4)', asetpts=N/SR/TB" ${file%.mp4}_1.mp4
donehttps://stackoverflow.com/questions/51121333
复制相似问题