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


43

J'essaie de convertir ma bibliothèque vidéo 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 sont converties correctement et la qualité est la même. Cependant, quelques vidéos de très haute qualité (une impression de film de 5 Go, par exemple) perdent en qualité - la vidéo est entièrement pixellisée.

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

Le truc, c'est que je fais une conversion en bloc. J'ai donc besoin d'une méthode permettant avconvd'ajuster automatiquement le paramètre à ajuster pour chaque vidéo.

UPDATE-1

J'ai trouvé que crfc'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, une valeur CRF de 28 est suffisante, alors que pour certaines vidéos, une valeur CRF inférieure est requise. C’est quelque chose que je dois vérifier manuellement en convertissant de petites parties des grandes vidéos. Mais en conversion en masse, comment pourrais-je vérifier chaque vidéo manuellement? Est-ce qu'ils avconvpeuvent ajuster le CRF en fonction de la vidéo d'entrée de manière intelligente?

UPDATE-2

J'ai trouvé qu'il existe une --losslessoption 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

1
--losslesspourrait en fait agrandir le fichier s'il décodait le codec précédemment avec perte, puis comprenait ce qu'il décodait sans perte. La qualité restera identique à l'entrée.
Golar Ramblar

2
Si vos sources sont encodées avec des pertes (ce qui est le plus probable), alors ce que vous essayez d’atteindre est impossible. Tout transcodage qui n'est pas sans perte dégradera davantage la qualité (même s'il n'est pas immédiatement visible pour vous) et si vous passez de sans perte à sans perte, vos fichiers seront plus volumineux.
Sarge Borsch

Réponses:


58

De ma propre expérience, si vous voulez absolument aucune perte de qualité, vous cherchez ce que vous cherchez.

Pas sûr, avconvmais la commande que vous avez tapée est identique à ce que je fais avec FFmpeg. En FFmpegvous pouvez passer le paramètre comme ceci:

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

