Voici un guide approximatif pour régler l'encodeur:
Nous commencerons par les bases, car il serait préjudiciable de sauter à la conclusion qu'un barrage rapide d'options améliorera soudainement la production attendue sans comprendre les objectifs et les attentes souhaités:
1. Commencez par comprendre les options de l'encodeur.
Pour les encodeurs basés sur NVENC, commencez par apprendre les options que prend chaque encodeur (notez que je suis sous Linux, c'est pourquoi j'utilise xclip pour copier les options du codec dans le presse-papiers avant de les coller ici):
(une). Pour l'encodeur H.264:
ffmpeg -hide_banner -h encoder=h264_nvenc | xclip -sel clip
Production:
Encoder h264_nvenc [NVIDIA NVENC H.264 encoder]:
General capabilities: delay
Threading capabilities: none
Supported pixel formats: yuv420p nv12 p010le yuv444p yuv444p16le bgr0 rgb0 cuda
h264_nvenc AVOptions:
-preset <int> E..V.... Set the encoding preset (from 0 to 11) (default medium)
default E..V....
slow E..V.... hq 2 passes
medium E..V.... hq 1 pass
fast E..V.... hp 1 pass
hp E..V....
hq E..V....
bd E..V....
ll E..V.... low latency
llhq E..V.... low latency hq
llhp E..V.... low latency hp
lossless E..V....
losslesshp E..V....
-profile <int> E..V.... Set the encoding profile (from 0 to 3) (default main)
baseline E..V....
main E..V....
high E..V....
high444p E..V....
-level <int> E..V.... Set the encoding level restriction (from 0 to 51) (default auto)
auto E..V....
1 E..V....
1.0 E..V....
1b E..V....
1.0b E..V....
1.1 E..V....
1.2 E..V....
1.3 E..V....
2 E..V....
2.0 E..V....
2.1 E..V....
2.2 E..V....
3 E..V....
3.0 E..V....
3.1 E..V....
3.2 E..V....
4 E..V....
4.0 E..V....
4.1 E..V....
4.2 E..V....
5 E..V....
5.0 E..V....
5.1 E..V....
-rc <int> E..V.... Override the preset rate-control (from -1 to INT_MAX) (default -1)
constqp E..V.... Constant QP mode
vbr E..V.... Variable bitrate mode
cbr E..V.... Constant bitrate mode
vbr_minqp E..V.... Variable bitrate mode with MinQP (deprecated)
ll_2pass_quality E..V.... Multi-pass optimized for image quality (deprecated)
ll_2pass_size E..V.... Multi-pass optimized for constant frame size (deprecated)
vbr_2pass E..V.... Multi-pass variable bitrate mode (deprecated)
cbr_ld_hq E..V.... Constant bitrate low delay high quality mode
cbr_hq E..V.... Constant bitrate high quality mode
vbr_hq E..V.... Variable bitrate high quality mode
-rc-lookahead <int> E..V.... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
-surfaces <int> E..V.... Number of concurrent surfaces (from 0 to 64) (default 0)
-cbr <boolean> E..V.... Use cbr encoding mode (default false)
-2pass <boolean> E..V.... Use 2pass encoding mode (default auto)
-gpu <int> E..V.... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any)
any E..V.... Pick the first device available
list E..V.... List the available devices
-delay <int> E..V.... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
-no-scenecut <boolean> E..V.... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
-forced-idr <boolean> E..V.... If forcing keyframes, force them as IDR frames. (default false)
-b_adapt <boolean> E..V.... When lookahead is enabled, set this to 0 to disable adaptive B-frame decision (default true)
-spatial-aq <boolean> E..V.... set to 1 to enable Spatial AQ (default false)
-temporal-aq <boolean> E..V.... set to 1 to enable Temporal AQ (default false)
-zerolatency <boolean> E..V.... Set 1 to indicate zero latency operation (no reordering delay) (default false)
-nonref_p <boolean> E..V.... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
-strict_gop <boolean> E..V.... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
-aq-strength <int> E..V.... When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8)
-cq <float> E..V.... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0)
-aud <boolean> E..V.... Use access unit delimiters (default false)
-bluray-compat <boolean> E..V.... Bluray compatibility workarounds (default false)
-init_qpP <int> E..V.... Initial QP value for P frame (from -1 to 51) (default -1)
-init_qpB <int> E..V.... Initial QP value for B frame (from -1 to 51) (default -1)
-init_qpI <int> E..V.... Initial QP value for I frame (from -1 to 51) (default -1)
-qp <int> E..V.... Constant quantization parameter rate control method (from -1 to 51) (default -1)
-weighted_pred <int> E..V.... Set 1 to enable weighted prediction (from 0 to 1) (default 0)
-coder <int> E..V.... Coder type (from -1 to 2) (default default)
default E..V....
auto E..V....
cabac E..V....
cavlc E..V....
ac E..V....
vlc E..V....
(b). Pour l'encodeur HEVC / H.265:
ffmpeg -hide_banner -h encoder=hevc_nvenc | xclip -sel clip
Production:
Encoder hevc_nvenc [NVIDIA NVENC hevc encoder]:
General capabilities: delay
Threading capabilities: none
Supported pixel formats: yuv420p nv12 p010le yuv444p yuv444p16le bgr0 rgb0 cuda
hevc_nvenc AVOptions:
-preset <int> E..V.... Set the encoding preset (from 0 to 11) (default medium)
default E..V....
slow E..V.... hq 2 passes
medium E..V.... hq 1 pass
fast E..V.... hp 1 pass
hp E..V....
hq E..V....
bd E..V....
ll E..V.... low latency
llhq E..V.... low latency hq
llhp E..V.... low latency hp
lossless E..V.... lossless
losslesshp E..V.... lossless hp
-profile <int> E..V.... Set the encoding profile (from 0 to 4) (default main)
main E..V....
main10 E..V....
rext E..V....
-level <int> E..V.... Set the encoding level restriction (from 0 to 186) (default auto)
auto E..V....
1 E..V....
1.0 E..V....
2 E..V....
2.0 E..V....
2.1 E..V....
3 E..V....
3.0 E..V....
3.1 E..V....
4 E..V....
4.0 E..V....
4.1 E..V....
5 E..V....
5.0 E..V....
5.1 E..V....
5.2 E..V....
6 E..V....
6.0 E..V....
6.1 E..V....
6.2 E..V....
-tier <int> E..V.... Set the encoding tier (from 0 to 1) (default main)
main E..V....
high E..V....
-rc <int> E..V.... Override the preset rate-control (from -1 to INT_MAX) (default -1)
constqp E..V.... Constant QP mode
vbr E..V.... Variable bitrate mode
cbr E..V.... Constant bitrate mode
vbr_minqp E..V.... Variable bitrate mode with MinQP (deprecated)
ll_2pass_quality E..V.... Multi-pass optimized for image quality (deprecated)
ll_2pass_size E..V.... Multi-pass optimized for constant frame size (deprecated)
vbr_2pass E..V.... Multi-pass variable bitrate mode (deprecated)
cbr_ld_hq E..V.... Constant bitrate low delay high quality mode
cbr_hq E..V.... Constant bitrate high quality mode
vbr_hq E..V.... Variable bitrate high quality mode
-rc-lookahead <int> E..V.... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
-surfaces <int> E..V.... Number of concurrent surfaces (from 0 to 64) (default 0)
-cbr <boolean> E..V.... Use cbr encoding mode (default false)
-2pass <boolean> E..V.... Use 2pass encoding mode (default auto)
-gpu <int> E..V.... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any)
any E..V.... Pick the first device available
list E..V.... List the available devices
-delay <int> E..V.... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
-no-scenecut <boolean> E..V.... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
-forced-idr <boolean> E..V.... If forcing keyframes, force them as IDR frames. (default false)
-spatial_aq <boolean> E..V.... set to 1 to enable Spatial AQ (default false)
-temporal_aq <boolean> E..V.... set to 1 to enable Temporal AQ (default false)
-zerolatency <boolean> E..V.... Set 1 to indicate zero latency operation (no reordering delay) (default false)
-nonref_p <boolean> E..V.... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
-strict_gop <boolean> E..V.... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
-aq-strength <int> E..V.... When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8)
-cq <float> E..V.... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0)
-aud <boolean> E..V.... Use access unit delimiters (default false)
-bluray-compat <boolean> E..V.... Bluray compatibility workarounds (default false)
-init_qpP <int> E..V.... Initial QP value for P frame (from -1 to 51) (default -1)
-init_qpB <int> E..V.... Initial QP value for B frame (from -1 to 51) (default -1)
-init_qpI <int> E..V.... Initial QP value for I frame (from -1 to 51) (default -1)
-qp <int> E..V.... Constant quantization parameter rate control method (from -1 to 51) (default -1)
-weighted_pred <int> E..V.... Set 1 to enable weighted prediction (from 0 to 1) (default 0)
2. Comprenez les limites du matériel et respectez les valeurs par défaut saines avant d'appliquer les options:
Reportez-vous à cette réponse pour connaître les limitations matérielles que vous rencontrerez avec NVENC, en particulier pour les codages HEVC sur Pascal.
Pour connaître l'infrastructure accélérée matérielle disponible pour le matériel NVIDIA de génération actuelle avec FFmpeg, consultez cette réponse.
Ensuite, en utilisant ces informations, passez à l'étape suivante.
3. La syntaxe est essentielle:
Voici l'ordre dans lequel vous devez passer des arguments à FFmpeg:
(une). Appelez le binaire.
(b). Passez tous les arguments à FFmpeg (tels que -loglevel
directement) avant de déclarer des entrées.
(c). Si vous utilisez un décodage accéléré par le matériel, par exemple cuvid
, déclarez-le ici et incluez tous les arguments spécifiques dont il a besoin. À ce stade, il serait impératif de mentionner que les décodeurs ont des contraintes spécifiques, telles que les résolutions d'entrée attendues, les codecs pris en charge, etc. à ce stade, le codage a échoué et est irrécupérable. En fait, les développeurs MPV l'ont mentionné à plusieurs reprises , ne comptez pas sur le décodage accéléré par le matériel pour la livraison de contenu critique.
(ré). Déclarez vos entrées. Pour les flux, utilisez l'URL et, si nécessaire, ajoutez des indicateurs supplémentaires (tels que la taille des tampons) si nécessaire. Pour les ressources locales (sur un système de fichiers accessible), le chemin absolu du fichier est nécessaire.
e). Eventuellement, insérez un filtre. Ceci est nécessaire pour des fonctions telles que le redimensionnement, les conversations au format pixel, le désentrelacement, etc. Notez que selon le filtre utilisé ici, un décodeur matériel (comme décrit dans la section (c) introduira des contraintes que votre filtre doit être capable de gérer, sinon votre encodage échouera.
(F). Appeler les codeurs vidéo et audio appropriés, et de transmettre les arguments nécessaires pour les applications, tels que, bitrate, préréglages de l' encodeur, etc. En matière de bitrates, assurez -vous que vos valeurs souhaitées sont définies par les -b:v
, -maxrate:v
et les -bufsize:v
options. Ne laissez pas ces champs vides. C'est un bon point de départ pour expliquer pourquoi ces valeurs sont importantes. Comme toujours, commencez par spécifier un préréglage. Faites défiler vers le bas pour voir des notes sur l'impact sur les performances des préréglages avec cet encodeur particulier.
(g). Alors que FFmpeg peut déduire le format de sortie requis d'un fichier en fonction de l'extension sélectionnée du fichier de sortie, il est recommandé de déclarer explicitement le format de sortie (via l'option -f) afin que des options supplémentaires puissent être transmises au multiplexeur sous-jacent si nécessaire. , comme c'est souvent le cas avec les formats de streaming tels que HLS, mpegts et DASH.
(h). Chemin absolu du fichier de sortie.
Avec votre exemple ci-dessus, cité comme suit:
ffmpeg -i "e:\input.ts" -vcodec h264_nvenc -preset slow -level 4.1
-qmin 10 -qmax 52 "e:\output.mp4"
Vous pouvez augmenter la qualité de sortie en spécifiant des débits appropriés (par l'intermédiaire -b:v
, -maxrate:v
et les -bufsize:v
paramètres), permettant à des techniques de codage de quantification adaptative (méthodes d'AQ spatiales et temporelles sont prises en charge, dont un seul peut être utilisé à la fois) et par éventuellement (et séparément) activer la prédiction pondérée (qui désactivera la prise en charge de la trame B) comme indiqué ci-dessous, ainsi qu'un filtre optionnel pour une réduction d'échelle appropriée et redimensionner si nécessaire. L'exemple ci-dessous montre un extrait de code gérant les entrées mpegts encodées en mpeg2:
ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v mpeg2_cuvid -i "e:\input.ts" \
-filter:v hwupload_cuda,scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 \
-spatial_aq:v 1 -aq-strength:v 15 -coder:v cabac \
-f mp4 "e:\output.mp4"
Avertissement: Notez que la prédiction pondérée ( -weighted_pred
) ne peut pas être activée en même temps que la quantification adaptative. Tenter de le faire entraînera l'échec de l'initialisation de l'encodeur.
L'extrait ci-dessus suppose que le fichier d'entrée est un flux MPEG2. Si ce n'est pas le cas, passez au décodeur CUVID correct après l'avoir analysé:
ffprobe -i e:\input.ts
S'il s'agit de 'H.264 / AVC, modifiez l'extrait de code comme indiqué ci-dessous:
ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v h264_cuvid -i "e:\input.ts" \
-filter:v hwupload_cuda,scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 -spatial_aq:v 1 \
-aq-strength:v 15 -coder:v cabac \
-f mp4 "e:\output.mp4"
J'ai remarqué que l'activation des options de quantification adaptative OU de prédiction pondérée pour NVENC peut introduire des problèmes de stabilité, en particulier avec des combinaisons de pilotes de périphériques spécifiques. Dans la mesure du possible, envisagez d'utiliser des trames B (pas plus de 3) combinées avec l'option générique -refs:v
définie sur 16 ou plus, au lieu de basculer sur AQ et prédiction pondérée:
ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v h264_cuvid -i "e:\input.ts" \
-filter:v hwupload_cuda,scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 -refs:v 16 \
-bf:v 3 -coder:v cabac \
-f mp4 "e:\output.mp4"
Avec Turing , en particulier, vous pouvez également bénéficier de l'activation des cadres B pour référence, comme indiqué ci-dessous (voir la bascule -b_ref_mode:v middle)
:
ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v h264_cuvid -i "e:\input.ts" \
-filter:v hwupload_cuda,scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 -refs:v 16 \
-bf:v 3 -coder:v cabac -b_ref_mode:v middle \
-f mp4 "e:\output.mp4"
Une note supplémentaire sur le nombre de threads (passée à ffmpeg via l' -threads
option):
Plus de threads d'encodeur au-delà d'un certain seuil augmentent la latence et auront une empreinte mémoire d'encodage plus élevée. La dégradation de la qualité est plus importante avec un nombre de threads plus élevé dans les modes à débit binaire constant et le mode à débit binaire presque constant appelé VBV (vérificateur de tampon vidéo), en raison de l'augmentation du délai de codage. Les images clés ont besoin de plus de données que d'autres types de trames pour éviter de pulser des images clés de mauvaise qualité.
Le mode de délai nul ou de thread coupé n'a pas de retard, mais cette option aggrave encore la qualité multi-threads dans les encodeurs pris en charge.
Il est donc judicieux de limiter le nombre de threads sur les encodages où la latence est importante, car l'augmentation du débit de l'encodeur perçu compense tous les avantages qu'il peut apporter à long terme.
Et puisque vous êtes sous Windows, vous souhaiterez peut-être supprimer les échappements du shell \
ci-dessus pendant que j'écris ceci à partir d'une boîte Unix testant la commande ci-dessus.
Remarques sur l'impact sur les performances avec les préréglages et les considérations de codage entrelacé:
Pour un débit élevé et des performances de faible latence, assurez-vous d'utiliser l'un llhp
ou les llhq
préréglages. Ceci est très utile pour les charges de travail telles que la diffusion en direct où une compatibilité plus large avec une plus grande variété d'appareils est attendue, et en tant que tel, les fonctionnalités réductrices de performances telles que les trames B peuvent être complètement omises pour un bon compromis entre des débits binaires plus élevés dans utilisation et débit. Des préréglages plus élevés (tels que ceux par défaut medium
) ont rapidement des rendements décroissants en sortie de qualité tout en entraînant en même temps des ralentissements importants du débit de l'encodeur. La différence de qualité entre llhp
et llhq
telle que mesurée par le VMAF de Netflix est pratiquement négligeable, mais l'augmentation des performances de l'encodeur (plus de ~ 30% sur mon banc d'essai) avec le premier est certainement appréciable.
Pour les préréglages llhp
et llhq
, ainsi que pour les autres préréglages utilisés, vous pouvez également remplacer les méthodes de contrôle de débit intégrées en passant les -rc:v
arguments exposés par les options de l'encodeur. Par exemple, avec un codage à débit binaire constant, vous pouvez spécifier -rc:v cbr
(ce qui est nettement plus rapide que la cbr_ld_hq
méthode de contrôle du débit, apportant une augmentation supplémentaire de ~ 20% du débit). Notez que le préréglage sélectionné a le plus grand impact sur le débit , suivi par les options de préréglage (telles que la méthode de contrôle de débit utilisée) que vous pouvez éventuellement remplacer si vous le souhaitez.
Tenez compte de votre flux de travail d'encodage et ajustez-le si nécessaire. Votre kilométrage variera certainement, en fonction de votre contenu source, des chaînes de filtrage utilisées, de variables de configuration de plate-forme spécifiques (telles que votre GPU et les versions de pilote), etc.
Dans le même souffle, notez que NVIDIA a explicitement désactivé l'encodage entrelacé sur Turing à tous les niveaux, même dans la ligne 1660Ti qui utilise l'ancien encodeur Volta NVENC. Si vous avez besoin d'une prise en charge du codage entrelacé, veuillez plutôt passer à Pascal ou à des références plus anciennes.