Suchen Sie nach der Videodauer nach der Anwendung von Zeitlupe

Suchen Sie nach der Videodauer nach der Anwendung von Zeitlupe

Ich versuche, einen Zeitlupeneffekt auf eine Reihe von Videos anzuwenden. Außerdem werden diese Videos skaliert, aufgefüllt und überblendet. Nachfolgend sehen Sie den Befehl, den ich zum Anwenden von Zeitlupe verwende.

ffmpeg -i 1.mp4 -filter_complex "
[0:v]trim=0:5,setpts=PTS-STARTPTS[tv1];
[0:v]trim=5:7,setpts=PTS-STARTPTS[tv2];
[0:v]trim=start=7,setpts=PTS-STARTPTS[tv3];
[tv2]setpts=PTS*2[slow];
[tv1][slow][tv3]concat=n=3:v=1:a=0[out]" -map [out] -c:v libx264 test.mp4

Ich habe zwei Fragen.

  1. Obwohl [tv2]der Zeitlupeneffekt ab der 5. Sekunde getrimmt und angewendet wird, wird er tatsächlich ab der 4. Sekunde angewendet. Was ist der Grund dafür?

Nachfolgend sehen Sie den Befehl, den ich für andere Verarbeitungen direkt nach der Verkettung im obigen Befehl verwende.

[concat0]scale=iw*min(1280/iw\,720/ih):ih*min(1280/iw\,720/ih),pad=1280:720:(1280-iw*min(1280/iw\,720/ih))/2:(720-ih*min(1280/iw\,720/ih))/2,format=pix_fmts=yuva420p,fade=t=out:st=16:d=2:alpha=1,setpts=expr=PTS-STARTPTS+10/TB[va0];

Dort muss ich das angeben setptsund verwende die kumulative Dauer der Videos vor dem aktuellen Video.Hierist der vollständige Befehl, den ich dafür verwende.

  1. Wie kann ich die Dauer des Videos nach dem Anwenden des Zeitlupeneffekts berechnen? Wie hoch wäre beispielsweise die Erhöhung der Dauer des Videos durch den ersten hier erwähnten Befehl in Sekunden oder sogar Mikrosekunden?

Antwort1

Frage 1- Der Befehl ist unvollständig, da Sie nicht berücksichtigen,Audio-Track, Sie haben den PTS nur in derVideoSpur. Um den Unterschied zu sehen, versuchen Sie einfach Folgendes:

# no-good, starts from 4th second audio with a frozen video frame
ffmpeg -i in.mp4 -vf trim=5:7 out.mp4
#
# works as expected, both audio and video start at 5th second
ffmpeg -i in.mp4 -vf trim=5:7 -af atrim=5:7 out.mp4

Frage 2- Auch dies wird aus demselben Grund nicht wie erwartet funktionieren, aber sobald Sie das vorherige Problem behoben haben, gibt es hier einen zwar nicht sehr eleganten, aber dennoch effektiven Trick, um die „Vorher“- und „Nachher“-Zeiten zu korrelieren:

# overlay the input video with a timer, pulled to the right 200 pixels
ffmpeg -i in.mp4 -f lavfi -i testsrc=n=3 -vf overlay=x=200 in-with-time.mp4
#
# do all your manipulation, and finaly overlay with another timer at x=0
ffmpeg -i in-with-time.mp4 -f lavfi -i testsrc=n=3 -filter_complex "..stuff...,overlay[out]" out.mp4

Dadurch erhalten Sie pro Frame die ursprüngliche und die resultierende Zeit mit einer Genauigkeit von 1 Millisekunde.

verwandte Informationen