Сначала вам нужно получить длительность видео в секундах:
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 длительность видео и анализируете результат, выполняя поиск по ключевому слову «Duration» (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
done