Cómo evitar que ffmpeg se entrelace al convertir de m2ts a mkv

Tengo un archivo de video m2ts que contiene una transmisión de video h264 y una transmisión de audio ac3. La calidad no es la mejor, pero está bien, pero convertirlo con ffmpeg sin opciones adicionales hace que el video se entrelace y quede muy feo con eso:

ffmpeg -i input.m2ts output.mkv

Producción:

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

Las opciones adicionales, como ajustes preestablecidos y crf, no cambiaron eso y no pude encontrar nada en Internet, excepto que se supone que ffmpeg siempre debe usar progresivo a menos que se indique lo contrario. También probé la transcodificación de hardware en mi GPU, lo que hizo que la transcodificación fuera mucho más rápida, pero el resultado fue casi el mismo, pero con un video fuertemente entrelazado.

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

¿Alguna idea de qué podría estar causando esto y cómo solucionarlo? Agregar -deinterlaceayuda con el entrelazado, pero empeora la calidad.

FFmpeg no creará entrelazado a menos que se le indique. Muestre la salida completa de la consola de su primer comando.
Agregué el resultado a la pregunta.

Respuestas (2)

La fuente está entrelazada. Para desentrelazarlo, puedes usar el yadiffiltro.

Para usarlo con los valores predeterminados:

ffmpeg -i input.m2ts -vf yadif=parity=auto output.mkv
Pero al mirar el archivo de entrada en VLC, el entrelazado no es visible, al mirar la salida, se ve terrible. ¿Podría VLC desentrelazar automáticamente el archivo m2ts pero no el mkv producido por ffmpeg? ¿O por qué más los resultados se verían así?
Dado que la fuente contiene un orden de campo entrelazado, VLC puede mostrarlo con el desentrelazado correcto. Al convertir sin filtro, ffmpeg marcará la salida como progresiva, pero en realidad no habrá sido desentrelazada.
@Gyan, ese comentario debería estar en la respuesta, proporciona una buena explicación de lo que está pasando
Obtengo No se puede encontrar un formato de salida adecuado para 'yadif=parity=auto' cuando intento esto.
Eso es un error de sintaxis: verifique dos veces todos los argumentos y -delante de los nombres de las opciones.

Puede intentar desentrelazarlo en el paso de decodificación con el siguiente comando, a través del CUVIDdesentrelazador:

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

O mejor aún, el yadif_cudafiltro, con NVDECen uso:

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

Tenga en cuenta que NVDEC es un verdadero HWAccel, a diferencia de CUVID. Siempre que sea posible, migre de CUVID a NVDEC.

O sigue entrelazando con el siguiente comando:

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

Nota:

  1. Los cambios anteriores en el codificador, con respecto a los ajustes preestablecidos, el valor de sintonización y el modo de control de velocidad seleccionado, son necesarios, ya que el ffnvcodecpaquete y las implementaciones del envoltorio NVENC de FFmpeg requieren que se establezcan valores válidos. Si no lo hace, se producirá un error: "El modo rc especificado está en desuso. Use -rc constqp/cbr/vbr, -tuney -multipassen su lugar" y su transcodificación fallará.

  2. La codificación entrelazada para NVENC no es compatible con Turing y superior . Para codificar contenido entrelazado tal cual, use una GPU Pascal o inferior.