C'est maintenant possible, mais sous Linux via VAAPI.
Ici est un gist qui vous montre comment générer une construction fonctionnelle sur Ubuntu 16.04LTS.
Pour les codeurs basés sur le QSV, comme testé avec le SDK Intel Media opensource (sur un banc d'essai Apollolake), seuls les encodeurs H.264/AVC et HEVC sont disponibles. Les générations plus récentes exposeront généralement plus de capacités d'encodage.
Notez que l'accélération H/W de QuickSync requiert la présence de l'icône de l'ordinateur. pilote de médias sur le système. Certaines distributions Linux, telles que Ubuntu 19.04LTS (et plus) l'empaqueter dans leurs dépôts .
Mise à jour : L'encodage VP9 est maintenant activé pour IceLake (ICL+) matériel par le biais de QuickSync, et FFmpeg peut en tirer parti .
Des exemples démontrant l'utilisation de la fonction de FFmpeg vp9_vaapi
y vp9_qsv
enveloppes de codeurs :
Vous devrez utiliser FFmpeg directement, où vous pouvez éventuellement ajouter l'option vp9_superframe et le vp9_raw_reorder filtres à flux binaire dans la même ligne de commande si vous activez les B-frames dans l'option vp9_vaapi
encodeur.
Ejemplo:
ffmpeg -vaapi_device /dev/dri/renderD128 -hwaccel vaapi \
-i http://server:port -vf 'format=nv12|vaapi,hwupload' \
-c:v vp9_vaapi -global_quality 50 -bf 1 \
-bsf:v vp9_raw_reorder,vp9_superframe \
-f segment -segment_time 5 -segment_format_options movflags=+faststart output%03d.mp4
Ajustez vos chemins/urls d'entrée et de sortie selon les besoins.
Ce que fait cette commande :
Il créera des segments mp4 d'une durée de 5 secondes, via l'interface utilisateur. muxer de segments . Voir l'utilisation de la movflags=+faststart
et comment il a été transmis comme option de format au muxer mp4 sous-jacent par l'intermédiaire de -segment_format_options
drapeau ci-dessus.
Les segments peuvent ne pas durer exactement 5 secondes, car chaque segment commence (est coupé sur) (avec) une image clé.
Cependant, je ne recommanderais pas d'activer les B-frames dans cet encodeur, car ces filtres de flux binaire ont d'autres effets indésirables, tels que jouer avec le contrôle de la vitesse de l'encodeur y déclenchant des bogues comme celui-ci . Ce n'est pas souhaitable dans un environnement de production. C'est pourquoi les scripts ci-dessous n'ont pas cette option activée, et au lieu de cela, nous définissons un mode de contrôle du taux de consigne directement dans les options de l'encodeur.
Si vous devez tirer parti de l'encodage 1:N avec VAAPI, utilisez ces extraits :
-
Si vous avez besoin de désentrelacer, appelez la fonction deinterlace_vaapi
filtre :
ffmpeg -loglevel debug -threads 1 \
-init_hw_device vaapi=va:/dev/dri/renderD128 -hwaccel vaapi -hwaccel_device va -filter_hw_device va -hwaccel_output_format vaapi \
-i 'http://server:port' \
-filter_complex "[0:v]format=nv12|vaapi,hwupload,deinterlace_vaapi,split=3[n0][n1][n2]; \
[n0]scale_vaapi=1152:648[v0]; \
[n1]scale_vaapi=848:480[v1];
[n2]scale_vaapi=640:360[v2]" \
-b:v:0 2250k -maxrate:v:0 2250k -bufsize:v:0 360k -c:v:0 vp9_vaapi -g:v:0 50 -r:v:0 25 -rc_mode:v:0 2 \
-b:v:1 1750k -maxrate:v:1 1750k -bufsize:v:1 280k -c:v:1 vp9_vaapi -g:v:1 50 -r:v:1 25 -rc_mode:v:1 2 \
-b:v:2 1000k -maxrate:v:2 1000k -bufsize:v:2 160k -c:v:2 vp9_vaapi -g:v:2 50 -r:v:2 25 -rc_mode:v:2 2 \
-c:a aac -b:a 128k -ar 48000 -ac 2 \
-flags -global_header -f tee -use_fifo 1 \
-map "[v0]" -map "[v1]" -map "[v2]" -map 0:a \
"[select=\'v:0,a\':f=segment:segment_time=5:segment_format_options=movflags=+faststart]$output_path0/output%03d.mp4| \
[select=\'v:1,a\':f=segment:segment_time=5:segment_format_options=movflags=+faststart]$output_path1/output%03d.mp4| \
[select=\'v:2,a\':f=segment:segment_time=5:segment_format_options=movflags=+faststart]$output_path2/output%03d.mp4"
-
Sans désentrelacement :
ffmpeg -loglevel debug -threads 1 \
-init_hw_device vaapi=va:/dev/dri/renderD128 -hwaccel vaapi -hwaccel_device va -filter_hw_device va -hwaccel_output_format vaapi \
-i 'http://server:port' \
-filter_complex "[0:v]format=nv12|vaapi,hwupload,split=3[n0][n1][n2]; \
[n0]scale_vaapi=1152:648[v0]; \
[n1]scale_vaapi=848:480[v1];
[n2]scale_vaapi=640:360[v2]" \
-b:v:0 2250k -maxrate:v:0 2250k -bufsize:v:0 2250k -c:v:0 vp9_vaapi -g:v:0 50 -r:v:0 25 -rc_mode:v:0 2 \
-b:v:1 1750k -maxrate:v:1 1750k -bufsize:v:1 1750k -c:v:1 vp9_vaapi -g:v:1 50 -r:v:1 25 -rc_mode:v:1 2 \
-b:v:2 1000k -maxrate:v:2 1000k -bufsize:v:2 1000k -c:v:2 vp9_vaapi -g:v:2 50 -r:v:2 25 -rc_mode:v:2 2 \
-c:a aac -b:a 128k -ar 48000 -ac 2 \
-flags -global_header -f tee -use_fifo 1 \
-map "[v0]" -map "[v1]" -map "[v2]" -map 0:a \
"[select=\'v:0,a\':f=segment:segment_time=5:segment_format_options=movflags=+faststart]$output_path0/output%03d.mp4| \
[select=\'v:1,a\':f=segment:segment_time=5:segment_format_options=movflags=+faststart]$output_path1/output%03d.mp4| \
[select=\'v:2,a\':f=segment:segment_time=5:segment_format_options=movflags=+faststart]$output_path2/output%03d.mp4"
-
Utilisation de QuickSync d'Intel (sur les plates-formes prises en charge) :
Sur les processeurs Intel Icelake et supérieurs, vous pouvez utiliser la commande vp9_qsv
avec les limitations connues suivantes (pour le moment) :
(a). Vous devez permettre low_power mode
parce que seul le chemin de décodage VDENC est exposé par l'interface utilisateur. iHD
pour l'instant.
(b). Les codages option1 et extra_data ne sont pas supportés par MSDK.
(c). L'en-tête IVF sera inséré par défaut dans MSDK, mais il n'est pas nécessaire pour FFmpeg, et reste désactivé par défaut.
Voir les exemples ci-dessous :
-
Si vous avez besoin de désentrelacer, appelez la fonction vpp_qsv
filtre :
ffmpeg -nostdin -y -fflags +genpts -init_hw_device qsv=hw \
-hwaccel qsv -hwaccel_output_format qsv \
-filter_hw_device hw \
-threads 1 -vsync 1 -async 1 -reinit_filter 1 \
-i 'http://server:port' \
-filter_complex "[0:v]format=nv12|qsv,hwupload=extra_hw_frames=64,vpp_qsv=deinterlace=2:async_depth=4,split[n0][n1][n2]; \
[n0]vpp_qsv=w=1152:h=648:async_depth=4[v0]; \
[n1]vpp_qsv=w=848:h=480:async_depth=4[v1];
[n2]vpp_qsv=w=640:h=360:async_depth=4[v2]" \
-b:v:0 2250k -maxrate:v:0 2250k -bufsize:v:0 360k -c:v:0 vp9_qsv -g:v:0 50 -r:v:0 25 -low_power:v:0 2 \
-b:v:1 1750k -maxrate:v:1 1750k -bufsize:v:1 280k -c:v:1 vp9_qsv -g:v:1 50 -r:v:1 25 -low_power:v:1 2 \
-b:v:2 1000k -maxrate:v:2 1000k -bufsize:v:2 160k -c:v:2 vp9_qsv -g:v:2 50 -r:v:2 25 -low_power:v:2 2 \
-c:a aac -b:a 128k -ar 48000 -ac 2 \
-flags -global_header -f tee -use_fifo 1 \
-map "[v0]" -map "[v1]" -map "[v2]" -map 0:a \
"[select=\'v:0,a\':f=segment:segment_time=5:segment_format_options=movflags=+faststart]$output_path0/output%03d.mp4| \
[select=\'v:1,a\':f=segment:segment_time=5:segment_format_options=movflags=+faststart]$output_path1/output%03d.mp4| \
[select=\'v:2,a\':f=segment:segment_time=5:segment_format_options=movflags=+faststart]$output_path2/output%03d.mp4"
-
Sans désentrelacement :
ffmpeg -nostdin -y -fflags +genpts -init_hw_device qsv=hw \
-hwaccel qsv -hwaccel_output_format qsv \
-filter_hw_device hw \
-threads 1 -vsync 1 -async 1 -reinit_filter 1 \
-i 'http://server:port' \
-filter_complex "[0:v]format=nv12|qsv,hwupload=extra_hw_frames=64,split=3[n0][n1][n2]; \
[n0]vpp_qsv=w=1152:h=648:async_depth=4[v0]; \
[n1]vpp_qsv=w=848:h=480:async_depth=4[v1];
[n2]vpp_qsv=w=640:h=360:async_depth=4[v2]" \
-b:v:0 2250k -maxrate:v:0 2250k -bufsize:v:0 2250k -c:v:0 vp9_qsv -g:v:0 50 -r:v:0 25 -low_power:v:0 2 \
-b:v:1 1750k -maxrate:v:1 1750k -bufsize:v:1 1750k -c:v:1 vp9_qsv -g:v:1 50 -r:v:1 25 -low_power:v:1 2 \
-b:v:2 1000k -maxrate:v:2 1000k -bufsize:v:2 1000k -c:v:2 vp9_qsv -g:v:2 50 -r:v:2 25 -low_power:v:2 2 \
-c:a aac -b:a 128k -ar 48000 -ac 2 \
-flags -global_header -f tee -use_fifo 1 \
-map "[v0]" -map "[v1]" -map "[v2]" -map 0:a \
"[select=\'v:0,a\':f=segment:segment_time=5:segment_format_options=movflags=+faststart]$output_path0/output%03d.mp4| \
[select=\'v:1,a\':f=segment:segment_time=5:segment_format_options=movflags=+faststart]$output_path1/output%03d.mp4| \
[select=\'v:2,a\':f=segment:segment_time=5:segment_format_options=movflags=+faststart]$output_path2/output%03d.mp4"
Notez que nous utilisons le vpp_qsv filter
con el async_depth
Cette option améliore considérablement les performances de transcodage par rapport à l'utilisation de l'option scale_qsv
y deinterlace_qsv
. Voir ce commit sur le git de FFmpeg.
Note : Si vous utilisez le chemin QuickSync, notez que le mode d'encodage MFE (Multi-Frame encoding mode) sera activé par défaut si la bibliothèque Media SDK de votre système le prend en charge.
Références :
-
Voir les options de l'encodeur, y compris les méthodes de contrôle de la vitesse prises en charge :
ffmpeg -h encoder=vp9_vaapi
-
Voir les options d'utilisation du filtre deinterlace_vaapi :
ffmpeg -h filter=deinterlace_vaapi
-
Sur le vpp_qsv
utilisation du filtre, voir :
ffmpeg -h filter=vpp_qsv
Par exemple, si vous souhaitez que le désentrelaceur produise une sortie à la fréquence des champs plutôt qu'à la fréquence des images, vous pouvez passer l'option rate=field
à la place :
-vf=vaapi_deinterlace=rate=field
Cette fonction, par exemple, est liée aux encodeurs qui supportent MBAFF . D'autres, tels que ceux basés sur NVENC dans FFmpeg, n'ont pas mis en œuvre cette mesure (au moment de la rédaction).
Conseils pour optimiser les performances des encodeurs matériels dans FFmpeg :
Lorsque cela est possible, déduisez les documents intégrés, comme dans les exemples ci-dessus. Ils peuvent découvrir des pièges potentiels que vous pouvez éviter en comprenant comment le chaînage des filtres et l'initialisation de l'encodeur fonctionnent, les fonctionnalités non supportées, etc, et l'impact sur les performances.
Deuxièmement, lorsque cela est possible, tirez parti du transcodage 1:N lorsque plusieurs sorties sont nécessaires. De cette façon, les entrées et les produits de la chaîne de filtrage peuvent être réutilisés.
Par exemple, vous verrez que dans les extraits ci-dessus, nous n'appelons le désentrelaceur qu'une seule fois, puis nous divisons sa sortie via la fonction split
filtre pour séparer les scalers. Ceci est fait pour réduire la surcharge qui aurait été encourue si nous avions appelé le désentrelaceur plus d'une fois, et cela aurait été du gaspillage.