web-dev-qa-db-fra.com

Convertir AVI (Xvid) en MP4 (H.264) en conservant la même qualité

Je veux compresser un fichier AVI en MP4 à l'aide d'un codec h.264. Je ne pouvais pas obtenir la même qualité. Comment puis-je le compresser?

Vidéo originale:

Écran vidéo original:

Sortie de la console FFmpeg (ffmpeg -i input.avi):

FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
  configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree                                                                                         --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopenc                                                                                        ore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libop                                                                                        enjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264                                                                                         --enable-libxvid --enable-zlib --enable-filter=drawtext
  libavutil     50.36. 0 / 50.36. 0
  libavcore      0.16. 1 /  0.16. 1
  libavcodec    52.108. 0 / 52.108. 0
  libavformat   52.93. 0 / 52.93. 0
  libavdevice   52. 2. 3 / 52. 2. 3
  libavfilter    1.74. 0 /  1.74. 0
  libswscale     0.12. 0 /  0.12. 0
[mpeg4 @ 0x626b50] Invalid and inefficient vfw-avi packed B frames detected
Input #0, avi, from 'input.avi':
  Metadata:
    encoder         : VirtualDubMod 1.5.10.2 (build 2542/release)
  Duration: 01:32:38.13, start: 0.000000, bitrate: 2094 kb/s
    Stream #0.0: Video: mpeg4, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 23.98 tbr,                                                                                         23.98 tbn, 23.98 tbc
    Stream #0.1: Audio: ac3, 44100 Hz, 5.1, s16, 384 kb/s
At least one output file must be specified

Test 1

Commande FFmpeg:

ffmpeg -i input.avi -vcodec libx264 -vpre lossless_slow -crf 25 -acodec libfaac -threads 0 -t 60 1.mp4

Test 1 écran:

Sortie de la console FFmpeg (ffmpeg -i 1.mp4)

    FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
  configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libopenjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-filter=drawtext
  libavutil     50.36. 0 / 50.36. 0
  libavcore      0.16. 1 /  0.16. 1
  libavcodec    52.108. 0 / 52.108. 0
  libavformat   52.93. 0 / 52.93. 0
  libavdevice   52. 2. 3 / 52. 2. 3
  libavfilter    1.74. 0 /  1.74. 0
  libswscale     0.12. 0 /  0.12. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
  Duration: 00:01:00.01, start: 0.000000, bitrate: 618 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 437 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(und): Audio: aac, 44100 Hz, 5.1, s16, 176 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
At least one output file must be specified

Test 2

Commande FFmpeg:

ffmpeg -y -i input.avi -pass 1 -vcodec libx264 -vpre slow -b 2000k -threads 0 -t 60 -f mp4 -an -y /dev/null
ffmpeg -y -i input.avi -pass 2 -vcodec libx264 -vpre slow -b 2000k -threads 0 -t 60 -acodec libfaac -ab 128k -ac 2 2.mp4

Écran Test 2:

Sortie de la console FFmpeg (ffmpeg -i 2.mp4)

FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
  configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libopenjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-filter=drawtext
  libavutil     50.36. 0 / 50.36. 0
  libavcore      0.16. 1 /  0.16. 1
  libavcodec    52.108. 0 / 52.108. 0
  libavformat   52.93. 0 / 52.93. 0
  libavdevice   52. 2. 3 / 52. 2. 3
  libavfilter    1.74. 0 /  1.74. 0
  libswscale     0.12. 0 /  0.12. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '2.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
  Duration: 00:01:00.01, start: 0.000000, bitrate: 1097 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 1028 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 63 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
At least one output file must be specified
42
Ahmet KAPIKIRAN

Tout d’abord, installez une version plus récente de FFmpeg - récupérez une version statique à partir de la page de téléchargement .

L'utilisation des paramètres prédéfinis vpre (qui permet de définir les valeurs par défaut de ffmpeg settings, et non des paramètres d'encodeur) n'est pas vraiment nécessaire; vous voulez généralement utiliser les options -preset définies par les encodeurs.

Les raisons pour lesquelles vous obtenez une faible qualité de sortie sont les suivantes, respectivement pour vos deux cas:

  1. Dans le premier cas, vous utilisez crf 25, un facteur de taux constant qui vous donnera une qualité inférieure à celle par défaut du codeur x264 (qui est 23). Le CRF contrôle la qualité. Essayez de définir un CRF plus faible, peut-être 20, 18, etc. Ici, plus bas signifie une meilleure qualité, mais cela augmentera la taille du fichier. Un changement de 6 dans le CRF vous donne grossièrement deux fois/moitié le débit moyen initial.

    Vous devrez définir un CRF inférieur en raison de la perte de génération . Vous encodez quelque chose qui était déjà encodé, alors vous jetez à nouveau des informations visuelles. Ce n'est jamais bon, mais si vous devez le faire, vous devrez définir une qualité supérieure afin de ne pas supprimer trop d'informations de la vidéo d'entrée.

  2. Dans le second cas, vous essayez de définir un débit binaire constant de 2 Mbits/s. Votre vidéo d'entrée a à peu près le même débit. Maintenant, x264 offre une bien meilleure qualité visuelle qu’un encodeur visuel MPEG-4 pour le même débit, mais en raison de la perte de génération, il peut être utile d’utiliser un débit encore plus élevé que l’original - sinon, finira par compresser trop d’informations.

    De plus, l'encodage à débit constant peut donner à certains passages une belle apparence, mais à d'autres parties de la vidéo une apparence pire. Si vous ne laissez pas l'encodeur choisir librement le nombre de bits qu'il souhaite dépenser pour quelque chose, vous sacrifierez la qualité au détriment de la taille du fichier cible.

    x264 a un mode de débit constant, mais il est considéré comme inférieur aux autres méthodes de codage. En réalité, le codage en deux passes ne vise pas à obtenir une qualité optimale.

Tout cela étant dit, essayez ce qui suit:

ffmpeg -i input.avi -c:v libx264 -crf 19 -preset slow -c:a libfdk_aac -b:a 192k -ac 2 out.mp4

Si libfdk_aac n'est pas disponible, utilisez plutôt ceci:

ffmpeg -i input.avi -c:v libx264 -crf 19 -preset slow -c:a aac -b:a 192k -ac 2 out.mp4

Le bouton de contrôle de qualité principal sera votre réglage CRF. Expérimentez avec cela et utilisez une valeur inférieure si vous avez besoin d'une meilleure qualité.

Vous pouvez également choisir le paramètre prédéfini veryslow, ce qui vous donnera une meilleure compression, mais l'encodage prendra évidemment plus de temps.

Si vous ne parvenez pas à obtenir un fichier de qualité décente à une taille de fichier raisonnable, vous n’avez pas de chance. Mieux vaut conserver le fichier original tel quel, sans réencodage. Il n'y a pas de magie "garder la même qualité" outil lorsque vous compressez quelque chose qui est déjà compressé.

57
slhck