J'utilise monFFMPEGavec le suport de mon GPU (NVENC) pour convertir des fichiers de mon récepteur satellite (SD, mpeg2 .TS-Files) en h264. fichiers mp4
Voici la ligne que j'utilise
ffmpeg -i "e:\input.ts" -vcodec h264_nvenc -preset slow -level 4.1
-qmin 10 -qmax 52 "e:\output.mp4"
Mais la qualité n'est pas aussi bonne que prévu. Et toute la puissance de mon système n'est pas utilisée:
Seulement 11% d'utilisation du processeur graphique et 30% du processeur.
Question: Y a-t-il quelques améliorations que je peux apporter pour améliorer la qualité avec une taille de fichier égale et pour utiliser davantage la puissance de calcul de ma Geforce GTX 1080?
J'ai trouvé quelques paramètres de à changer, mais -preset slow
devrait déjà être la meilleure approche de la qualité, n'est-ce pas?
Voici un guide approximatif pour le réglage du codeur:
Nous allons commencer par les bases, car il est préjudiciable de conclure rapidement qu'un barrage rapide d'options améliorera soudainement les résultats attendus sans comprendre les objectifs et les attentes souhaités:
1. Commencez par comprendre les options du codeur.
Pour les encodeurs basés sur NVENC, commencez par apprendre les options que chaque encodeur prend (notez que je suis sous Linux, raison pour laquelle 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
Sortie:
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 le codeur HEVC/H.265:
ffmpeg -hide_banner -h encoder=hevc_nvenc | xclip -sel clip
Sortie:
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 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 codes HEVC sur Pascal.
Ensuite, en utilisant cette information, 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 (tel que -loglevel
directement) avant de déclarer les entrées.
(c) Si vous utilisez un décodage à accélération matérielle, tel que cuvid
, déclarez-le ici et incluez tous les arguments spécifiques nécessaires. À 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 supportés, etc., et qu'en tant que tel, il est recommandé en production de désactiver les décodeurs à accélération matérielle en cas d'échec à ce stade. dans un code en échec et est irrécupérable. En fait, les développeurs de MPV l'ont mentionné à plusieurs reprises , ne comptez pas sur le décodage à accélération matérielle pour la fourniture de contenu essentiel.
(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 de la mémoire tampon) en fonction des besoins. Pour les ressources locales (sur un système de fichiers accessible), le chemin de fichier absolu est nécessaire.
(e) Facultativement, insérez un filtre. Cela 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 basé sur le matériel (décrit dans la section (c) introduira des contraintes que votre filtre doit pouvoir utiliser). gérer, sinon votre encodage échouera.
(F). Appelez les encodeurs audio et vidéo appropriés et transmettez-leur les arguments nécessaires, tels que mappages, débits binaires, préréglages d'encodeur, etc.
(g). Tandis 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 si nécessaire, comme c'est souvent le cas avec les formats de diffusion tels que HLS, mpegts et DASH.
(h). Le 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 décalant un débit binaire plus élevé, ce qui permet d'utiliser des techniques de codage à quantification adaptative (les méthodes AQ spatio-temporelles sont prises en charge, une seule pouvant être utilisée à la fois. Notez également que cela désactive également la prise en charge de la trame B). activant éventuellement les techniques de prédiction pondérées comme indiqué ci-dessous, ainsi qu'un filtre facultatif pour une réduction et une redimensionnement corrects si nécessaire:
ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v mpeg2_cuvid -i "e:\input.ts" \
-filter:v scale_npp=w=1920:h=1080:format=yuv420p:interp_algo=lanczos \
-c:v h264_nvenc -preset:v llhq -profile:v main -level:v 4.1 -rc:v ll_2pass_quality -rc-lookahead:v 32 -temporal-aq:v 1 -weighted_pred:v 1 -coder:v cabac \
-f mp4 "e:\output.mp4"
L'extrait ci-dessus suppose que le fichier d'entrée est un flux MPEG2. Si ce n'est pas le cas, passez au bon décodeur CUVID après l'avoir analysé:
ffprobe -i e:\input.ts
Si c'est 'H.264/AVC, modifiez le fragment comme indiqué ci-dessous:
ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v h264_cuvid -i "e:\input.ts" \
-filter:v scale_npp=w=1920:h=1080:format=yuv420p:interp_algo=lanczos \
-c:v h264_nvenc -preset:v llhq -profile:v main -level:v 4.1 -rc:v ll_2pass_quality -rc-lookahead:v 32 -temporal-aq:v 1 -weighted_pred:v 1 -coder:v cabac \
-f mp4 "e:\output.mp4"
Une note supplémentaire sur le nombre de threads (transmis à ffmpeg via l'option -threads
):
Plus de threads d'encodeur au-delà d'un certain seuil augmentent la latence et auront une empreinte mémoire de codage plus élevée. La dégradation de la qualité est plus importante avec des nombres de threads plus élevés en modes à débit constant et un mode à débit quasi constant appelé VBV (vérificateur de mémoire tampon vidéo), en raison du délai de codage accru. Les images clés nécessitent plus de données que les autres types de trames pour éviter de générer des images clés de mauvaise qualité.
Le mode thread zéro ou sans délai n'a pas de délai, mais cette option aggrave encore la qualité des multi-threads dans les encodeurs pris en charge.
Il est donc sage de limiter le nombre de threads sur les codages là où la latence est importante, car l’augmentation du débit de codeur perçue compense les avantages qu’elle peut apporter à long terme.
Et puisque vous êtes sous Windows, vous voudrez peut-être supprimer les échappements Shell \
ci-dessus pendant que j'écris ceci depuis une boîte Unix testant la commande ci-dessus.
D'après mon expérience avec nvenc, vous devez lui indiquer le débit souhaité - le format par défaut est VBR, ce qui est correct, mais aucun ajustement ne compense le fait qu'il veuille toujours vous donner un débit moyen de 2M, peu importe. quel fichier de résolution vous l'alimentez. Cela ressemble à une faille dans le codeur; il fonctionne de manière prévisible à tous égards, mais il a besoin (par exemple) de -b:v 4M
pour un fichier 720p ou de -b:v 8M
pour 1080p. Vous pouvez probablement les baisser un peu si vous le souhaitez aussi.