web-dev-qa-db-fra.com

Réencodage de la vidéothèque en x265 (HEVC) sans perte de qualité

J'essaie de convertir ma vidéothèque au format HEVC pour gagner de l'espace. J'ai exécuté la commande suivante sur tous les fichiers vidéo de ma bibliothèque:

#!/bin/bash
for i in *.mp4;
do 
    #Output new files by prepending "X265" to the names
    avconv -i "$i" -c:v libx265 -c:a copy X265_"$i"
done

Maintenant, la plupart des vidéos se convertissent bien et la qualité est la même qu'auparavant. Cependant, quelques vidéos de très haute qualité (par exemple, un film imprimé de 5 Go) perd en qualité - la vidéo est entièrement pixélisée.

Je ne sais pas quoi faire dans ce cas. Dois-je modifier le paramètre crf dans ma ligne de commande? Ou autre chose?

Le fait est que je fais une conversion en masse. Donc, j'ai besoin d'une méthode où avconv ajuste automatiquement le paramètre à ajuster, pour chaque vidéo.

UPDATE-1

J'ai trouvé que crf est le bouton que je dois régler. Le CRF par défaut est 28. Pour une meilleure qualité, je pourrais utiliser quelque chose de moins de 28. Par exemple:

avconv -i input.mp4 -c:v libx265 -x265-params crf=23 -c:a copy output.mp4

Cependant, le problème est que pour certaines vidéos, la valeur CRF de 28 est assez bonne, tandis que pour certaines vidéos, un CRF inférieur est requis. C'est quelque chose que je dois vérifier manuellement en convertissant de petites sections des grandes vidéos. Mais dans la conversion en masse, comment vérifier manuellement chaque vidéo? Est-ce un moyen pour que avconv puisse ajuster le CRF en fonction de la vidéo d'entrée intelligemment?

UPDATE-2

J'ai trouvé qu'il y a --lossless option dans x265: http://x265.readthedocs.org/en/default/lossless.html .

Cependant, je ne sais pas comment l'utiliser correctement. J'ai essayé de l'utiliser de la manière suivante, mais cela a donné des résultats opposés (la vidéo était encore plus pixélisée):

avconv -i input.mp4 -c:v libx265 -x265-params lossless -c:a copy output.mp4
47
shivams

D'après ma propre expérience, si vous ne voulez absolument aucune perte de qualité, --lossless est ce que vous recherchez.

Je ne suis pas sûr de avconv mais la commande que vous avez tapée est identique à ce que je fais avec FFmpeg. Dans FFmpeg, vous pouvez passer le paramètre comme ceci:

ffmpeg -i INPUT.mkv -c:v libx265 -preset ultrafast -x265-params lossless=1 OUTPUT.mkv

