Comment puis-je utiliser l'encodage CRF avec nvenc dans ffmpeg?

22

C'est ma commande actuelle pour redimensionner des vidéos (1080p) de 2 Go à 300 Mo, mais cela prend beaucoup de temps:

mkdir newfiles  
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v  libx264 -preset slow -crf 21 -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"  
pause

J'ai essayé nvenc avec mon NVIDIA GTX1070:

mkdir newfiles  
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v h264_nvenc -preset slow -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"  
pause

La taille de sortie est toujours 3⨉ ou 5⨉ la taille d'origine - nvenc ne l'utilise pas -crf.

Alors, comment utiliser nvenc avec ffmpeg pour convertir / redimensionner une vidéo de haute qualité et de petite taille? Dois-je utiliser le GPU pour l'encodage?

hongducwb
la source
Vous pouvez passer slowà fastdans votre première commande. CRF n'est pas implémenté dans nvenc.
Gyan
Le but de NVENC est de permettre l'encodage vidéo en temps réel (pour des choses comme les appels vidéo); la qualité est une considération secondaire.
CL.

Réponses:

23

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 cqvaleur 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 4l'encodeur utilise 4 images B.

Les éléments clés sont les -cq:v 19et les -rc:v vbr_hqarguments 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:vet -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:

  1. 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é.

  1. 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
林正浩
la source
1
Très bonne réponse! Le wiki ffmpeg sur nvenc est un peu dépassé et manque de toutes ces informations… si vous avez quelques minutes, ce serait génial si vous pouviez y apporter vos connaissances: trac.ffmpeg.org/wiki/HWAccelIntro
slhck
1
merci pour la réponse :) ffmpeg wiki a besoin de plus de réponses comme celle-ci
hongducwb
Merci pour les commentaires. Je vais essayer d'ajouter ceci au wiki FFmpeg.
林正浩
les fichiers de couleur de sortie semblent plus foncés, je me souviens qu'un argument peut contrôler la couleur de la même manière que le fichier d'entrée
hongducwb
2
vbr_minqpsemble désormais obsolète. Je suis plutôt d'accord que cette réponse pourrait être mal comprise car il n'y a pas de mode CRF pour h264_nvenc.
slhck
4

Je crois avoir trouvé une solution:

ffmpeg -hwaccel auto -i in.mp4 -c:v h264_nvenc -preset llhq -rc constqp -qp 21 -c:a copy out.mp4

Il semble que h264_nvenc utilise à la -qpplace de -crf. Cette option fonctionne uniquement lorsque -rcest défini sur constqp.

Alexander01998
la source
1
Non, -qpest tout différent de -crf. h264_nvenc 's -qpest équivalent à libx264 ' s-qp
Meow
@Meow C'est assez proche pour moi, mais c'est bon de savoir qu'il y a une différence. Pour tous ceux qui pourraient voir cela à l'avenir, cette page explique la différence entre CRF et QP.
Alexander01998
3

Pour le -crfremplacement de libx264 peut être -cqou -qpde h264_nvenc:

-crf Sélectionnez la qualité pour un mode de qualité constante

-cq Définir le niveau de qualité cible (0 à 51, 0 signifie automatique) pour le mode de qualité constante dans le contrôle du taux VBR

-qp Méthode de contrôle du taux de paramètre de quantification constante (de -1 à 51) (par défaut -1)

Méthode de codage accéléré matériel le plus rapide:

ffmpeg -hwaccel cuvid -c:v h264_cuvid -resize 640x480 -i input.mp4 -c:v h264_nvenc -cq 21 -c:a copy output.mp4

-resizerésolution en entrée (dans le matériel); pas besoin de compiler ffmpeg --enable-libnpppour le scale_nppfiltre.

Pour plus d'informations:

ffmpeg -h encoder=h264_nvenc

ffmpeg -h denoder=h264_cuvid
abc
la source