Jessaie de convertir ma vidéothèque au format HEVC pour gagner de lespace. Jai 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 correctement et la qualité est la même quauparavant. Cependant, quelques vidéos de très haute qualité (par exemple, une impression de film de 5 Go) perd de la 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 groupée. Jai donc besoin dune méthode où avconv ajuste automatiquement le paramètre à ajuster, pour chaque vidéo.

UPDATE-1

Jai 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 CRF une valeur de 28 est suffisante, tandis que pour certaines vidéos, un CRF inférieur est requis. Cest quelque chose que je dois vérifier manuellement en convertissant de petites sections des grandes vidéos. Mais dans la conversion en masse, comment puis-je vérifier chaque vidéo manuellement? Est-ce que leur moyen pour avconv dajuster le CRF en fonction de la vidéo dentrée de manière intelligente?

UPDATE-2

Jai trouvé quil y a un --lossless option dans x265: http://x265.readthedocs.org/en/default/lossless.html .

Cependant, je ne sais pas comment lutiliser correctement. Jai essayé de lutiliser 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 

Commentaires

  • --lossless pourrait en fait agrandir le fichier, sil décode le codec précédemment avec perte, puis encond ce quil a décodé sans perte. La qualité restera exactement la même que celle de lentrée.
  • Si vos sources sont encodées avec perte (ce qui est très probable), alors ce que vous essayez de réaliser est impossible. Tout transcodage qui nest pas sans perte dégradera davantage la qualité (même si elle nest pas immédiatement visible pour vous) et si vous passez de avec perte à sans perte, vous obtiendrez des fichiers de plus grande taille .

Réponse

Daprè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 semble 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 

La plupart x265 (options sans valeur) peuvent être spécifiés comme ceci (sauf ceux uniquement CLI, ceux-ci ne sont utilisés quavec le binaire x265 directement).

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

Cependant, souvent avant de mengager à 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 une vidéo, le flux 1 étant de laudio DTS, 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 les barres obliques inverses signalent des sauts de ligne dans une longue commande, je le fais pour maider à garder une trace de divers bits dune entrée CLI complexe. Avant de lexpliquer ligne par ligne, la partie où vous ne convertissez quune petite partie dune vidéo est la deuxième ligne et la deuxième dernière ligne: -ss 0 signifie chercher à 0 seconde avant commence le décodage de lentrée et -t 120 signifie arrêter décrire sur la sortie après 120 secondes. Vous pouvez également utiliser les formats dheure hh: mm: ss ou hh: mm: ss.sss.

Maintenant ligne par ligne:

  1. -hide_banner empêche FFmpeg dafficher les informations de compilation au démarrage. Je ne veux simplement pas le voir lorsque je fais défiler la console vers le haut;
  2. -ss 0 cherche à 0 seconde avant de commencer à décoder lentrée. Notez que si ce paramètre reçoit après le fichier dentrée et avant le fichier de sortie, il devient une option de sortie et indique ffmpeg pour décoder et ignorer lentrée jusquà x secondes, puis commencer à écrire dans la sortie. En tant quoption dentrée, elle est moins précise (car la recherche nest pas précise dans la plupart des formats de conteneur), mais ne prend presque pas de temps.En tant quoption de sortie, elle est très précise mais prend un temps considérable pour décoder tout le flux avant lheure spécifiée, et à des fins de test, vous ne « voulez pas perdre de temps;
  3. -i "INPUT.mkv": spécifiez le fichier dentrée;
  4. -attach "COVER.jpg": joignez une couverture (image miniature, affiche, etc.) à la sortie. la couverture est généralement affichée dans les explorateurs de fichiers;
  5. -map_metadata 0: Copie sur toutes les métadonnées de lentrée 0, qui dans lexemple nest que lentrée;
  6. -map_chapters 0: Copier les informations du chapitre (le cas échéant) à partir de lentrée 0;
  7. -metadata title="TITLE": Définissez le titre de la vidéo;
  8. -map 0:0 ...: Mappez le flux 0 de lentrée 0, ce qui signifie que nous voulons que le premier flux de lentrée soit écrit dans la sortie . Ce flux étant 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éfinir sa langue balise en 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éfinissez les métadonnées de la pochette. Ceci est requis pour le format de conteneur mkv;
  12. -c:v libx265 ...: Options du codec vidéo. Il est si long que je lai divisé en deux lignes. Ce paramètre convient aux vidéos bluray de haute qualité (1080p) avec un minimum de bandes en dégradé (ce qui est nul pour x265). Cest probablement une exagération pour les DVD, les émissions de télévision et les vidéos de téléphone. Ce paramètre est principalement volé à ce message Doom9 ;
  13. crf=22:...: poursuite du codec vidéo paramètres. Voir le message du forum mentionné ci-dessus;
  14. -c:a copy: Copier sur laudio;
  15. -c:s copy : Copie sur 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é du trancoding;
  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. Cest ma première réponse, donc sil y a quelque chose que jai 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 insérant le disque dans le lecteur.

