Comment puis-je utiliser FFmpeg pour réduire la qualité de la vidéo H264 mais la conserver au format H264?

8

Je suis un noob complet du montage vidéo, alors pardonnez-moi si je demande quelque chose de ridicule.

Je reçois des clips vidéo à partir d'un boîtier enregistreur. Les clips sont des fichiers AVI:

Resolution: 1920 x 1080
Frames Per Second: 60
Video Format: ITU H.264
Audio Format: MPEG 1 Audio, Layer 3 (MP3)

La résolution et le FPS sont bien au-delà de ce dont j'ai besoin, j'essaie donc d'exécuter une commande pour réduire les choses:

ffmpeg -i highres.avi -r 30 -s 960x540 lowerres.avi

Cela réussit à me donner la résolution souhaitée, la fréquence d'images et la taille de fichier inférieure, mais cela a également dégradé la qualité beaucoup plus que ce à quoi je m'attendais.

J'ai regardé le nouveau fichier et j'ai trouvé que pour une raison quelconque FFmpeg a converti le format utilisé:

Video Format: FFmpeg MPEG-4
Audio Format: MPEG 1 Audio, Layer 2

Je ne comprends pas pourquoi il n'utiliserait pas les mêmes formats de sortie que les formats d'entrée. J'ai essayé d'utiliser cette commande pour la forcer à utiliser H.264:

ffmpeg -i highres.avi -r 30 -s 960x540 -f h264 lowerresforceh264.avi

Malheureusement, il a échoué avec la sortie suivante:

ffmpeg version 0.7.3-4:0.7.3-0ubuntu0.11.10.1, Copyright (c) 2000-2011 the Libav developers
  built on Jan  4 2012 16:21:50 with gcc 4.6.1
  configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static
  WARNING: library configuration mismatch
  avutil      configuration: --extra-version='4:0.7.3ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-libopenjpeg --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdirac --enable-libmp3lame --enable-librtmp --enable-libx264 --enable-libxvid --enable-libvo-aacenc --enable-version3 --enable-libvo-amrwbenc --enable-version3 --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  avcodec     configuration: --extra-version='4:0.7.3ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-libopenjpeg --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdirac --enable-libmp3lame --enable-librtmp --enable-libx264 --enable-libxvid --enable-libvo-aacenc --enable-version3 --enable-libvo-amrwbenc --enable-version3 --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  avformat    configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  avdevice    configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  avfilter    configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  swscale     configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  postproc    configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  libavutil    51.  7. 0 / 51.  7. 0
  libavcodec   53.  6. 0 / 53.  6. 0
  libavformat  53.  3. 0 / 53.  3. 0
  libavdevice  53.  0. 0 / 53.  0. 0
  libavfilter   2.  4. 0 /  2.  4. 0
  libswscale    2.  0. 0 /  2.  0. 0
  libpostproc  52.  0. 0 / 52.  0. 0
Input #0, avi, from 'highres.avi':
  Metadata:
    comment         : Quality_GOOD
    encoder         : Lavf52.64.2
    encoded_by      : AverMedia_c281_1.7.2
  Duration: 00:01:59.28, start: 0.000000, bitrate: 10263 kb/s
    Stream #0.0: Video: h264 (High), yuv420p, 1920x1080, 59.94 fps, 59.94 tbr, 59.94 tbn, 119.88 tbc
    Stream #0.1: Audio: mp3, 48000 Hz, stereo, s16, 128 kb/s
[buffer @ 0x8f438a0] w:1920 h:1080 pixfmt:yuv420p
[scale @ 0x8f431e0] w:1920 h:1080 fmt:yuv420p -> w:960 h:540 fmt:yuv420p flags:0x4
[libx264 @ 0x8f0fb40] broken ffmpeg default settings detected
[libx264 @ 0x8f0fb40] use an encoding preset (e.g. -vpre medium)
[libx264 @ 0x8f0fb40] preset usage: -vpre <speed> -vpre <profile>
[libx264 @ 0x8f0fb40] speed presets are listed in x264 --help
[libx264 @ 0x8f0fb40] profile is optional; x264 defaults to high
Output #0, h264, to 'lowerresforceh264.avi':
    Stream #0.0: Video: libx264, yuv420p, 960x540, q=2-31, 200 kb/s, 90k tbn, 30 tbc
