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 crf
paramè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 avconv
d'ajuster automatiquement le paramètre à ajuster pour chaque vidéo.
UPDATE-1
J'ai trouvé que crf
c'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 avconv
peuvent 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 --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
la source
--lossless
pourrait 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.Réponses:
De ma propre expérience, si vous voulez absolument aucune perte de qualité, vous cherchez ce que vous cherchez.
Pas sûr,
avconv
mais la commande que vous avez tapée est identique à ce que je fais avecFFmpeg
. EnFFmpeg
vous pouvez passer le paramètre comme ceci:La plupart des
x265
commutateurs (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 quex265
directement en binaire).Cela dit, j'aimerais partager mon expérience en matière d'
x265
encodage. Pour la plupart des vidéos (WMV, MPEG ou AVC / H.264), je les utilisecrf=23
.x265
dé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:
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 0
signifie chercher à 0 seconde avant de commencer à décoder l'entrée, et-t 120
signifie 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:
-hide_banner
empêcheFFmpeg
d'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;-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 de sortie, il devient une option de sortie et indiqueffmpeg
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 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.-i "INPUT.mkv"
: Spécifiez le fichier d'entrée;-attach "COVER.jpg"
: Attachez une pochette (vignette, affiche, etc.) à la sortie. La pochette est généralement montrée dans les explorateurs de fichiers;-map_metadata 0
: Copiez toutes les métadonnées de l'entrée 0, qui dans l'exemple n'est que l'entrée;-map_chapters 0
: Copier les informations de chapitre (si présentes) à partir de l’entrée 0;-metadata title="TITLE"
: Définir le titre de la vidéo;-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;-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);-map 0:2 ...
: Semblable à la ligne 9, sauf que ce flux est un sous-titre;-metadata:s:t:0 ...
: Définir des métadonnées pour la couverture. Ceci est requis pour le format de conteneur mkv;-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 ;crf=22:...
: Continuation des paramètres du codec vidéo. Voir le post de forum mentionné ci-dessus;-c:a copy
: Copier sur audio;-c:s copy
: Copier les sous-titres;-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;"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.
la source
c:s copy
s'il n'y a pas de contenu de sous-titres?--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.--lossless
commutateur 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.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 3
pour transcoder 720p-m medium -q 20 -x --no-sao --aq-mode 3
pour 1080p-m medium -q 22 -x --no-sao
pour 2160pJ'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é.
la source
-q 20
n’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, augmentezqcomp
la 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.)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.
la source