Jedes nette Tool zum Ersetzen aller schwarzen Frames in einem Video durch einen anderen Frame

Meine Videodatei enthält einige schwärzliche Frames (sie ist fast schwarz, aber nicht ganz schwarz, dh #000000), und ich möchte sie herausfiltern und durch benachbarte Frames ersetzen.

Ich finde jedoch keine einfache Möglichkeit, dies zu tun.

Natürlich kann ich mit FFmpeg alle Frame-Bilder aus der Videodatei extrahieren:

ffmpeg -i foo.mp4 -an -framerate 30 -s 1280x720 -f image2 foo-%05d.jpeg

und listen Sie dann alle schwärzlichen Bilder mit einigen Bildwerkzeugen auf, ersetzen Sie sie durch Dateien mit benachbarten Nummern und führen Sie sie zusammen:

ffmpeg -i foo.mp4 -vn -acodec copy foo.m4a
ffmpeg -i foo.m4a -f image2 -framerate 30 -i foo-%05d.jpeg -r 30 -s 1280x720 output.mp4

Dies erzeugt jedoch über 10.000 Zwischenbilddateien und ist auch zeitaufwändig.

Gibt es eine Software oder Programmiersprache, die diese Arbeit unterstützt?

Ich verwende Windows x64.

Denken Sie daran, dass für die Bildverarbeitung jede Software, die Sie verwenden, jeden Frame dekodieren muss, so dass es immer zeitaufwändig sein wird. Das Schreiben auf die Festplatte als separate Bilddateien wird vermutlich mehr Zeit in Anspruch nehmen, aber Sie könnten vielleicht so etwas wie eine benannte Pipe verwenden, um sie im Speicher zu halten, je nachdem, welche Bildwerkzeuge Sie verwenden.
Als Randbemerkung möchten Sie wirklich einen Rahmen interpolieren, anstatt nur den Rahmen auf einer Seite zu verwenden. Wenn 2 Frames hintereinander gleich sind, wird es zu einem merklichen Stottern kommen.
Die Verwendung von etwas wie Twixtor würde versuchen, die Bewegung von den beiden Frames auf beiden Seiten zu interpolieren - könnte eine bessere Option sein, als nur eine Überblendung zweier benachbarter Frames zu wiederholen oder zu interpolieren? revisionfx.com/products/twixtor

Antworten (1)

Das könntest du in After Effects machen. Es gibt viele Beispiele online, bei denen Leute Expressions verwenden, um die durchschnittliche Helligkeit jedes Frames zu untersuchen und dann darauf zu reagieren. Beispielsweise könnten Sie jedem Bild, das unter einen bestimmten Schwellenwert gefallen ist, eine Markierung hinzufügen. Oder setzen Sie die Deckkraft des Rahmens auf 0 %, damit eine andere Spur von hinten durchscheinen kann.

Tutorial-Beispiele hier: http://markos.co.nz/2012/05/after-effects-expression-use-the-luminance-of-one-layer-to-drive-another-layer/

http://blogs.adobe.com/aftereffects/2009/07/color-sampler-using-sampleimag.html

Hier ist ein Beispielausdruck, den ich basierend auf den obigen Blogposts geschrieben habe -

threshold = 0.01;  // this is the threshold below which the track becomes transparent - black = 0.
driverLayer = thisComp.layer("Pre-comp 1");
samplePoint = [0,0]; // examine from the top left pixel
sampleSize = [640,360]; // examine the full comp size (in this case 640x360)
lightnessSample = driverLayer.sampleImage(samplePoint,sampleSize);  // this samples the image as rgb
driverLightness = rgbToHsl(lightnessSample)[2]; // converts to hue, saturation and lightness, then only takes lightness
if (driverLightness >=threshold) transform.opacity = 100 else 0; // tell opacity to be either 100 or zero depending upon the threshold point chosen in line 1

Ich habe dies auf die Deckkraftebene angewendet. Sie müssten den Schwellenwert und die Größe Ihrer Komposition (in meinem Fall 640 x 360) anpassen. (Der rote Vollton unten war, um zu sehen, ob die Änderung der Deckkraft funktionierte. Ich schätze, Sie würden eine Kopie Ihres Videos mit dem vorherigen Frame hier einfügen? Wird aussehen, als ob das Video hängen geblieben wäre ...

Geben Sie hier die Bildbeschreibung ein