Neue Antwort (schnell)
Sie können Bash für Sie rechnen lassen, und es funktioniert mit Millisekunden.
toSeconds() {
awk -F: 'NF==3 { print ($1 * 3600) + ($2 * 60) + $3 } NF==2 { print ($1 * 60) + $2 } NF==1 { print 0 + $1 }' <<< $1
}
StartSeconds=$(toSeconds "45.5")
EndSeconds=$(toSeconds "1:00.5")
Dauer=$(bc <<< "(${EndSeconds} + 0.01) - ${StartSeconds}" | awk '{ printf "%.4f", $0 }')
ffmpeg -ss $StartSeconds -i input.mpg -t $Duration output.mpg
Dies wird, wie die alte Antwort, einen 15-Sekunden-Clip erzeugen. Diese Methode ist auch ideal, wenn Sie tief innerhalb einer großen Datei schneiden, da das Suchen nicht deaktiviert ist, im Gegensatz zur alten Antwort. Und ja, ich habe verifiziert, dass es framegenau ist.
HINWEIS: Die Startzeit ist INKLUSIVE und die Endzeit ist normalerweise EXKLUSIVE, daher das +0.01
, um es inklusiv zu machen.
Wenn Sie mpv
verwenden, können Sie millisekundengenaue Zeitcodes im OSD mit --osd-fractions
aktivieren
alte Antwort mit Erklärung (langsam)
Um basierend auf Start- und Endzeit aus dem Quellvideo zu schneiden und nicht rechnen zu müssen, geben Sie die Endzeit als Eingabemöglichkeit und die Startzeit als Ausgabemöglichkeit an.
ffmpeg -t 1:00 -i input.mpg -ss 45 output.mpg
Dies wird einen 15-sekündigen Schnitt von 0:45 bis 1:00 erzeugen.
Dies liegt daran, dass, wenn -ss
als Ausgabemöglichkeit angegeben wird, die verworfene Zeit immer noch in die Gesamtzeit einbezogen wird, die aus der Eingabe gelesen wird, die -t
verwendet, um zu wissen, wann aufzuhören. Während wenn -ss
als Eingabe Option angegeben ist, wird die Startzeit gesucht und nicht gezählt, daher kommt die Verwirrung.
Es ist langsamer als das Suchen, da das ausgelassene Segment noch verarbeitet wird, bevor es verworfen wird, aber dies ist meines Wissens nach der einzige Weg, es zu tun. Wenn Sie tief innerhalb einer großen Datei schneiden, ist es sinnvoller, einfach zu rechnen und -ss
für die Eingabe zu verwenden.