6 votes

Optimiser la taille des fichiers vidéo sans perte de qualité

Existe-t-il un moyen simple (en ligne de commande - je veux écrire un script qui compresse toutes les vidéos d'un dossier) de réduire la taille des fichiers d'une vidéo (presque) sans perte de qualité ? Existe-t-il une méthode qui fonctionne aussi bien pour différents formats vidéo (mp4, flv, m4v, mpg, mov, avi) ?

Je dois préciser que la plupart des vidéos que j'aimerais compresser sont des vidéos web téléchargées (mp4, flv), il n'est donc pas certain qu'il y ait beaucoup de place pour une compression plus poussée.

4voto

Mufaka Points 54

Dans le pays mystique de la PNG, le moyen le plus efficace pour près de -La compression sans perte consiste à compresser l'image avec presque toutes les combinaisons possibles de paramètres et à comparer le résultat. C'est ce que font des applications comme pngcrush faire.

Il n'y a aucune raison pour qu'un processus similaire ne fonctionne pas, sur le papier. Dans la pratique, quelques problèmes se posent :

  • La compression d'une vidéo est déjà un processus beaucoup plus long que l'encodage d'une image PNG.
  • Il existe environ 1000 fois plus de combinaisons de configuration.
  • Ces deux éléments conspirent pour rendre le processus exponentiellement plus long de plusieurs puissances.
  • Il utiliserait également une quantité déraisonnable d'espace disque, de mémoire et de temps CPU.
  • Les images se mélangent en cas de changement de fréquence et changent évidemment si vous modifiez la taille de l'image ou si vous recadrez, ce qui rend le processus de comparaison encore plus difficile.

Pour couronner le tout, vous avez affaire à un contenu déjà empoisonné par des artefacts et des boues d'encodage. Ma réponse simple à la question "Existe-t-il un moyen simple ?" doit être "Non".

Mais si vous avez un grand nombre de vidéos à faible compression comme FLV (une compression assez mauvaise d'après mon expérience avec ce format), cela peut valoir la peine d'essayer avec ffmpeg o mencoder pour les FLV. Quelque chose comme ceci pourrait fonctionner :

find -iname '*.flv' -exec \
    mencoder {} -o {}.recomp.avi -ovc x264 -x264encopts threads=9:bitrate=400 -oac mp3lame -lameopts abr:br=52 \;

Mais il y aura des pertes. Il vous suffit de juger de ce qui est acceptable.

2voto

Elder Geek Points 34144

Vous pouvez aussi le faire avec avconv en vous basant sur
avconv -i <sourcefile> -c:v libx264 -crf 23 output.mp4 vous pouvez ajuster la qualité vers le haut en réduisant le facteur crf (23 dans l'exemple) et vers le bas en l'augmentant.

Les valeurs peuvent être comprises entre 0 et 51, les valeurs les plus basses permettant d'obtenir une meilleure qualité (au prix d'une taille de fichier plus importante). Les valeurs normales se situent entre 18 et 28. La valeur par défaut de x264 est 23, vous pouvez donc l'utiliser comme point de départ.

Un script qui devrait vous permettre de passer à un format différent sans perte de qualité (mais avec peu ou pas de réduction de taille) serait

#!/bin/bash
echo "This script will attempt to copy the video and audio streams of all non-mkv files in the current directory to a mkv video container of the same name as the sources without overwriting."
read -p "Press any key to continue or CTRL-C to cancel"

for f in *.* 
    do
    name=$(echo "$f" | sed 's/\.[^\.]*$//')
    ext=$(echo "$f" | sed 's/^.*\.//')
    echo "$f is made up of the base $name and ends with $ext"
    target="$name.mkv"
    echo target = $target
        if  [ "$f" = "$target" ];
        then
            echo "$f=$target skipping overwrite"
        else 
            avconv -i "$f" -c:a copy -c:v copy "$name.mkv"
        fi
    done

Notez que les codecs audio et vidéo utilisés dans ce script sont les suivants copy Il n'y a donc pas lieu de procéder à un réencodage. Toute économie de taille sera minime et ne sera que le résultat d'un conteneur plus efficace que celui utilisé précédemment. Pour obtenir une réduction de la taille, un réencodage est nécessaire et vous devez ajuster le script en remplaçant c:v copy con -c:v libx264 -crf 23 (en adaptant la valeur de -crf à vos besoins, comme indiqué ci-dessus). N'hésitez pas à commenter ou à supprimer les lignes d'écho superflues.

Note : Les formats que vous mentionnez "mp4, flv, m4v, mpg, mov, avi" sont des conteneurs et n'ont que peu ou pas d'influence sur les codecs utilisés pour encoder les flux qu'ils contiennent. Une discussion sur le réencodage pour la réduction de la taille nécessiterait la connaissance des codecs contenus dans les conteneurs et devrait être évaluée au cas par cas.

Sources : Tests et http://slhck.info/articles/crf

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X