Dada una matriz arr3 que contiene datos de muestra:
declare -a arr3=([0]="00:00:22.180 --> 00:00:25.600"
[1]="00:00:24.070 --> 00:00:27.790")
Puede recorrer cada elemento de la matriz, eliminar la hora de inicio y la hora de finalización, convertirlos en fracciones de segundo, calcular la duración y luego convertir esa duración de nuevo al formato hh :mm :ss.sss para el 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
La función codes2seconds
espera entrada en formato HH :MM :SS.sss;elimina los diversos elementos mediante la expansión de parámetros y luego los pasa a bc
para la conversión en número total de segundos.
La función seconds2codes
espera una fracción de segundos e invierte la conversión, lo que da como resultado una cadena HH :MM :SS.sss.
La función subtracttimes
convierte los dos parámetros en fracciones de segundo y luego pregunta a bc
cuál es la diferencia.
El bucle al final pasa por cada elemento de arr3; utiliza las funciones anteriores para calcular la duración (nuevamente usando la expansión de parámetros para recuperar los dos tiempos )y luego imprime una llamada de muestra ffmpeg
para que coincida con su salida de muestra.
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