Pour les encodages basés sur CRF, passez les arguments suivants dans l'extrait de code ci-dessous à FFmpeg:
-c:v h264_nvenc -rc:v vbr_hq -cq:v 19 -b:v 2500k -maxrate:v 5000k -profile:v high
Bien sûr, vous devrez ajuster les débits cibles et une cq
valeur fixe . 19 est le paramètre recommandé car il est visuellement identique à 0, tout en conservant un bon compromis de compression en fonction de la taille du fichier. Consultez cet article pour en savoir plus sur ce que fait le CRF.
Notez que l' -cq
échelle est logarithmique, ce qui signifie que 0 est essentiellement sans perte et 51 serait le pire absolu.
La qualité peut être encore améliorée en ajoutant des options telles que les cadres B (limitez-les à 3 au maximum, et cela nécessite le profil principal H.264 et supérieur. Les profils de base ne prennent pas en charge les cadres B. Pour ce faire, passez -bf {uint}
à l'encodeur vidéo, de telle sorte que -bf:v 4
l'encodeur utilise 4 images B.
Les éléments clés sont les -cq:v 19
et les -rc:v vbr_hq
arguments qui permettent de régler le codeur à la fois avec un débit binaire variable de préréglage et un débit maximal admissible ( -b:v
et -maxrate:v
) tout en respectant une valeur de CRF de 19.
Et maintenant, de petites notes sur NVENC, et le régler pour des encodages de haute qualité:
NVENC, comme tout autre encodeur matériel, a plusieurs limitations, et en particulier avec HEVC, voici les limitations connues:
Sur Pascal:
Pour les codes HEVC, les limitations suivantes s'appliquent:
- Les tailles de CTU supérieures à 32 ne sont pas prises en charge.
- Les cadres B dans HEVC ne sont pas non plus pris en charge.
- Les formats de texture pris en charge par l'encodeur NVENC limitent les espaces colorimétriques avec lesquels l'encodeur peut fonctionner. Pour l'instant, nous prenons en charge 4: 2: 0 (8 bits) et 4: 4: 4 (pour 10 bits). Les formats étrangers tels que 4: 2: 2 10 bits ne sont pas pris en charge. Cela affectera certains workflows où de tels espaces colorimétriques sont requis.
- Le contrôle anticipé est également limité à 32 images. Vous voudrez peut-être consulter cet éditorial pour plus de détails.
Turing possède toutes les améliorations disponibles pour Pascal, avec l'ajout de la prise en charge des trames B pour HEVC et la possibilité d'utiliser les trames B comme référence. Voir cette réponse pour un exemple sur cette capacité.
Et sur Maxwell Gen 2 (GPU de la série GM200x):
Le codage HEVC n'a pas les fonctionnalités suivantes:
L'impact ici pour Maxwell est que les scènes à forte intensité de mouvement avec HEVC sous des débits binaires contraints peuvent souffrir d'artefact (blocage) en raison des fonctions d'anticipation manquantes et des capacités de filtrage de boucle de décalage d'échantillon adaptatif (SAO). Pascal a quelque peu amélioré cette capacité, mais selon la version du SDK avec laquelle l'encodeur vidéo a été construit, toutes les fonctionnalités peuvent ne pas être disponibles.
Par exemple, le mode de prédiction pondéré pour les encodages H.264 sur Pascal nécessite NVENC SDK 8.0x et supérieur, et ce mode d'encodage désactivera également la prise en charge de la trame B. De même, la combinaison de scalers basés sur le matériel fonctionnant avec les Nvidia Performance Primitives (NPP) avec NVENC peut introduire des améliorations de performances avec les applications de mise à l'échelle vidéo au détriment de la mise à l'échelle des artefacts, en particulier avec le contenu mis à l'échelle. La même chose a également un impact sur le pipeline de codage vidéo car les fonctions de mise à l'échelle de NPP s'exécutent sur les cœurs CUDA sur le GPU, et en tant que tel, l'impact sur les performances introduit par la charge supplémentaire doit être analysé au cas par cas pour déterminer si la qualité des performances le compromis est acceptable.
Gardez cela à l'esprit: un encodeur basé sur le matériel offrira toujours une personnalisation légèrement inférieure à une implémentation logicielle équivalente, et en tant que tel, votre kilométrage et votre qualité de sortie acceptable différeront toujours.
Et pour votre référence:
Avec FFmpeg, vous pouvez toujours vous référer aux paramètres d'un encodeur pour la personnalisation en:
ffmpeg -h encoder {encoder-name}
Ainsi, pour les encodeurs basés sur NVENC, vous pouvez exécuter:
ffmpeg -h encoder=hevc_nvenc
ffmpeg -h encoder=h264_nvenc
Vous pouvez également voir tous les encodeurs basés sur NVENC et les scalers basés sur NPP (s'ils sont construits comme tels) en exécutant:
for i in encoders decoders filters; do
echo $i:; ffmpeg -hide_banner -${i} | egrep -i "npp|cuvid|nvenc|cuda"
done
Exemple de sortie sur mon banc d'essai:
encoders:
V..... h264_nvenc NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc_h264 NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc_hevc NVIDIA NVENC hevc encoder (codec hevc)
V..... hevc_nvenc NVIDIA NVENC hevc encoder (codec hevc)
decoders:
V..... h263_cuvid Nvidia CUVID H263 decoder (codec h263)
V..... h264_cuvid Nvidia CUVID H264 decoder (codec h264)
V..... hevc_cuvid Nvidia CUVID HEVC decoder (codec hevc)
V..... mjpeg_cuvid Nvidia CUVID MJPEG decoder (codec mjpeg)
V..... mpeg1_cuvid Nvidia CUVID MPEG1VIDEO decoder (codec mpeg1video)
V..... mpeg2_cuvid Nvidia CUVID MPEG2VIDEO decoder (codec mpeg2video)
V..... mpeg4_cuvid Nvidia CUVID MPEG4 decoder (codec mpeg4)
V..... vc1_cuvid Nvidia CUVID VC1 decoder (codec vc1)
V..... vp8_cuvid Nvidia CUVID VP8 decoder (codec vp8)
V..... vp9_cuvid Nvidia CUVID VP9 decoder (codec vp9)
filters:
... hwupload_cuda V->V Upload a system memory frame to a CUDA device.
... scale_npp V->V NVIDIA Performance Primitives video scaling and format conversion
slow
àfast
dans votre première commande. CRF n'est pas implémenté dansnvenc
.