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.
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 ...
stib
A. J. Henderson
Tomh
BlueRaja - Danny Pflughoeft