Stream mapping:
  Stream #0.0 -> #0.0
Error while opening encoder for output stream #0.0 - maybe incorrect parameters such as bit_rate, rate, width or height

Je ne sais pas pourquoi je ne peux pas faire ça. L'exécution de "ffmpeg -formats" répertoriait le h264 comme celui qu'il pouvait utiliser pour l'entrée et la sortie.

Si quelqu'un pouvait m'orienter dans la bonne direction, je l'apprécierais grandement. Merci.

PS: j'utilise FFmpeg version 0.7.3-4: 0.7.3-0 sur Ubuntu 11.10.

ÉDITER

J'ai trouvé une solution en regardant l'utilisation des presets. Après avoir recherché des informations sur les préréglages, j'ai trouvé le tutoriel suivant pour en discuter:

http://juliensimon.blogspot.com/2009/01/howto-ffmpeg-x264-presets.html

J'avais juste besoin de spécifier le codec et le paramètre de préréglage approprié comme ceci:

ffmpeg -i highres.avi -r 30 -s 960x540 -vcodec libx264 -vpre medium lowerresforceh264vpremedium.avi

J'ai encore quelques ajustements à faire, mais c'est essentiellement ce que je voulais. Merci.

BigBeagle
la source
Bien sûr, certaines personnes veulent simplement savoir comment convertir les fichiers Avermedia .avi .mp4 afin de jouer sur Mountain Lion / Mavericks <pre> ffmpeg -i 140203-1229.avi -vcodec copy -acodec copy fromavermedia_cog.mp4 </pre>

Réponses:

3

J'essaye d'aider. Tout d'abord, je ne comprends pas pourquoi vous dites que FFMPEG H.264 n'est pas le format d'entrée?

Je ne connais pas assez bien la ligne de commande FFMPEG (y a-t-il quelqu'un qui le sait?;)). Il doit y avoir un commutateur pour l'encodage multipasse. Je sais qu'il existe des préréglages intégrés que vous pourriez probablement utiliser et faire presque certainement ce que vous visez. Ceux-ci sont normalement appelés préréglages x264 ou mélodie x264. Pouvez-vous trouver quelque chose comme ça?

Zettt
la source
Merci. Votre exposé sur les préréglages m'a aidé à trouver une solution probable. Je vais modifier le message pour montrer ce que j'ai fait.
BigBeagle
Belle solution. Ajouté à ma collection d'extraits. Merci.
Zettt
2
@BigBeagle: Lorsque vous trouvez une réponse à votre question, vous pouvez la publier comme réponse. La modification de votre question est effectuée pour apporter plus de clarté à la question. Si je comprends bien, les réponses vont dans la section des réponses.
Nav
8

ffmpeg a supprimé ses préréglages x264 afin que le paramètre -vpre ne fonctionne plus.

Maintenant, j'ai un script pour convertir des fichiers vidéo dans un format que mon téléphone portable peut gérer.

ffmpeg -i input.avi -sws_flags lanczos+accurate_rnd -vf "scale=320:240" -c:v libx264 -crf 20 -preset veryslow -profile:v main -tune fastdecode -c:a copy output.mkv

Je vais expliquer chaque option

-sws_flags lanczos+accurate_rnd cette option est l'algorithme de réduction d'échelle, lanczos est recommandé car il produit le moins d'artefacts sans flou mais il est lent.

-vf "scale=..." est explicite, spécifiez la résolution de sortie

-crf 20c'est la qualité, 20 est un bon réglage de sortie final (ne l'utilisez pas avant l'édition), c'est une qualité constante et c'est la meilleure option lorsque la taille du fichier n'est pas serrée et produira une meilleure qualité à la taille de fichier la plus basse qu'autre chose , sinon, utilisez deux passes pour une qualité maximale à une taille de fichier spécifique (comme avoir besoin de l'adapter sur un CD ou un DVD), le débit binaire fixe (par exemple -b 2000k) ne doit être utilisé qu'en streaming, un cas spécial est '0' qui est sans perte et la plage de cette option va de 1 (qualité la plus élevée) à 50 (qualité la plus basse).

