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?
ffmpeg
video-encoding
hongducwb
la source
la source
slow
àfast
dans votre première commande. CRF n'est pas implémenté dansnvenc
.Réponses:
Pour les encodages basés sur CRF, passez les arguments suivants dans l'extrait de code ci-dessous à FFmpeg:
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:
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:
Ainsi, pour les encodeurs basés sur NVENC, vous pouvez exécuter:
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:
Exemple de sortie sur mon banc d'essai:
la source
vbr_minqp
semble 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 pourh264_nvenc
.Je crois avoir trouvé une solution:
Il semble que h264_nvenc utilise à la
-qp
place de-crf
. Cette option fonctionne uniquement lorsque-rc
est défini surconstqp
.la source
-qp
est tout différent de-crf
. h264_nvenc 's-qp
est équivalent à libx264 ' s-qp
Pour le
-crf
remplacement de libx264 peut être-cq
ou-qp
de 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:
-resize
résolution en entrée (dans le matériel); pas besoin de compiler ffmpeg--enable-libnpp
pour lescale_npp
filtre.Pour plus d'informations:
ffmpeg -h encoder=h264_nvenc
la source