Dado um array arr3 que contém dados de amostra:
declare -a arr3=([0]="00:00:22.180 --> 00:00:25.600"
[1]="00:00:24.070 --> 00:00:27.790")
Você pode percorrer cada elemento na matriz, remover a hora de início e a hora de término, convertê-los em segundos fracionários, calcular a duração e, em seguida, converter a duração de volta no formato hh: mm: ss.sss para o comando ffmpeg .
# converts HH:MM:SS.sss to fractional seconds
codes2seconds() (
local hh=${1%%:*}
local rest=${1#*:}
local mm=${rest%%:*}
local ss=${rest#*:}
printf "%s" $(bc <<< "$hh * 60 * 60 + $mm * 60 + $ss")
)
# converts fractional seconds to HH:MM:SS.sss
seconds2codes() (
local seconds=$1
local hh=$(bc <<< "scale=0; $seconds / 3600")
local remainder=$(bc <<< "$seconds % 3600")
local mm=$(bc <<< "scale=0; $remainder / 60")
local ss=$(bc <<< "$remainder % 60")
printf "%02d:%02d:%06.3f" "$hh" "$mm" "$ss"
)
subtracttimes() (
local t1sec=$(codes2seconds "$1")
local t2sec=$(codes2seconds "$2")
printf "%s" $(bc <<< "$t2sec - $t1sec")
)
declare -a arr3=([0]="00:00:22.180 --> 00:00:25.600"
[1]="00:00:24.070 --> 00:00:27.790")
for range in "${arr3[@]}"
do
duration=$(subtracttimes "${range%% -->*}" "${range##*--> }")
printf "%s\n" "ffmpeg -i movie.mp4 -ss ${range%% -->*} -t $duration -async 1 cut.mp4"
done
A função codes2seconds
espera entrada no formato HH: MM: SS.sss; elimina os vários elementos usando a expansão de parâmetro e passa-os para bc
para a conversão em número total de segundos.
A função seconds2codes
espera um número fracionário de segundos e inverte a conversão, resultando em uma string HH: MM: SS.sss.
A função subtracttimes
converte os dois parâmetros em segundos fracionários e depois pergunta bc
pela diferença.
O loop no final passa por cada elemento de arr3; ele usa as funções acima para calcular a duração (novamente usando a expansão de parâmetro para recuperar as duas vezes) e depois imprime uma amostra de ffmpeg
para corresponder à sua saída de amostra.
Resultados:
ffmpeg -i movie.mp4 -ss 00:00:22.180 -t 3.420 -async 1 cut.mp4
ffmpeg -i movie.mp4 -ss 00:00:24.070 -t 3.720 -async 1 cut.mp4