Как остановить чересстрочную развертку ffmpeg при конвертации из m2ts в mkv

У меня есть видеофайл m2ts, который содержит видеопоток h264 и аудиопоток ac3. Качество не самое лучшее, но ладно, но конвертация с помощью ffmpeg без всяких дополнительных опций делает видео чересстрочным и очень некрасивым при этом:

ffmpeg -i input.m2ts output.mkv

Вывод:

ffmpeg version 3.2.2 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 6.2.1 (GCC) 20160916 (Red Hat 6.2.1-2)
  configuration: --arch=x86_64 --bindir=/usr/bin --datadir=/usr/share/ffmpeg --disable-debug --disable-static --disable-stripping --enable-avfilter --enable-avresample --enable-bzlib --enable-cuda --enable-cuvid --enable-libnpp --enable-doc --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gpl --enable-iconv --enable-libass --enable-libbluray --enable-libcdio --enable-libdc1394 --enable-libebur128 --enable-libfdk-aac --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libkvazaar --enable-libmfx --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libv4l2 --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxcb-shm --enable-libxcb-xfixes --enable-libxcb-shape --enable-libxvid --enable-libzvbi --enable-lzma --enable-nonfree --enable-openal --enable-opencl --enable-nvenc --enable-opengl --enable-postproc --enable-pthreads --enable-sdl2 --enable-shared --enable-version3 --enable-x11grab --enable-xlib --enable-zlib --extra-cflags='-I/usr/include/nvenc -I/usr/include/cuda' --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --optflags='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --prefix=/usr --shlibdir=/usr/lib64 --enable-runtime-cpudetect
  libavutil      55. 34.100 / 55. 34.100
  libavcodec     57. 64.101 / 57. 64.101
  libavformat    57. 56.100 / 57. 56.100
  libavdevice    57.  1.100 / 57.  1.100
  libavfilter     6. 65.100 /  6. 65.100
  libavresample   3.  1.  0 /  3.  1.  0
  libswscale      4.  2.100 /  4.  2.100
  libswresample   2.  3.100 /  2.  3.100
  libpostproc    54.  1.100 / 54.  1.100
Input #0, mpegts, from 'input.m2ts':
  Duration: 01:15:49.44, start: 0.984822, bitrate: 19636 kb/s
  Program 1 
    Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p(tv, bt709, top first), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 50 tbr, 90k tbn, 50 tbc
Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 384 kb/s
File 'output.mkv' already exists. Overwrite ? [y/N] y
[libx264 @ 0xf21240] using SAR=1/1
[libx264 @ 0xf21240] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 AVX2 LZCNT BMI2
[libx264 @ 0xf21240] profile High, level 4.0
[libx264 @ 0xf21240] 264 - core 148 - H.264/MPEG-4 AVC codec - Copyleft 2003-2016 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=18 lookahead_threads=3 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, matroska, to 'output.mkv':
  Metadata:
    encoder         : Lavf57.56.100
    Stream #0:0: Video: h264 (libx264) (H264 / 0x34363248), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=-1--1, 25 fps, 1k tbn, 25 tbc
    Metadata:
      encoder         : Lavc57.64.101 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
    Stream #0:1: Audio: vorbis (libvorbis) (oV[0][0] / 0x566F), 48000 Hz, stereo, fltp
    Metadata:
      encoder         : Lavc57.64.101 libvorbis
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (ac3 (native) -> vorbis (libvorbis))
Press [q] to stop, [?] for help

Дополнительные параметры, такие как пресеты и crf, не изменили этого, и я не смог найти ничего в Интернете, кроме того, что ffmpeg должен всегда использовать прогрессивный, если не указано иное. Я также попробовал аппаратное перекодирование на своем графическом процессоре, что сделало перекодирование намного быстрее, но результат был примерно таким же, все еще сильно чересстрочное видео.

ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input.m2ts -c:v hevc_nvenc -preset slow output.mkv

Любая идея, что может быть причиной этого и как это исправить? Добавление -deinterlaceпомогает с чересстрочностью, но ухудшает качество.

FFmpeg не будет создавать чересстрочную развертку, если не будет сказано об этом. Покажите полный консольный вывод вашей первой команды.
Я добавил вывод к вопросу.

Ответы (2)

Источник чересстрочный. Для деинтерлейса можно использовать yadifфильтр.

Чтобы использовать его со значениями по умолчанию:

ffmpeg -i input.m2ts -vf yadif=parity=auto output.mkv
Но при просмотре входного файла в VLC чересстрочности не видно, при просмотре вывода - выглядит ужасно. Может ли VLC автоматически деинтерлейсировать файл m2ts, но не mkv, созданный ffmpeg? Или почему еще результаты должны выглядеть так?
Поскольку источник содержит чересстрочный порядок полей, VLC может отображать его с правильным деинтерлейсингом. При преобразовании без фильтра ffmpeg помечает вывод как прогрессивный, но на самом деле он не будет деинтерлейсирован.
@Gyan, этот комментарий должен быть в ответе, он дает хорошее объяснение того, что происходит.
Я получаю Невозможно найти подходящий выходной формат для 'yadif=parity=auto' при попытке сделать это.
Это синтаксическая ошибка - дважды проверьте все аргументы и -перед именами опций.

Вы можете попробовать деинтерлейсировать его на этапе декодирования с помощью следующей команды через CUVIDдеинтерлейсер:

ffmpeg -hwaccel cuvid -c:v h264_cuvid -deint 2 -drop_second_field 1 \
-i input.m2ts -c:v hevc_nvenc -qp:v 19 -rc:v constqp \
-tune:v hq -preset:v p7 output.mkv

Или, что еще лучше, yadif_cudaфильтр с NVDECиспользованием:

ffmpeg -threads 1 -hwaccel nvdec -hwaccel_output_format cuda -i input.m2ts \
-vf 'yadif_cuda=0:-1:0' -c:v hevc_nvenc \
-qp:v 19 -rc:v constqp -tune:v hq -preset:v p7 \
-b:v 0 output.mkv

Обратите внимание, что NVDEC — это настоящий HWAccel, в отличие от CUVID. По возможности переходите с CUVID на NVDEC.

Или продолжайте чередовать следующую команду:

ffmpeg -i input.m2ts -flags +ildct -c:v hevc_nvenc -preset:v p7 \
-tune:v hq -rc:v constqp -b:v 0 -qp:v 19 output.mkv

Примечание:

  1. Вышеупомянутые изменения кодировщика, касающиеся предустановок, значения настройки и выбранного режима управления скоростью, необходимы, поскольку реализация ffnvcodecпакета и оболочки NVENC FFmpeg требует установки допустимых значений. Несоблюдение этого требования приведет к ошибке: «Указанный режим rc устарел. Используйте вместо этого -rc constqp/cbr/vbr, -tuneи -multipass», и ваш транскод завершится ошибкой.

  2. Чересстрочное кодирование для NVENC не поддерживается на Turing и выше . Чтобы кодировать чересстрочный контент как есть, используйте графический процессор Pascal или ниже.