FFmpeg: filter_complex дает худшее качество, чем vf

Я пытаюсь использовать FFmpeg для сложного транскодирования видео (например, для объединения нескольких файлов). Для этого я пытался использовать filter_complex, но заметил небольшое снижение качества по сравнению с тем, что я видел ранее при использовании обычного видеофильтра.

Чтобы перепроверить, я свел свою команду к простому перекодированию — одно с использованием filter_complex, а другое с использованием vf — и я подтвердил, что вывод сложный фильтр заметно размыт по сравнению с выходом обычного видеофильтра. Я не могу найти никакой документации FFmpeg, объясняющей это... кто-нибудь знает, почему это происходит и как я могу заставить filter_complex выводить видео того же качества, что и vf?

Команда с использованием обычного видеофильтра (vf):

ffmpeg -i input.ts -map_chapters -1 -f mpegts -an -sn -map 0:0 -vf "[in]yadif=deint=interlaced[out]" -vcodec libx264 -profile:v baseline -level 2 -b:v 800k output.ts

Вывод FFmpeg:

ffmpeg version 3.0 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 4.1.2 (GCC) 20070626 (Red Hat 4.1.2-14)
  configuration: --enable-gpl --enable-nonfree --enable-libx264 --enable-libfdk-aac --enable-libfaac --enable-libvpx --enable-encoder=vorbis --enable-libvorbis --enable-libmp3lame --enable-libspeex --disable-decoder=prores --disable-decoder=prores_lgpl --disable-ffplay --disable-ffserver --disable-shared --enable-static --extra-cflags=-I/local/build/include --extra-libs=-lfdk-aac --extra-ldflags=-L/local/build/lib --prefix=/local/build/install
  libavutil      55. 17.103 / 55. 17.103
  libavcodec     57. 24.102 / 57. 24.102
  libavformat    57. 25.100 / 57. 25.100
  libavdevice    57.  0.101 / 57.  0.101
  libavfilter     6. 31.100 /  6. 31.100
  libswscale      4.  0.100 /  4.  0.100
  libswresample   2.  0.101 /  2.  0.101
  libpostproc    54.  0.100 / 54.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'clip01.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.41.100
  Duration: 00:00:10.02, start: 0.023220, bitrate: 741 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 854x480 [SAR 1:1 DAR 427:240], 604 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
[libx264 @ 0x138a99e0] No 608/708 caption insertion into sei user data.
[libx264 @ 0x138a99e0] using SAR=1/1
[libx264 @ 0x138a99e0] frame MB size (54x30) > level limit (396)
[libx264 @ 0x138a99e0] MB rate (48600) > level limit (11880)
[libx264 @ 0x138a99e0] using cpu capabilities: MMX2 SSE2Fast SSSE3 Cache64
[libx264 @ 0x138a99e0] profile Constrained Baseline, level 2.0
Output #0, mpegts, to 'output.ts':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.25.100
    Stream #0:0(und): Video: h264 (libx264), yuv420p, 854x480 [SAR 1:1 DAR 427:240], q=-1--1, 800 kb/s, 30 fps, 90k tbn, 30 tbc (default)
    Metadata:
      handler_name    : VideoHandler
      encoder         : Lavc57.24.102 libx264
    Side data:
      unknown side data type 10 (24 bytes)
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
Press [q] to stop, [?] for help
frame=  300 fps=179 q=-1.0 Lsize=    1059kB time=00:00:10.03 bitrate= 864.9kbits/s speed=   6x    
video:949kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 11.660099%
[libx264 @ 0x138a99e0] frame I:2     Avg QP:23.16  size: 26978
[libx264 @ 0x138a99e0] frame P:298   Avg QP:23.09  size:  3079
[libx264 @ 0x138a99e0] mb I  I16..4: 44.3%  0.0% 55.7%
[libx264 @ 0x138a99e0] mb P  I16..4:  1.1%  0.0%  0.5%  P16..4: 28.7%  8.4%  2.1%  0.0%  0.0%    skip:59.3%
[libx264 @ 0x138a99e0] final ratefactor: 22.63
[libx264 @ 0x138a99e0] coded y,uvDC,uvAC intra: 30.8% 62.8% 23.0% inter: 7.2% 14.8% 0.3%
[libx264 @ 0x138a99e0] i16 v,h,dc,p: 25% 39% 11% 24%
[libx264 @ 0x138a99e0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 22% 29% 16%  5%  6%  7%  6%  4%  5%
[libx264 @ 0x138a99e0] i8c dc,h,v,p: 45% 29% 18%  8%
[libx264 @ 0x138a99e0] kb/s:777.19

Команда с использованием сложного фильтра:

ffmpeg -i input.ts -map_chapters -1 -f mpegts -filter_complex "[0:v:0]yadif=deint=interlaced[v0];[v0]concat=n=1:v=1:a=0[cat_v]" -an -sn -map "[cat_v]" -vcodec libx264 -profile:v baseline -level 2 -b:v 800k output.ts

Вывод FFmpeg:

ffmpeg version 3.0 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 4.1.2 (GCC) 20070626 (Red Hat 4.1.2-14)
  configuration: --enable-gpl --enable-nonfree --enable-libx264 --enable-libfdk-aac --enable-libfaac --enable-libvpx --enable-encoder=vorbis --enable-libvorbis --enable-libmp3lame --enable-libspeex --disable-decoder=prores --disable-decoder=prores_lgpl --disable-ffplay --disable-ffserver --disable-shared --enable-static --extra-cflags=-I/local/build/include --extra-libs=-lfdk-aac --extra-ldflags=-L/local/build/lib --prefix=/local/build/install
  libavutil      55. 17.103 / 55. 17.103
  libavcodec     57. 24.102 / 57. 24.102
  libavformat    57. 25.100 / 57. 25.100
  libavdevice    57.  0.101 / 57.  0.101
  libavfilter     6. 31.100 /  6. 31.100
  libswscale      4.  0.100 /  4.  0.100
  libswresample   2.  0.101 /  2.  0.101
  libpostproc    54.  0.100 / 54.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'clip01.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.41.100
  Duration: 00:00:10.02, start: 0.023220, bitrate: 741 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 854x480 [SAR 1:1 DAR 427:240], 604 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
[libx264 @ 0x81f5200] No 608/708 caption insertion into sei user data.
[libx264 @ 0x81f5200] using SAR=1/1
[libx264 @ 0x81f5200] frame MB size (54x30) > level limit (396)
[libx264 @ 0x81f5200] MB rate (48600) > level limit (11880)
[libx264 @ 0x81f5200] using cpu capabilities: MMX2 SSE2Fast SSSE3 Cache64
[libx264 @ 0x81f5200] profile Constrained Baseline, level 2.0
Output #0, mpegts, to 'output.ts':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.25.100
    Stream #0:0: Video: h264 (libx264), yuv420p, 854x480 [SAR 1:1 DAR 427:240], q=-1--1, 800 kb/s, 30 fps, 90k tbn, 30 tbc (default)
    Metadata:
      encoder         : Lavc57.24.102 libx264
    Side data:
      unknown side data type 10 (24 bytes)
Stream mapping:
  Stream #0:0 (h264) -> yadif
  concat -> Stream #0:0 (libx264)
Press [q] to stop, [?] for help
frame=  300 fps=179 q=-1.0 Lsize=    1059kB time=00:00:10.03 bitrate= 864.9kbits/s speed=   6x    
video:949kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 11.660099%
[libx264 @ 0x81f5200] frame I:2     Avg QP:23.16  size: 26978
[libx264 @ 0x81f5200] frame P:298   Avg QP:23.09  size:  3079
[libx264 @ 0x81f5200] mb I  I16..4: 44.3%  0.0% 55.7%
[libx264 @ 0x81f5200] mb P  I16..4:  1.1%  0.0%  0.5%  P16..4: 28.7%  8.4%  2.1%  0.0%  0.0%    skip:59.3%
[libx264 @ 0x81f5200] final ratefactor: 22.63
[libx264 @ 0x81f5200] coded y,uvDC,uvAC intra: 30.8% 62.8% 23.0% inter: 7.2% 14.8% 0.3%
[libx264 @ 0x81f5200] i16 v,h,dc,p: 25% 39% 11% 24%
[libx264 @ 0x81f5200] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 22% 29% 16%  5%  6%  7%  6%  4%  5%
[libx264 @ 0x81f5200] i8c dc,h,v,p: 45% 29% 18%  8%
[libx264 @ 0x81f5200] kb/s:777.19

person Dasmowenator    schedule 15.11.2016    source источник
comment
Покажите полный вывод консоли.   -  person Gyan    schedule 15.11.2016
comment
Судя по показаниям, видеовыходы идентичны.   -  person Gyan    schedule 15.11.2016
comment
Вы бы так подумали, но это не так... в этом вся моя суть.   -  person Dasmowenator    schedule 15.11.2016
comment
Изображение из vf: postimg.org/image/6o2pfo34n Изображение из filter_complex: postimg.org/image/uds54d1hz Второй явно более размыт, чем первый.   -  person Dasmowenator    schedule 15.11.2016
comment
Я полагаю, что ваш плеер может вводить здесь какой-то сбой. Запустите ffmpeg -i vf.ts -i filtercomplex.ts -lavfi ssim -f null - и сообщите значения, напечатанные в конце выполнения команды.   -  person Gyan    schedule 16.11.2016
comment
Я виню плеер, потому что статистика от энкодера по двум командам идентична. Если бы один был более размытым, вероятность того, что эти значения будут идентичными, была бы астрономической.   -  person Gyan    schedule 16.11.2016


Ответы (1)


Я понял это. Это связано с тем, что алгоритм масштабирования по умолчанию изменился с bicubic на bilinear. Все, что мне нужно было сделать, это добавить flags=bicubic, и теперь он выглядит так же.

person Dasmowenator    schedule 16.11.2016