web-dev-qa-db-fra.com

Rééchantillonnage vidéo H264 pour réduire la fréquence d'images tout en conservant une qualité d'image élevée

Voici la sortie mplayer pour une vidéo d'intérêt:

br@carina:/tmp$ mplayer foo.mov 
mplayer: Symbol `ff_codec_bmp_tags' has different size in shared object, consider re-linking
MPlayer 1.0rc4-4.5.2 (C) 2000-2010 MPlayer Team
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

Playing foo.mov.
libavformat file format detected.
[lavf] stream 0: video (h264), -vid 0
[lavf] stream 1: audio (aac), -aid 0, -alang eng
VIDEO:  [H264]  1280x720  24bpp  59.940 fps  2494.2 kbps (304.5 kbyte/s)
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
==========================================================================
==========================================================================
Opening audio decoder: [faad] AAC (MPEG2/4 Advanced Audio Coding)
AUDIO: 44100 Hz, 2 ch, s16le, 128.0 kbit/9.07% (ratio: 15999->176400)
Selected audio codec: [faad] afm: faad (FAAD AAC (MPEG-2/MPEG-4 Audio))
==========================================================================
AO: [Pulse] 44100Hz 2ch s16le (2 bytes per sample)
Starting playback...
Movie-Aspect is 1.78:1 - prescaling to correct movie aspect.
VO: [vdpau] 1280x720 => 1280x720 Planar YV12

Je voudrais utiliser ffmpeg, mencoder ou un autre transcodeur vidéo en ligne de commande pour rééchantillonner cette vidéo à un débit d'images inférieur sans perte de la qualité image. Autrement dit, chaque image doit rester aussi nette que possible.

Tentatives

ffmpeg -i foo.mov -r 25 -vcodec copy bar.mov
  • La fréquence d'images cible - 25 ips - est atteinte mais les images individuelles sont "en bloc".
mencoder -nosound -ovc copy foo.mov -ofps 25 -o bar.mov
  • Les vidéos sont effectivement invisibles.

Aidez-moi!

Cela semble être un cas d'utilisation assez simple. Je suis très surpris que les choses évidentes ne fonctionnent pas. Y a-t-il un problème avec mon approche?

34
BrianTheLion

Beaucoup de choses ont changé depuis cette publication en 2012. J'ajoute cette réponse aux personnes comme moi qui trouvent cela dans les moteurs de recherche. J'ai eu de la chance avec ce qui suit:

ffmpeg -y -i source.mp4 -r 25 -s 160x90 -c:v libx264 -b:v 3M -strict -2 -movflags faststart destination.mp4

Voici une brève explication de ce que fait chaque paramètre:

  • -y: écraser les fichiers de sortie sans demander
  • -i source.mp4: nom du fichier d'entrée
  • -r 25: cadence de sortie (en images par seconde)
  • -s 160x90: taille de l'image de sortie (en pixels) - insère le filtre vidéo à l'échelle
  • -c:v libx264: encodeur vidéo de sortie
    • -c:v est l'abréviation de -codec:v et -vcodec
  • -b:v 3M: débit vidéo (en bit/s) transmis à encodeur libx264
  • -strict -2: régit la conformité aux normes; -2 permet des fonctionnalités expérimentales - nécessaires pour activer l'encodeur audio FFmpeg AAC natif dans les versions antérieures à la version 2015-12-05, voir ici , AAC est maintenant l'encodeur audio par défaut .
  • -movflags faststart: déplace l'index au début du fichier de sortie ( format mov et mp4 paramètre spécifique)

Pour plus de détails, consultez la documentation officielle .

92
CodeMed

Comme Andy T l'a indiqué, vous devez absolument ré-encoder la vidéo, mais cela ne signifie pas que la qualité doit être réduite de manière notable.

Tout d'abord, assurez-vous que vous n'utilisez pas d'anciens logiciels. Les codecs vidéo sont un domaine en évolution rapide avec des avancées significatives toutes les quelques semaines. x264 est actuellement le logiciel d'encodeur vidéo le plus avancé disponible. C'est probablement ce que mplayer utilise, mais vous pouvez obtenir la dernière version réelle sur www.x264.nl

[ Edit: HEVC et AV1 sont désormais les technologies les plus avancées disponibles. Comme je l'ai dit, ce sont des champs qui évoluent rapidement!]

Tout d'abord, j'utiliserais VirtualDub pour décompresser en un type de vidéo sans perte, ce qui donnera un fichier assez volumineux. VirtualDub peut également réduire la fréquence d'images. Voir ici .

Ensuite, utilisez-le comme entrée pour x264. Je vous suggère d'utiliser un logiciel d'aide comme Staxrip (mettez le plus récent x264 32 bits 8 bits par canal dans StaxRip\Applications\x264.

Si vous voulez la meilleure qualité absolue avec la plus petite taille de fichier où vous ne remarquerez probablement pas la différence, utilisez une ligne de commande comme celle-ci (avec x264):

x264 --preset placebo --tune film --crf 22 --level 4.1 --threads 1 --thread-input --sar 12:11 --output "<target>" "<source>"

Staxrip propose des options pour basculer le préréglage sur placebo, régler les sources de film (en supposant que ce n'est pas une animation bien sûr) et réduire le nombre de threads à 1.

Vous pouvez changer "--crf 22" en 21 pour une vidéo plus grande et de meilleure qualité, mais j'ai trouvé que CRF22 était à un point où j'ai beaucoup de mal à remarquer la différence, même en comparant image par image. Tout changement dans les autres paramètres réduira probablement la qualité ou augmentera la taille du fichier sans augmenter la qualité. L'augmentation du nombre de threads grandement améliorera la vitesse d'encodage (sur les systèmes multicœurs évidemment), mais réduira très légèrement la qualité (ou dans ce cas, parce que nous utilisons CRF qui est basé sur la qualité , augmentera un peu la taille du fichier, comme moins de 1% pour 4 threads).

La plupart des entreprises qui encodent la vidéo ou qui fabriquent des produits qui encodent la vidéo n'ont vraiment aucune idée de ce qu'ils font, et même s'ils l'ont fait, ils n'ont pas la puissance CPU nécessaire pour effectuer un encodage avec ces paramètres, donc en plus du modeste réduction de la taille du fichier par réduction de la fréquence d'images, vous obtiendrez également une forte baisse de la taille du fichier en utilisant un encodeur intelligent avec les paramètres les plus stricts.

Si vous voulez être absolument certain que la vidéo résultante ressemble le plus possible à la sortie de VirtualDub, personne ne peut faire la différence en utilisant CRF17, mais le fichier sera assez volumineux. Vous pourriez aussi bien juste sortir la sortie de Zip VirtualDub (enfin, pas si mal!).

6
Charles Burns

Vous devez dans tous les cas transcoder votre vidéo. Le transcodage signifie que vous décoderez votre flux, changerez la fréquence d'images (supprimez les images dans le cas simple), puis le coderez à nouveau. La configuration de l'encodage et même le codec ne dépendent pas de la façon dont votre vidéo a été encodée initialement, vous pouvez donc utiliser tout ce qui convient à vos besoins. Si vous avez besoin de la meilleure qualité possible, encodez simplement avec un profil élevé lors de la première tentative. Ensuite, vous pouvez essayer d'affiner encore plus ce jeu avec de nombreux paramètres d'encodage h.264.

0
Andriy Tylychko