我正在尝试处理从采集卡录制的视频,这涉及在某个时候将视频帧存储为 PNG 图像。问题是,FFmpeg 在从 YUV 转换为 RGB 时将色度平面向右移动约 2px。这增加了我的采集卡引入的现有偏移,并且变得非常明显。我尝试了 sws_flags 解决方案,但它只能修复块状。我还尝试在转换之前水平翻转视频,希望它能反转偏移方向,但没有效果。
因此我需要对两者进行补偿,并将色度向左移动。我见过叠加 filter_complex 用法的示例移动整个视频,以及色度平面提取通过 lut_yuv,但我不知道如何只移动色度平面。混合滤镜中似乎也没有“色度”模式,这本来允许我用其修改后的版本替换色度。
转换日志:
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
源图像:
你可以看到,从 YUY2 捕获格式来看,已经有 2px 的偏移
FFMpeg 转换:
现在它已经大了一倍
答案1
调整或改变色度的基本方法是使用滤镜geq
。
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
将色度放大到全尺寸,然后提取各个平面。在geq
应用于 U 和 V 提取平面的过滤器中,每个像素的值都取自其右侧的像素。这将丢失最左边像素列的原始值。最后,合并原始亮度和处理后的色度平面。通过反复试验,您应该能够获得正确的偏移量。