Plus x265 les commutateurs (options sans valeur) peuvent être spécifiés comme ceci (sauf ceux uniquement CLI, ceux-ci ne sont utilisés qu'avec x265 binaire directement).

Cela dit, j'aimerais partager mon expérience avec x265 encodage. Pour la plupart des vidéos (que ce soit WMV, MPEG ou AVC/H.264) j'utilise crf=23. x265 décide du reste des paramètres et généralement il fait un assez bon travail.

Cependant, souvent avant de m'engager à transcoder une vidéo dans son intégralité, je teste mes paramètres en convertissant une petite partie de la vidéo en question. Voici un exemple, supposons un fichier mkv avec le flux 0 étant la vidéo, le flux 1 étant DTS audio et le flux 2 étant un sous-titre:

ffmpeg -hide_banner \
-ss 0 \
-i "INPUT.mkv" \
-attach "COVER.jpg" \
-map_metadata 0 \
-map_chapters 0 \
-metadata title="TITLE" \
-map 0:0 -metadata:s:v:0 language=eng \
-map 0:1 -metadata:s:a:0 language=eng -metadata:s:a:0 title="Surround 5.1 (DTS)" \
-map 0:2 -metadata:s:s:0 language=eng -metadata:s:s:0 title="English" \
-metadata:s:t:0 filename="Cover.jpg" -metadata:s:t:0 mimetype="image/jpeg" \
-c:v libx265 -preset ultrafast -x265-params \
crf=22:qcomp=0.8:aq-mode=1:aq_strength=1.0:qg-size=16:psy-rd=0.7:psy-rdoq=5.0:rdoq-level=1:merange=44 \
-c:a copy \
-c:s copy \
-t 120 \
"OUTPUT.HEVC.DTS.Sample.mkv"

Notez que la ligne de signal des barres obliques inversées se rompt dans une commande longue, je le fais pour m'aider à garder une trace des différents bits d'une entrée CLI complexe. Avant de l'expliquer ligne par ligne, la partie où vous ne convertissez qu'une petite partie d'une vidéo est la deuxième ligne et l'avant-dernière ligne: -ss 0 signifie rechercher à 0 seconde avant de commencer à décoder l'entrée, et -t 120 signifie arrêter l'écriture dans la sortie après 120 secondes. Vous pouvez également utiliser les formats d'heure hh: mm: ss ou hh: mm: ss.sss.

Maintenant ligne par ligne:

  1. -hide_banner empêche FFmpeg d'afficher les informations de construction au démarrage. Je ne veux juste pas le voir quand je défile dans la console;
  2. -ss 0 cherche à 0 seconde avant de commencer à décoder l'entrée. Notez que si ce paramètre est donné après le fichier d'entrée et avant le fichier fichier de sortie, il devient une option de sortie et indique à ffmpeg de décoder et d'ignorer l'entrée jusqu'à x secondes, puis de commencer à écrire dans la sortie . En tant qu'option d'entrée, elle est moins précise (car la recherche n'est pas précise dans la plupart des formats de conteneur), mais ne prend presque pas de temps. En tant qu'option de sortie, elle est très précise mais prend beaucoup de temps pour décoder tout le flux avant l'heure spécifiée, et à des fins de test, vous ne voulez pas perdre de temps;
  3. -i "INPUT.mkv": Spécifiez le fichier d'entrée;
  4. -attach "COVER.jpg": Attachez une pochette (image miniature, affiche, etc.) à la sortie. La pochette est généralement montrée dans les explorateurs de fichiers;
  5. -map_metadata 0: Copiez toutes les métadonnées de l'entrée 0, qui dans l'exemple n'est que l'entrée;
  6. -map_chapters 0: Copie les informations de chapitre (si présentes) à partir de l'entrée 0;
  7. -metadata title="TITLE": Définissez le titre de la vidéo;
  8. -map 0:0 ...: Mapper le flux 0 de l'entrée 0, ce qui signifie que nous voulons que le premier flux de l'entrée soit écrit dans la sortie. Puisque ce flux est un flux vidéo, il s'agit du premier flux vidéo dans la sortie , d'où le spécificateur de flux :s:v:0. Définissez sa balise de langue sur l'anglais;
  9. -map 0:1 ...: Similaire à la ligne 8, mappez le deuxième flux (audio DTS) et définissez sa langue et son titre (pour une identification plus facile lors du choix des joueurs);
  10. -map 0:2 ...: Similaire à la ligne 9, sauf que ce flux est un sous-titre;
  11. -metadata:s:t:0 ...: Définir des métadonnées pour la pochette. Ceci est requis pour le format de conteneur mkv;
  12. -c:v libx265 ...: Options de codec vidéo. C'est si long que je l'ai divisé en deux lignes. Ce paramètre est bon pour la vidéo bluray de haute qualité (1080p) avec une bande minimale en dégradé (que x265 aspire). C'est probablement une surpuissance pour les DVD et les émissions de télévision et les vidéos de téléphone. Ce paramètre est principalement volé à ce post Doom9 ;
  13. crf=22:...: Poursuite des paramètres du codec vidéo. Voir le post du forum mentionné ci-dessus;
  14. -c:a copy: Copie sur audio;
  15. -c:s copy: Copier les sous-titres;
  16. -t 120: Arrêtez d'écrire sur la sortie après 120 secondes, ce qui nous donne un clip de 2 minutes pour prévisualiser la qualité de trancodage;
  17. "OUTPUT.HEVC.DTS.Sample.mkv": Nom du fichier de sortie. J'étiquette mes noms de fichiers avec le codec vidéo et le codec audio principal.

