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

48

Je veux compresser un fichier AVI en MP4 en utilisant 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
Ahmet KAPIKIRAN
la source

Réponses:

60

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 de vprepréréglages (qui permettent de définir les valeurs par défaut des paramètres ffmpeg , et non des paramètres d'encodeur) n'est pas vraiment nécessaire. vous voulez généralement utiliser les -presetoptions 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 que vous utilisez crf 25, un facteur de taux constant qui vous donnera une qualité inférieure à celle par défaut pour le 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 qualité visuelle bien supérieure à celle d'un encodeur visuel MPEG-4 pour le même débit, mais en raison de la perte de génération, vous souhaiterez peut-être utiliser un débit encore plus élevé que l'original - sinon, vous finirez 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 veut 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_aacn'est pas disponible, utilisez ceci à la place:

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 veryslowpréréglage, 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é.

slhck
la source
Si la taille de votre vidéo est plus petite après la conversion en deux passes, vous devez spécifier un débit binaire plus élevé. Essayez -b:v 3Mou plus; mais je recommanderais d'utiliser la méthode CRF au lieu de la variante à deux passes.
Slhck
10
@AhmetKa Une autre option est de simplement re-MUX les flux de conteneurs AVI à conteneur MP4: ffmpeg -i input.avi -c copy -map 0 output.mp4. Il n'y a pas de ré-encodage, donc pas de perte de qualité.
llogan
1
@ AhmetKa J'aurais dû mentionner que le multiplexage ne fonctionnera pas toujours si le format du conteneur de sortie ne prend pas en charge les formats de média de l'entrée. Voir Comparaison des formats de conteneur pour avoir une idée générale de ce qui fonctionne.
llogan
Bonjour à nouveau @slhck Crf n'est pas correctement. Débit, largeur, hauteur, etc. Puis-je calculer?
Ahmet KAPIKIRAN
3
@hyde Vous devriez préférer -c:a aac -strict experimentalau lieu de libvo_aacenc, car il offre une meilleure qualité.
Slhck