PS. Peut-être que cette question appartient à ailleurs comme nest pas fortement lié à Unix & Linux.

Commentaires

  • Exactement ce que je cherchais ! Belle couverture des options. Savez-vous si ffmpeg hésitera à c:s copy sil ny a pas de contenu de sous-titre?
  • @ElderGeek Non, ffmpeg ne dira quelque chose que si cette option a un effet.
  • @TheBitByte Oui et non, je pense. Vous ne voulez pas ‘ de fichiers h265 sans perte. Il ‘ est juste un flux binaire brut sans aucune sorte de compression. Il ‘ est énorme. Daprès ce que je comprends de limplémentation h265 ou spécifiquement x265, ce nest pas une méthode de compression sans perte. Tout degré de compression entraînera une perte dinformations, mais pas nécessairement une perte de qualité daffichage. Mais je ‘ ne suis pas un expert des sujets h265, il est donc ‘ que jai raté quelque chose
  • @ TheBitByte Je ‘ ne pense pas quil existe un niveau de compression sans perte dans h265. Pour loption sans compression, ‘ est simplement --lossless. Jai cherché en vain une conversion sans perte de h264 à h265, et ce que jai ‘ appris me dit que cest mathématiquement impossible ‘.
  • Vous devriez vraiment éditer la commande contenant le commutateur --lossless hors de cette réponse, car mis là comme réponse à cette question, il vous semble ‘ vous le dites ‘ compression sans perte, ce qui est trompeur.

Réponse

Jai récemment eu la difficulté de transcoder tout mon catalogue vidéo en HEVC. Jutilise 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 – Résultat détaillé
-m medium – Moyen vitesse dencodage (plus petite qualité supérieure, tout ce qui est plus lent que je trouve ne vaut pas le temps / qualité dif)
-q 20 – le CRF utilisé, 20 est similaire à 18 ou plus en x264 mais bon.Ceci concerne le contenu 1080p (90% de mon téléviseur). Jai tendance à utiliser 22 pour mes films 4K
-x – Utilisez les commandes centrales définies x265
–no-sao désactive le décalage adaptatif déchantillon (améliore la vitesse dencodage)
–aq-mode 3 – utilise la quantification adaptative avec variance automatique, aide les encodages 8 bits, en particulier dans les zones sombres, sarrête la plupart des bandes qui peuvent se produire (au détriment du temps dencodage cependant)
–delete – remplacer le fichier dencodage par fichier encodé (testez avant dutiliser celui-ci)
–stats – Ecrivez les statistiques dans un fichier csv à la racine du chemin que vous avez parcouru.

Les vitesses dencodage sont denviron 30 ips (pour la plupart des trucs 1080p) sur mon rig. Dual Xeon E5 2687W v2, mais je force le processus FFMPEG à ne pas utiliser le premier côté de lun des processeurs (cest mon serveur Plex, donc je dois vous assurer quil y a une surcharge pour le transcodage si nécessaire lors de la lecture, etc.)

Oui, il a fallu un certain temps pour convertir la plus grande partie, et maintenant jai une tâche planifiée qui sexécute deux fois par jour pour encoder le contenu de ce jour-là en x265.

Léconomie despace ont été énormes. Mon SAN initial était à 20 To dutilisation, maintenant il est autour de 12 mais a évidemment été ajouté aussi avec 6 mois de plus de contenu.

Jai commencé à transcoder tous mes films aussi, cependant, cest un processus en cours, car je dois identifier les niveaux de qualité (heureusement Radarr les étiquettes alors bien) et utiliser lun 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

Jespère que cela aide certaines personnes. Criez si quelquun a besoin dun Et avant de tout encoder en x265, pensez à la lecture, si le client ne prend pas en charge x265 natif, alors la transcade peut coûter cher en termes de CPU et de qualité.

Commentaires

  • Avec x265 2.4 et versions ultérieures (avec les nouvelles tables lambda qui donnent des codes plus précis), SAO est généralement une bonne chose pour la qualité par bitrate. Il macule encore légèrement, mais réduit suffisamment les autres artefacts pour en valoir la peine.
  • -q 20 nest pas CRF 20, il ‘ s contrôle du taux QP constant . Le mode par défaut et recommandé, CRF, augmente le QP dans les scènes de grande complexité, de sorte quil ne ‘ pas dépenser trop beaucoup de bits sur des scènes trop difficiles à encoder. (Si vous voulez vous rapprocher dun QP uniforme, augmentez qcomp de la valeur par défaut 0,6 à peut-être 0,7 ou 0,8. Plus près de 1,0 est plus proche de CQP.)
  • comment gérez-vous les codages hdr / sdr lorsque vous ne savez pas ‘ quelle est la source?

Réponse

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

Cependant, pour un codage sans perte, il existe de meilleurs choix de codec. Jai trouvé en testant que FFV1 comprime 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 (AFAIK) nest pas encombré de brevets. Autrement dit, il est supérieur au H.265 sans perte à tous égards pour larchivage vidéo. Le compromis est cependant la compatibilité avec le logiciel et le matériel de lecture actuels.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *