Entfernen Sie mit ffmpeg schwarze Rahmen aus VOB-Dateien

Ich habe ein paar .vobDateien mit "schwarzen Rahmen" (es scheint, dass ein Problem während der Übernahme von VHS dazu geführt hat).
Ich kann mit dem Befehl herausfinden, wo diese schwarzen Rahmen auftreten

ffmpeg -i source.vob  -vf blackdetect=d=0:pic_th=0.70:pix_th=0.10 -an -f null - 2>&1

was mir gibt

[...]
[blackdetect @ 0x7fab5b40a3e0] black_start:137.68 black_end:137.72 black_duration:0.04
[blackdetect @ 0x7fab5b40a3e0] black_start:161 black_end:161.04 black_duration:0.04
[blackdetect @ 0x7fab5b40a3e0] black_start:181.96 black_end:182 black_duration:0.04
[...]

(black_duration ist aus irgendeinem Grund immer 0,04 s)

Ich habe ein Skript erstellt, das die Teile zwischen schwarzen Rahmen schneidet und jeweils eine Datei erstellt.
im Grunde läuft es für die drei Zeilen oben:

ffmpeg -i "/Users/simon/Documents/projects/encodage VHS/source.vob" -ss 00:02:17.720 -t 23.28  -f avi -c:v libx264 -c:a libmp3lame -crf 0 -preset veryslow -vf "setpts=PTS-STARTPTS" 13.mpeg;
ffmpeg -i "/Users/simon/Documents/projects/encodage VHS/source.vob" -ss 00:02:41.040 -t 20.92  -f avi -c:v libx264 -c:a libmp3lame -crf 0 -preset veryslow -vf "setpts=PTS-STARTPTS" 14.mpeg;

dann füge ich diese Dateien mit dem Concat-Plugin von ffmpeg zusammen.

Mein Problem ist: Ich bin mir sicher, dass die Werte, die ich zum Schneiden verwende, richtig sind, aber wenn ich den Blackdetect-Filter erneut ausführe, kann ich am Anfang einiger Fragmente schwarze Rahmen sehen.

Weißt du, warum ich immer noch diese schwarzen Rahmen bekomme? Gibt es einen besseren Weg, sie zu entfernen, als Cut and Concat? Ich verwende einen Mac.

Antworten (2)

Was Sie erlebt haben, nennt man Dropped Frames. Diese sollten nicht mit Drop-Frame-Videoformaten verwechselt werden (z. B. NTSC-Video mit 29,97 fps, das auch als Drop-Frame mit 30 fps bezeichnet wird (weil ein Frame ausgelassen wird, um 29,97 Frames pro Sekunde zu erhalten).

Ausgelassene Frames treten auf, wenn das Aufnahmesystem nicht mit der Wiedergaberate Schritt halten kann. Sie haben eine Dauer von 0,04, weil es sich um einen einzelnen Frame handelt, was ungefähr 0,04 Sekunden entspricht.

Ausgelassene Frames sind ein relativ kniffliges Problem, da sie den Fluss des Videos und auch die Audiosynchronisierung stören. Selbst wenn Sie sie aus dem Ausgangsmaterial herausschneiden, ergibt sich eine räumliche und auditive Lücke von 0,04 Sekunden, die für einen Betrachter oft wahrnehmbar ist. Aus diesem Grund ist es am besten, die Aufnahme erneut durchzuführen, wenn während der Aufnahme ausgelassene Frames auftreten.

Wenn eine erneute Aufnahme keine Option ist, interpolieren Sie am besten einen Frame, um die Lücke zu füllen, indem Sie den Durchschnitt der vorherigen und nachfolgenden Videoframes bilden. Dieser Frame kommt oft nicht besonders gut heraus, ist aber immer noch weniger störend als das vollständige Entfernen des Frames und ermöglicht, dass der Ton normal fortgesetzt wird (vorausgesetzt, der Ton wurde nicht auch für den ausgelassenen Frame abgeschnitten).

Als letzten Ausweg können Sie den ausgelassenen Frame einfach herausschneiden, aber wie bereits erwähnt, führt dies zu einer Lücke von 0,04 Sekunden in Ihrem Filmmaterial und ist nicht ideal.

weil ein Frame verworfen wird, um 29,97 Bilder pro Sekunde zu erhalten -> es werden keine Frames verworfen. Der Timecode läuft mit 30 fps, was von der tatsächlichen Framerate abweicht, sodass alle 900 Frames oder so ein Timecode-Label übersprungen wird, um die Zeitsynchronisierung beizubehalten, dh 29:29 -> 30:01, wobei 30:00 übersprungen wird.

Dies ist das Skript, mit dem ich das gelöst habe. 1/ Es findet schwarze Frames und fügt sie in eine Datei ein. 2/ Es liest die Datei und berechnet eine (wirklich lange) Befehlszeile, die diese Frames mit dem "Select"-Filter entfernt.

Es ist nicht schön, aber es erledigt die Arbeit!

ffmpeg -i "$1" -vf blackframe -an -f null - 2>&1 | ack  "(?<=frame:)[0-9]*(?= )" -oh > blacks.txt


printf "ffmpeg -i \"$1\""
printf " -f avi -c:v libx264 -c:a libmp3lame -crf 23 -preset veryslow"

printf " -vf \"select="

cat blacks.txt | while read a; do
printf "not(eq(n\,$a))*"
done
printf "\""
printf " "
printf "$2"
printf "\n"
rm blacks.txt
Beachten Sie, dass Sie möglicherweise immer noch Bewegungsartefakte und möglicherweise Probleme mit der Audiosynchronisierung haben, wo die Entfernungen auftreten.
Keine Probleme mit der Audiosynchronisierung, aber ich habe einige Bewegungsartefakte. Trotzdem reicht es mir.