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?
É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
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
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
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:
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.
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é.