FFMPEG muda o plano croma horizontalmente

0

Estou tentando processar o vídeo que gravei no cartão de captura e isso envolve o armazenamento dos quadros de vídeo como imagens PNG em algum momento. O problema é que o FFmpeg desloca os planos de croma ~ 2px para a direita ao converter de YUV para RGB. Isso aumenta o turno já existente que minha placa de captura introduz e se torna bastante perceptível. Eu tentei a solução sws_flags, mas apenas corrige o bloqueio. Também tentei virar o vídeo horizontalmente antes da conversão, na esperança de que ele revertesse a direção da mudança, sem efeito.

Então, eu preciso compensar os dois e deslocar o chroma para a esquerda. Eu já vi exemplos de uso de overlay filter_complex mudando o vídeo inteiro , bem como a extração de planos de croma via lut_yuv, mas não consigo descobrir como mudar apenas o plano de chroma. Também não parece haver um modo "chroma" no filtro de mistura, o que me permitiria substituir o chroma pela versão modificada.

Log de conversão:

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

Imagem de origem: https://i.imgur.com/IShYK77.png

Você pode ver que já existe um deslocamento de 2px apenas no formato de captura YUY2

Conversão FFMpeg: https://i.imgur.com/ZtzcbSb.png

Agora é duas vezes maior

Seedmanc
fonte
Você pode mostrar imagens antes e depois? Além disso, a conversão do comando YUV-> RGB e seu log.
Gyan #
Editou a pergunta.
Seedmanc

Respostas:

2

O método básico para ajustar ou mudar o croma é usar o geqfiltro.

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

O croma é aumentado para o tamanho máximo e, em seguida, os planos individuais são extraídos. Nos geqfiltros, aplicados aos planos extraídos U e V, o valor de cada pixel é obtido do pixel à sua direita. Isso perderá os valores originais da coluna de pixels mais à esquerda. Finalmente, a luma original e os planos cromados processados ​​são mesclados. Usando algumas tentativas e erros, você poderá conseguir as compensações corretas.

Gyan
fonte