Ouf. Ceci est ma première réponse, donc s'il y a quelque chose que j'ai manqué, veuillez laisser un commentaire. Je ne suis pas un expert en production vidéo, je suis juste un gars qui est trop paresseux pour regarder un film en mettant le disque dans le lecteur.

PS. Peut-être que cette question appartient à un autre endroit car elle n'est pas fortement liée à Unix et Linux.

62
Yifeng Mu

J'ai récemment eu la peine de transcoder tout mon catalogue de vidéos sur HEVC. J'utilise https://github.com/FallingSnow/h265ize avec les paramètres suivants.

h265ize -v -m medium -q 20 -x --no-sao --aq-mode 3 --delete --stats

- v - Sortie détaillée
- m moyen - Vitesse d'encodage moyenne (plus petite qualité supérieure, tout ce que je trouve plus lent ne vaut pas le temps/la qualité dif)
- q 20 - le CRF utilisé, 20 est similaire à 18 environ en x264 mais bon. C'est pour le contenu 1080p (90% de mon téléviseur) j'ai tendance à utiliser 22 pour mes films 4K
- x - Utiliser les commandes définies centrales x265
- no-sao désactive le décalage adaptatif d'échantillon (améliore la vitesse d'encodage)
- aq-mode 3 - utilise la quantification adaptative avec variance automatique, aide les codages 8 bits, en particulier dans les zones sombres, arrête la plupart des bandes pouvant se produire (au détriment du temps d'encodage cependant)
- supprimer - remplacer le fichier d'encodage par un fichier encodé (tester avant d'utiliser celui-ci)
- stats - Écrivez les statistiques dans un fichier csv à la racine du chemin à partir duquel vous avez couru.

Les vitesses d'encodage sont d'environ 30fps (pour la plupart des trucs 1080p) sur ma plate-forme. Dual Xeon E5 2687W v2, mais je force le processus FFMPEG à ne pas utiliser le premier côté de l'un des processeurs (c'est mon serveur Plex, alors assurez-vous qu'il y a des frais généraux pour le transcodage si nécessaire lors de la lecture, etc.)

Oui, il a fallu un certain temps pour en convertir la plupart, et j'ai maintenant une tâche planifiée qui s'exécute deux fois par jour pour coder les éléments de ce jour en x265.

Les économies d'espace ont été énormes. Mon initial SAN était à une utilisation de 20 To, maintenant c'est environ 12 mais a évidemment été ajouté aussi avec 6 mois de plus de contenu.

J'ai également commencé à transcoder tous mes films, cependant, c'est un processus continu, car je dois identifier les niveaux de qualité (Radarr les étiquette heureusement alors bien) et utiliser l'un des trois paramètres de transcodage:

-m slower -q 18 -x --no-sao --aq-mode 3 pour les transcodes 720p
-m medium -q 20 -x --no-sao --aq-mode 3 pour 1080p
-m medium -q 22 -x --no-sao pour 2160p

J'espère que cela aide certaines personnes. Criez si quelqu'un a besoin d'une main pour tout régler. Et avant de tout coder en x265, pensez à la lecture, si le client ne prend pas en charge le x265 natif, la transition peut être coûteuse en termes de CPU et de qualité.

La syntaxe correcte pour activer le mode sans perte pour l'encodeur x265 dans ffmpeg est -x265-params lossless=1 (vous devez ajouter =1).

Cependant, pour le codage sans perte, il existe de meilleurs choix de codecs. J'ai trouvé en testant que FFV1 comprime beaucoup mieux (taille de fichier = ~ 80% de x265) au moins sur certains types de vidéo (si les meilleurs paramètres sont choisis pour les deux codecs). Et cela fonctionne également plus rapidement, et (AFAIK) n'est pas grevé de brevets. C'est-à-dire qu'il est supérieur au H.265 sans perte à tous égards pour l'archivage vidéo.

3
Display Name