Un bon test pour cela consiste à exécuter l'encodage avec -crf 20, prenez note du débit binaire, puis utilisez-le comme paramètre -b pour une deuxième version du fichier, les deux doivent avoir la même taille de fichier, comparez les deux pour la qualité différences.

-preset veryslow cela choisit la quantité de CPU que vous souhaitez utiliser, plus elle est lente, plus la taille du fichier est petite et la meilleure qualité.

-profile:v mainc'est le profil H.264 à utiliser. haute est la taille de fichier la plus efficace, mais utilise beaucoup de CPU pour décoder par rapport aux autres formats, cela étant dit, c'est le plus populaire car la plupart des téléphones portables ont un décodeur matériel intégré et un lecteur flash le prend en charge, le mien ne le fait pas, donc je dois utiliser principal.

-tune fastdecode mon téléphone portable n'aime pas lire les fichiers sans cette option, mais généralement cela peut être laissé vide ou défini sur «film» pour les jeux vidéo, la principale raison pour laquelle vous l'utilisez est d'obtenir un peu de qualité supplémentaire.

Et la dernière chose que je recommanderais fortement d'utiliser un format de conteneur moderne .avi n'est pas conçu pour contenir H.264 et d'après ce que je comprends, il n'y a pas de norme pour stocker H.264 ou rendre le fichier plus grand que 2 Go, la plupart des implémentations sont des hacks et sujettes pour avoir des problèmes, utilisez mkv ou mp4.

Daniel Hill
la source
Les préréglages pour libx264 sont maintenant spécifiés par -presetas-preset slow
stib
-tune fastdecodedésactive le déblocage et les cadres B et P pondérés, ainsi que CABAC. Il existe des décodeurs qui peuvent gérer les trames B, mais pas CABAC? Je suggérerais -profile:v baseline, si vous avez besoin de cibler de vieux décodeurs matériels. ( fastdecodepeut être utile si vous ciblez un décodeur logiciel sur un processeur lent, mais pas un décodeur matériel.) Principal avec des trames B mais pas de déblocage ou CABAC peut ou peut ne pas être meilleur que la ligne de base avec déblocage. +1 pour recommander non AVI pour le stockage de h.264. IIRC, le principal est les images B, mais oui, le h.264 en avi n'est pas bien standardisé, et c'est hacky.
Peter Cordes
J'appellerais -crf 20une haute finale. Vous pouvez changer cela en 22 ou même 24 et probablement être bien, à moins que ce soit un mouvement élevé, comme un événement sportif.
user24601
2

Il y a certaines choses à préciser:

  • Un format n'est pas un codec; vous voulez obtenir un fichier au format avi avec une vidéo encodée avec le codec h264 . Utilisez simplement -vcodec libx264 et un nom de fichier avec .avi . Ffmpeg devrait reconnaître un format en regardant une extension de fichier, mais vous pouvez également être spécifique en ajoutant -f avi . Vous ne voulez certainement pas utiliser mpeg1, car cela donne une qualité pire que mpeg2 ou encore pire en comparaison avec mpeg4, que je recommande.
  • Votre problème était que ffmpeg utilisait juste la qualité la plus basse possible car vous n'en aviez pas spécifié. L'option -sameq semble rarement fonctionner pour moi. En fait, il est très difficile de régler manuellement le débit binaire. Ajoutez, par exemple, -vb 3000k pour obtenir un fichier avec un débit vidéo moyen de 3Mb / s, ce qui donne une assez bonne qualité. Je suppose qu'il serait encore suffisant pour vous d'avoir 2Mb / s pour la résolution mentionnée.
  • La clé pour réduire la taille du fichier n'est pas la résolution, mais le débit binaire mentionné ci-dessus. Je préfère m'en tenir à la résolution d'origine et simplement manipuler le débit binaire.
  • Je suppose que vous souhaitez également conserver l'audio sans conversion (donc sans perte de qualité), utilisez donc -acodec copy .

Essayez ceci: ffmpeg -i highres.avi -acodec copy -vcodec libx264 -vb 2000k lowerres.avi

Piotr
la source
4
Le débit binaire constant est le pire (en termes de qualité par rapport à la taille) de tous les modes de contrôle de débit en x264 et doit être évité. Utilisez -crfplutôt pour définir un mode de qualité constante.
slhck