Rééchantillonnage de la vidéo H264 pour réduire le taux de trame tout en maintenant une haute qualité d'image

Voici la sortie de 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

j'aimerais utiliser ffmpeg, mencoder, ou un autre transcodeur vidéo en ligne de commande pour rééchantillonner cette vidéo à un cadrat plus bas sans perte de image la qualité. C'est, chaque image doit rester aussi nette que possible.

Essaie

ffmpeg -i foo.mov -r 25 -vcodec copy bar.mov
  • le taux cible de trames -- 25fps -- est atteint, mais les trames individuelles sont "anguleux."
mencoder -nosound -ovc copy foo.mov -ofps 25 -o bar.mov
  • les vidéos sont effectivement inaltérables.

Help!

Cela semble assez simple cas d'utilisation. Je suis très surpris que les choses évidentes ne fonctionnent pas. Quelque chose ne va pas avec mon approche?

30
demandé sur BrianTheLion 2012-06-13 00:14:48

3 réponses

beaucoup de choses ont changé depuis cet affichage en 2012. J'ajoute cette réponse pour les gens comme moi qui trouvent cela dans les moteurs de recherche. J'ai eu de la chance avec le code suivant:

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 : débit de sortie (en trames par seconde))
  • -s 160x90: Taille du cadre de sortie ( en pixel) - insère le mise à l'échelle vidéo filtre
  • -c:v libx264 : encodeur vidéo de sortie
    • -c:v est l'abréviation de -codec:v et -vcodec
  • -b:v 3M : bitrate vidéo (en bit/s) passé à libx264 codeur
  • -strict -2: régit la conformité aux normes;-2 permet les caractéristiques expérimentales - requis pour activer L'AAC natif FFmpeg encoder audio dans des constructions plus anciennes que la version 2015-12-05, voir ici, AAC est maintenant l'encodeur audio par défaut.
  • -movflags faststart : déplacer l'index vers le début du fichier de sortie (mov et mp4 format paramètre spécifique)

Pour plus de détails, voir documents officiels.

74
répondu CodeMed 2016-03-31 14:55:56

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 perceptible.

tout d'abord, assurez-vous que vous n'utilisez pas de vieux 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'encodage vidéo le plus avancé disponible. C'est probablement ce que mplayer utilise, mais vous pouvez obtenir la version la plus récente de www.x264.nl

D'abord, j'utiliserais VirtualDub pour décompresser vers un type de vidéo sans perte, ce qui fera un assez gros fichier. VirtualDub peut également réduire la cadence. Voir ici.

Ensuite, utiliser ce que l'entrée de x264. Je vous suggère d'utiliser le helper logiciel comme Staxrip (mettez le plus récent x264 de 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 êtes peu susceptible de remarquer la différence, utilisez un ligne de commande comme ceci (avec x264):

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

Staxrip a des options pour basculer le preset vers le placebo, accorder pour les sources de film (en supposant que ce n'est pas une animation bien sûr), et pour réduire le nombre de thread à 1.

Vous pouvez changer "-- crf 22 " en 21 pour une vidéo plus grande et de meilleure qualité, mais J'ai trouvé que le CRF22 est à peu près le point où j'ai du mal à remarquer la différence, même en comparant image par image. Tout changement dans les autres paramètres réduira probablement qualité ou augmenter la taille du fichier sans boost dans la qualité. Augmenter le nombre de threads va fortement améliorer la vitesse d'encodage (sur les systèmes multi-core évidemment), mais va très légèrement réduire la qualité (ou dans ce cas, parce que nous utilisons CRF qui est basé sur la qualité, va augmenter 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'elles font, et même si elles did, ils ne disposent pas de la puissance CPU nécessaire pour faire un encodage avec ces paramètres, de sorte qu'en plus de la réduction modeste de la taille du fichier par réduction du taux de trame, 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 grand. Vous pourriez tout aussi bien à zip La sortie de VirtualDub (enfin, pas si mal!).

5
répondu Charles Burns 2012-06-12 22:25:26

vous avez besoin de transcoder votre vidéo dans tous les cas. Le transcodage signifie que vous décoderez votre flux, changerez framerate (déposez les cadres dans le cas simple) et le coderez à nouveau. Encodage de la configuration et même codec ne dépend pas de la façon dont votre vidéo a été encodé initialement, de sorte que vous pouvez utiliser tout ce qui convient à vos besoins. Si vous avez besoin de la plus haute qualité possible, il suffit d'encoder avec un profil élevé comme la première tentative. Ensuite, vous pouvez essayer de régler ce encore plus de jeu avec de nombreux H. 264 encodage paramètre.

0
répondu Andriy Tylychko 2012-06-12 22:05:20