So verhindern Sie, dass ffmpeg beim Konvertieren von m2ts in mkv interlacing wird

Ich habe eine m2ts-Videodatei, die einen h264-Videostream und einen AC3-Audiostream enthält. Die Qualität ist nicht die beste, aber in Ordnung, aber die Konvertierung mit ffmpeg ohne zusätzliche Optionen macht das Video interlaced und damit sehr hässlich:

ffmpeg -i input.m2ts output.mkv

Ausgabe:

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

Zusätzliche Optionen wie Presets und crf haben daran nichts geändert und ich konnte im Internet nichts finden, außer dass ffmpeg immer progressiv verwenden soll, sofern nicht anders angegeben. Ich habe auch die Hardware-Transcodierung auf meiner GPU ausprobiert, wodurch die Transcodierung viel schneller wurde, aber das Ergebnis war ungefähr das gleiche, immer noch stark interlaced Video.

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

Irgendeine Idee, woran das liegen könnte und wie man es beheben kann? Das Hinzufügen -deinterlacehilft beim Interlacing, verschlechtert aber die Qualität.

FFmpeg erstellt kein Interlacing, es sei denn, Sie werden dazu aufgefordert. Zeigen Sie die vollständige Konsolenausgabe Ihres ersten Befehls an.
Ich habe die Ausgabe der Frage hinzugefügt.

Antworten (2)

Die Quelle ist interlaced. Um es zu deinterlacen, können Sie den yadifFilter verwenden.

So verwenden Sie es mit den Standardwerten:

ffmpeg -i input.m2ts -vf yadif=parity=auto output.mkv
Aber beim Betrachten der Eingabedatei in VLC ist das Interlacing nicht sichtbar, beim Betrachten der Ausgabe sieht es schrecklich aus. Könnte VLC die m2ts-Datei automatisch deinterlacen, aber nicht die von ffmpeg erzeugte mkv? Oder warum sollten die Ergebnisse sonst so aussehen?
Da die Quelle eine Interlaced-Feldreihenfolge enthält, kann VLC sie mit korrektem Deinterlacing anzeigen. Wenn Sie ohne Filter konvertieren, markiert ffmpeg die Ausgabe als progressiv, aber sie wurde nicht wirklich deinterlaced.
@Gyan, dieser Kommentar sollte in der Antwort enthalten sein, er liefert eine gute Erklärung dessen, was vor sich geht
Wenn ich dies versuche, kann ich kein geeignetes Ausgabeformat für „yadif=parity=auto“ finden.
Das ist ein Syntaxfehler - überprüfen Sie alle Argumente und -vor den Optionsnamen.

Sie können versuchen, es beim Decodierungsschritt mit dem folgenden Befehl über den CUVIDDeinterlacer zu deinterlacen:

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

Oder besser noch der yadif_cudaFilter, mit NVDECim Einsatz:

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

Beachten Sie, dass NVDEC im Gegensatz zu CUVID ein echtes HWAccel ist. Migrieren Sie nach Möglichkeit von CUVID zu NVDEC.

Oder verschachteln Sie weiter mit dem nächsten Befehl:

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

Notiz:

  1. Die obigen Änderungen am Encoder in Bezug auf Voreinstellungen, den Tune-Wert und den ausgewählten Ratensteuerungsmodus sind erforderlich, da das ffnvcodecPaket und die NVENC-Wrapper-Implementierungen von FFmpeg erfordern, dass gültige Werte festgelegt werden. Wenn Sie dies nicht tun, wird ein Fehler ausgegeben: „Der angegebene rc-Modus ist veraltet. Verwenden Sie stattdessen -rc constqp/cbr/vbr, -tuneund -multipass“ und Ihre Transcodierung schlägt fehl.

  2. Interlaced-Codierung für NVENC wird auf Turing und höher nicht unterstützt . Um Interlaced-Inhalte unverändert zu codieren, verwenden Sie eine Pascal-GPU oder niedriger.