
Ich versuche, zwei Teile desselben Eingabevideos zu verketten, aber einer ist 20-mal schneller. Der Code, den ich verwende, ist dieser:
ffmpeg -i 7.mp4 -filter_complex "[0:v]select='between(t,0,9)',setpts=PTS-STARTPTS[vn];[0:a]aselect='between(t,0,9)',asetpts=PTS-STARTPTS[an];[0:v]select='between(t,191,1174)',setpts=(1/20)*(PTS-STARTPTS)[vr];[0:a]aselect='between(t,191,1174)',atempo=20,asetpts=PTS-STARTPTS[ar];[vn][an][vr][ar]concat=n=2:v=1:a=1[vid]" -map [vid] -c:v libx265 -tag:v hvc1 -crf 23 -preset slow "output5.mp4"
Irgendeine Idee, was ich falsch mache? Der Teil mit der Speicherzuweisung kann nicht durchgeführt werden. Ich habe 16 GB Speicher und führe nur ffmpeg aus …
Fehler:
[h264 @ 00000181d923ccc0] get_buffer() failed
[h264 @ 00000181d923ccc0] thread_get_buffer() failed
[h264 @ 00000181d923ccc0] decode_slice_header error
[h264 @ 00000181d923ccc0] no frame!
[fc#0 @ 00000181d91dbdc0] Task finished with error code: -12 (Cannot allocate memory)peed=0.0342x
[fc#0 @ 00000181d91dbdc0] Terminating thread with return code -12 (Cannot allocate memory)
[vist#0:0/h264 @ 00000181db1bbcc0] [dec:h264 @ 00000181d91e4680] Error submitting packet to decoder: Invalid data found when processing input
Antwort1
Es sieht aus wie ein Fehler in FFmpeg, der mit der Verkettung eines Videos mit sich selbst zusammenhängt.
Eine mögliche Problemumgehung besteht darin, dieselbe Eingabedatei zweimal zu verwenden (als wären es zwei Eingabedateien):
ffmpeg -i 7.mp4 -i 7.mp4 -filter_complex "[0:v]select='between(t,0,9)',setpts=PTS-STARTPTS[vn];[0:a]aselect='between(t,0,9)',asetpts=PTS-STARTPTS[an];[1:v]select='between(t,191,1174)',setpts=(1/20)*(PTS-STARTPTS)[vr];[1:a]aselect='between(t,191,1174)',atempo=20,asetpts=PTS-STARTPTS[ar];[vn][an][vr][ar]concat=n=2:v=1:a=1[vid]" -map [vid] -c:v libx265 -tag:v hvc1 -crf 23 -preset slow "output5.mp4"
Die folgende Erklärung ist nur eine Vermutung:
Beim Verketten zweier Teile desselben Inputs gibt es meiner Meinung nach Fälle, in denen FFmpeg viele dekodierte Frames im Speicher speichert (Frame-Puffer). Der Zweck des Pufferns besteht darin, zu vermeiden, dass dieselben Frames mehrfach dekodiert werden. Wenn derselbe Input zweimal verwendet wird, wird jeder Input separat dekodiert (Pufferung vermeiden). Ich bin mir über den Puffermechanismus nicht sicher, aber er könnte den Fehler „Speicher kann nicht zugewiesen werden“ erklären.