La plupart des x265commutateurs (options sans valeur) peuvent être spécifiés comme ceci (à l'exception de ceux qui ne sont que des interfaces de ligne de commande, ceux-ci ne sont utilisés que x265directement en binaire).

Cela dit, j'aimerais partager mon expérience en matière d' x265encodage. Pour la plupart des vidéos (WMV, MPEG ou AVC / H.264), je les utilise crf=23. x265décide du reste des paramètres et généralement, il fait assez bien.

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 dont le flux 0 est une vidéo, le flux 1 un fichier audio DTS et le flux 2 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 les barres obliques inverses signalent une rupture de ligne dans une longue commande. Je le fais pour m'aider à garder une trace de divers 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 la dernière dernière ligne: -ss 0signifie chercher à 0 seconde avant de commencer à décoder l'entrée, et -t 120signifie arrêter d'écrire 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_bannerempêche FFmpegd'afficher les informations de construction au démarrage. Je ne veux simplement pas le voir quand je fais défiler vers le haut dans la console;
  2. -ss 0cherche à 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 de sortie, il devient une option de sortie et indique ffmpegde 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 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 vous ne souhaitez pas perdre de temps à des fins de test.
  3. -i "INPUT.mkv": Spécifiez le fichier d'entrée;
  4. -attach "COVER.jpg": Attachez une pochette (vignette, 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: Copier les informations de chapitre (si présentes) à partir de l’entrée 0;
  7. -metadata title="TITLE": Définir le titre de la vidéo;
  8. -map 0:0 ...: Mappez 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. Comme ce flux est un flux vidéo, il s'agit du premier flux vidéo de la sortie , d'où le spécificateur de flux :s:v:0. Définissez l’étiquette de langue sur 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 parmi les lecteurs);
  10. -map 0:2 ...: Semblable à la ligne 9, sauf que ce flux est un sous-titre;
  11. -metadata:s:t:0 ...: Définir des métadonnées pour la couverture. Ceci est requis pour le format de conteneur mkv;
  12. -c:v libx265 ...: Options de codec vidéo. C'est tellement long que je l'ai divisé en deux lignes. Ce paramètre convient aux vidéos Blu-ray de haute qualité (1080p) avec une bande minimale en dégradé (ce qui x265 est nul). Il s’agit probablement d’une surexploitation de DVD, d’émissions de télévision et de vidéos de téléphone. Ce paramètre est principalement volé à ce poste de Doom9 ;
  13. crf=22:...: Continuation des paramètres du codec vidéo. Voir le post de forum mentionné ci-dessus;
  14. -c:a copy: Copier sur audio;
  15. -c:s copy: Copier les sous-titres;
  16. -t 120: Arrête d'écrire dans la sortie après 120 secondes, ce qui nous donne un clip de 2 minutes pour la prévisualisation de la qualité de la transcription;
  17. "OUTPUT.HEVC.DTS.Sample.mkv": Nom du fichier de sortie. Je marque mes noms de fichiers avec le codec vidéo et le codec audio principal.

Ouf. Ceci est ma première réponse, alors s'il y a quelque chose que j'ai manquée, laissez 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 plaçant le disque dans le lecteur.

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


2
Exactement ce que je cherchais! Belle couverture d'options. Savez-vous si ffmpeg hésitera c:s copys'il n'y a pas de contenu de sous-titres?
Elder Geek

1
@ElderGeek Non, ffmpeg ne dira quelque chose que si cette option a un effet.
Yifeng Mu

Cette option génère-t-elle la plus petite taille de fichier possible pour un encodage h265 véritablement sans perte? Sinon, y a-t-il un moyen de le faire?
Tampon Over Lu

1
@TheBitByte Je ne pense pas qu'il existe un niveau de compression sans perte dans h265. Pour l'option sans compression, c'est juste --lossless. J'ai cherché en vain une conversion sans perte de h264 à h265, et ce que j'ai appris me dit que c'est mathématiquement impossible.
Yifeng Mu

1
Vous devriez vraiment éditer la commande contenant le --losslesscommutateur en dehors de cette réponse, car pour y répondre, il semblerait que vous disiez qu'il s'agit d'une compression sans perte, ce qui est trompeur.
Hashim

8

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

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

-v - Sortie verbale
-m moyen - Vitesse d'encodage moyenne (qualité supérieure plus petite, tout ce que je trouve lent ne vaut pas la peine temps / qualité dif)
-q 20 - le CRF utilisé, 20 est similaire à 18 dans x264 mais bon. Ceci concerne le contenu 1080p (90% de mon téléviseur). J'utilise généralement 22 pour mes vidéos 4K -
x - Utilisation des commandes définies centrales x265 --no
-sao désactive le décalage adaptatif (améliore la vitesse de codage)
--aq-mode 3 - utilisation de la quantification adaptative avec variance automatique, aide les codages à 8 bits, en particulier dans les zones sombres, à arrêter la plupart des bandes pouvant se produire (au prix du temps de codage)
--delete - remplace le fichier de codage par un fichier codé (à tester avant de l'utiliser) )
--stats - Ecrivez les statistiques dans un fichier csv à la racine du chemin que vous avez utilisé.

Les vitesses d'encodage sont d'environ 30 images par seconde (pour la plupart des vidéos 1080p) sur mon banc d'essai. 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, il faut donc s’assurer que le transcodage est trop long pour la lecture, etc.)

Oui, il a fallu un certain temps pour convertir la majeure partie, et maintenant, j’ai une tâche planifiée exécutée deux fois par jour pour encoder les éléments de cette journée en x265.

Les économies d'espace ont été énormes. Mon réseau SAN initial était à 20 To, il est maintenant autour de 12, mais a évidemment été ajouté avec 6 mois de contenu supplémentaire.

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

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

J'espère que cela aide certaines personnes. Crie si quelqu'un a besoin d'un coup de main pour tout mettre en place. Et avant de tout encoder en x265, pensez à la lecture. Si le client ne prend pas en charge le x265 en natif, la transcade peut être coûteuse en termes de processeur et de qualité.


Avec x265 2.4 et versions ultérieures (avec les nouvelles tables lambda qui donnent des codes plus nettes), SAO est généralement une bonne chose pour la qualité par débit. Il tache toujours légèrement, mais réduit suffisamment d'artéfact pour en valoir la peine.
Peter Cordes

-q 20n’est pas CRF 20, c’est un contrôle de rat QP constant . Le mode par défaut et recommandé, CRF, soulève le QP dans certaines scènes très complexes pour éviter de passer trop de bits dans des scènes trop difficiles à encoder. (Si vous voulez un QP plus uniforme, augmentez qcompla valeur par défaut de 0.6 à peut-être 0.7 ou 0.8. Plus près de 1.0 est plus proche du CQP.)
Peter Cordes

3

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

Cependant, pour le codage sans perte, il existe de meilleurs choix de codec. J'ai trouvé en testant que FFV1 compresse beaucoup mieux (taille du 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 aussi plus rapidement, et (autant que je sache) n'est pas encombré par des brevets. En d’autres termes, il est supérieur au H.265 sans perte à tous points de vue pour l’archivage vidéo.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.