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 -deinterlace
ayuda con el entrelazado, pero empeora la calidad.
La fuente está entrelazada. Para desentrelazarlo, puedes usar el yadif
filtro.
Para usarlo con los valores predeterminados:
ffmpeg -i input.m2ts -vf yadif=parity=auto output.mkv
-
delante de los nombres de las opciones.Puede intentar desentrelazarlo en el paso de decodificación con el siguiente comando, a través del CUVID
desentrelazador:
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_cuda
filtro, con NVDEC
en 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:
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 ffnvcodec
paquete 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
, -tune
y -multipass
en su lugar" y su transcodificación fallará.
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.
gian
Jan Christian Grünhage