FFMPEG verschieben die Chroma-Ebene horizontal

570
Seedmanc

Ich versuche, das von meiner Capture-Karte aufgenommene Video zu verarbeiten. Dazu werden die Videoframes irgendwann als PNG-Bilder gespeichert. Das Problem ist, FFmpeg verschiebt die Chroma-Ebenen ~ 2px nach rechts, wenn Sie von YUV nach RGB konvertieren. Dies fügt der bereits vorhandenen Schicht, die meine Erfassungskarte einführt, hinzu und macht sich bemerkbar. Ich habe die sws_flags-Lösung ausprobiert, aber sie behebt nur die Blockierung. Ich habe auch versucht, das Video vor der Konvertierung horizontal umzudrehen, in der Hoffnung, dass es die Verschiebungsrichtung umkehren würde, jedoch ohne Wirkung.

Ich muss also beide kompensieren und das Chroma nach links verschieben. Ich habe Beispiele für die Verwendung von overlay filter_complex gesehen , die das gesamte Video verschoben hat, sowie die Extraktion der Chroma-Ebenen über lut_yuv, aber ich kann nicht herausfinden, wie man nur die Chroma-Ebene verschiebt. Es scheint auch keinen "Chroma" -Modus im Mischfilter zu geben, der es mir erlaubt hätte, Chroma durch seine modifizierte Version zu ersetzen.

Konvertierungsprotokoll:

F:\records>ffmpeg64 -i src.avi -ss 4.5 -vframes 1 -f image2 -vcodec png -sws_fl ags accurate_rnd+full_chroma_int test.png ffmpeg version N-89073-gff8f40a630 Copyright (c) 2000-2017 the FFmpeg developers  built with gcc 7.2.0 (GCC) configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --e nable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libblur ay --enable-libfreetype --enable-libmp3lame --enable-libopenjpeg --enable-libopu s --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --ena ble-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-lib x264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-z lib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-cuda --enable-c uvid --enable-d3d11va --enable-nvenc --enable-dxva2 --enable-avisynth --enable-l ibmfx libavutil 56. 0.100 / 56. 0.100 libavcodec 58. 3.102 / 58. 3.102 libavformat 58. 2.100 / 58. 2.100 libavdevice 58. 0.100 / 58. 0.100 libavfilter 7. 0.101 / 7. 0.101 libswscale 5. 0.101 / 5. 0.101 libswresample 3. 0.101 / 3. 0.101 libpostproc 55. 0.100 / 55. 0.100 [avi @ 0000000000420180] non-interleaved AVI Input #0, avi, from 'src.avi': Duration: 00:02:18.23, start: 0.000000, bitrate: 881232 kb/s Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 1280x720, 881325 kb/s, 60 fps, 60 tbr, 60 tbn, 60 tbc File 'test.png' already exists. Overwrite ? [y/N] y Stream mapping: Stream #0:0 -> #0:0 (rawvideo (native) -> png (native)) Press [q] to stop, [?] for help Output #0, image2, to 'test.png': Metadata: encoder : Lavf58.2.100 Stream #0:0: Video: png, rgb24, 1280x720, q=2-31, 200 kb/s, 60 fps, 60 tbn, 60 tbc Metadata: encoder : Lavc58.3.102 png frame= 1 fps=0.7 q=-0.0 Lsize=N/A time=00:00:00.01 bitrate=N/A speed=0.0115x  video:274kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing o verhead: unknown 

Quellbild: https://i.imgur.com/IShYK77.png

Sie sehen, dass bereits aus dem YUY2-Aufnahmeformat eine 2px-Schicht besteht

FFMpeg-Konvertierung: https://i.imgur.com/ZtzcbSb.png

Jetzt ist es doppelt so groß

0
Kannst du vor und nach Bildern zeigen? Auch die Konvertierung von YUV-> RGB-Befehlen und deren Protokoll. Gyan vor 6 Jahren 0
Frage bearbeitet Seedmanc vor 6 Jahren 0

1 Antwort auf die Frage

2
Gyan

Die grundlegende Methode zum Anpassen oder Verschieben des Farbtons ist die Verwendung des geqFilters.

ffmpeg64 -i src.avi -filter_complex  "format=yuv444p,extractplanes=y+u+v[y][u][v]; [u]geq=lum='p(X+1,Y)'[u];[v]geq=lum='p(X+1,Y)'[v]; [y][u][v]mergeplanes=0x001020:yuv444p"  -ss 4.5 -vframes 1 -f image2 -vcodec png -sws_flags accurate_rnd+full_chroma_int test.png 

Das Chroma wird auf volle Größe hochskaliert, dann werden die einzelnen Ebenen extrahiert. In den geqFiltern, die auf die U- und V-extrahierten Ebenen angewendet werden, wird der Wert jedes Pixels von dem Pixel rechts davon übernommen. Dadurch gehen die ursprünglichen Werte der ganz linken Pixelspalte verloren. Schließlich werden das ursprüngliche Luma und die bearbeiteten Chroma-Ebenen zusammengeführt. Mit etwas Versuch und Irrtum sollten Sie die Offsets richtig machen können.