1 votes

Matériel Intel i5 Kaby Lake - transcodage de la vidéo et de l'audio en VP9 et FLAC à l'aide de ffmpeg

J'ai environ 30 gigaoctets de vidéo (principalement MP4, quelques MKV et webm) que je dois transcoder en VP9 8 bits avec audio FLAC (Free Lossless Audio Codec) dans un conteneur MKV à partir de divers codecs d'entrée (audio AAC ; H264, VP8, H265/HEVC, et probablement d'autres codecs vidéo). Sur mon système le plus puissant, le transcodage de vidéos à faible résolution prend deux fois plus de temps que la longueur de la vidéo. J'utilise ffmpeg sous Linux avec les arguments ffmpeg -i input -c:v libvpx-vp9 -lossless 1 -c:a FLAC -preset veryslow output.mkv pour transcoder des vidéos sans assistance matérielle. Récemment, cependant, un de mes amis a obtenu un processeur Intel i5 Kaby Lake pour son PC, et a proposé de transcoder les vidéos pour moi. D'après Wikipedia et son références les nouveaux processeurs Kaby Lake prennent en charge le décodage matériel de tous mes codecs d'entrée et l'encodage de VP9 8 bits. J'ai donc deux questions :

  1. Quoi ffmpeg arguments que mon ami peut utiliser pour transcoder les vidéos en VP9 et l'audio en FLAC dans un conteneur MKV ? Fonctionnent-ils avec Windows ? Si ce n'est pas le cas, ce n'est pas grave car il a un dual-boot Windows 10-Linux.

  2. Est-ce que le veryslow est toujours nécessaire pour obtenir la meilleure compression ?

J'ai essayé de trouver la réponse à cette question ailleurs mais je n'ai pu trouver que des exemples d'encodage de codecs comme H264 et JPEG.

4voto

Dennis Mungai Points 2529

A ce jour, il est possible de construire FFmpeg avec VAAPI, qui, sur les systèmes supportés, vous permet d'encoder VP9 sur le GPU intégré d'Intel.

Le nouvel encodeur, lorsque ffmpeg est compilé avec le support VAAPI est appelé vp9_vaapi .

Pour voir les options disponibles à utiliser lors du réglage de l'encodeur, exécutez :

ffmpeg -hide-banner -h encoder=vp9_vaapi

Sortie :

Encoder vp9_vaapi [VP9 (VAAPI)]:
    General capabilities: delay 
    Threading capabilities: none
    Supported pixel formats: vaapi_vld
vp9_vaapi AVOptions:
  -loop_filter_level <int>        E..V.... Loop filter level (from 0 to 63) (default 16)
  -loop_filter_sharpness <int>        E..V.... Loop filter sharpness (from 0 to 15) (default 4)

Que se passe-t-il lorsque vous essayez de faire cela sur du matériel non pris en charge, par exemple Skylake ?

Voir l'exemple de sortie ci-dessous :

[Parsed_format_0 @ 0x42cb500] compat: called with args=[nv12]
[Parsed_format_0 @ 0x42cb500] Setting 'pix_fmts' to value 'nv12'
[Parsed_scale_vaapi_2 @ 0x42cc300] Setting 'w' to value '1920'
[Parsed_scale_vaapi_2 @ 0x42cc300] Setting 'h' to value '1080'
[graph 0 input from stream 0:0 @ 0x42cce00] Setting 'video_size' to value '3840x2026'
[graph 0 input from stream 0:0 @ 0x42cce00] Setting 'pix_fmt' to value '0'
[graph 0 input from stream 0:0 @ 0x42cce00] Setting 'time_base' to value '1/1000'
[graph 0 input from stream 0:0 @ 0x42cce00] Setting 'pixel_aspect' to value '1/1'
[graph 0 input from stream 0:0 @ 0x42cce00] Setting 'sws_param' to value 'flags=2'
[graph 0 input from stream 0:0 @ 0x42cce00] Setting 'frame_rate' to value '24000/1001'
[graph 0 input from stream 0:0 @ 0x42cce00] w:3840 h:2026 pixfmt:yuv420p tb:1/1000 fr:24000/1001 sar:1/1 sws_param:flags=2
[format @ 0x42cba40] compat: called with args=[vaapi_vld]
[format @ 0x42cba40] Setting 'pix_fmts' to value 'vaapi_vld'
[auto_scaler_0 @ 0x42cd580] Setting 'flags' to value 'bicubic'
[auto_scaler_0 @ 0x42cd580] w:iw h:ih flags:'bicubic' interl:0
[Parsed_format_0 @ 0x42cb500] auto-inserting filter 'auto_scaler_0' between the filter 'graph 0 input from stream 0:0' and the filter 'Parsed_format_0'
[AVFilterGraph @ 0x42ca360] query_formats: 6 queried, 4 merged, 1 already done, 0 delayed
[auto_scaler_0 @ 0x42cd580] w:3840 h:2026 fmt:yuv420p sar:1/1 -> w:3840 h:2026 fmt:nv12 sar:1/1 flags:0x4
[hwupload @ 0x42cbcc0] Surface format is nv12.
[AVHWFramesContext @ 0x42ccbc0] Created surface 0x4000000.
[AVHWFramesContext @ 0x42ccbc0] Direct mapping possible.
[AVHWFramesContext @ 0x42c3e40] Created surface 0x4000001.
[AVHWFramesContext @ 0x42c3e40] Direct mapping possible.
[AVHWFramesContext @ 0x42c3e40] Created surface 0x4000002.
[AVHWFramesContext @ 0x42c3e40] Created surface 0x4000003.
[AVHWFramesContext @ 0x42c3e40] Created surface 0x4000004.
[AVHWFramesContext @ 0x42c3e40] Created surface 0x4000005.
[AVHWFramesContext @ 0x42c3e40] Created surface 0x4000006.
[AVHWFramesContext @ 0x42c3e40] Created surface 0x4000007.
[AVHWFramesContext @ 0x42c3e40] Created surface 0x4000008.
[AVHWFramesContext @ 0x42c3e40] Created surface 0x4000009.
[AVHWFramesContext @ 0x42c3e40] Created surface 0x400000a.
[vp9_vaapi @ 0x409da40] Encoding entrypoint not found (19 / 6).
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height
[AVIOContext @ 0x40fdac0] Statistics: 0 seeks, 0 writeouts
[aac @ 0x40fcb00] Qavg: -nan
[AVIOContext @ 0x409f820] Statistics: 32768 bytes read, 0 seeks
Conversion failed!

Les bits intéressants sont les avertissements du point d'entrée pour l'encodage VP9 qui sont absents sur cette plateforme particulière, comme le confirme la sortie de vainfo :

libva info: VA-API version 0.40.0
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/local/lib/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_40
libva info: va_openDriver() returns 0
vainfo: VA-API version: 0.40 (libva 1.7.3)
vainfo: Driver version: Intel i965 driver for Intel(R) Skylake - 1.8.4.pre1 (glk-alpha-71-gc3110dc)
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Simple            : VAEntrypointEncSlice
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointEncSliceLP
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointEncSliceLP
      VAProfileH264MultiviewHigh      : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointEncSlice
      VAProfileH264StereoHigh         : VAEntrypointVLD
      VAProfileH264StereoHigh         : VAEntrypointEncSlice
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileJPEGBaseline           : VAEntrypointVLD
      VAProfileJPEGBaseline           : VAEntrypointEncPicture
      VAProfileVP8Version0_3          : VAEntrypointVLD
      VAProfileVP8Version0_3          : VAEntrypointEncSlice
      VAProfileHEVCMain               : VAEntrypointVLD
      VAProfileHEVCMain               : VAEntrypointEncSlice
      VAProfileVP9Profile0            : VAEntrypointVLD

Le point d'entrée VLD (pour Variable Length Decode) pour le profil 0 de VP9 est le point le plus avancé de Skylake en termes d'accélération matérielle de VP9.

Ceux-ci avec les bancs d'essai Kabylake, exécutez ces tests de codage et faites un rapport :-)

3voto

veikk0 Points 56

MISE À JOUR LE 3 AOÛT 2017 : Selon une réponse plus récente de l'utilisateur , ffmpeg a maintenant un support pour l'encodage VP9 via VAAPI. Je n'ai toujours pas le matériel nécessaire pour tester cela cependant, donc ma réponse sera d'une aide limitée. Je vais laisser ma réponse originale sur la façon d'encoder VP9 dans le logiciel ci-dessous.


Pour une raison quelconque, FFmpeg ne supporte pas l'encodage VP9 sur l'encodeur matériel QuickSync d'Intel, même s'ils supportent H.264 et HEVC. . Une recherche dans le dépôt de code source de FFmpeg montre qu'il ne s'agit même pas d'une désactivation, la fonctionnalité n'a tout simplement pas encore été implémentée. Mais si elle devient disponible à un moment donné dans le futur, elle devrait être utilisable d'une manière similaire aux autres encodeurs QuickSync : un commutateur comme -c:v vp9_qsv au lieu de -c:v libvpx-vp9 devrait faire l'affaire.

L'utilisation de la ligne de commande de FFmpeg est la même sur toutes les plateformes, avec la seule exception notable que je connaisse, les utilisateurs de Windows devant utiliser NUL au lieu de /dev/null pour la sortie lors de la première passe d'un codage à deux passes. Mais puisque vous faites un passage unique et sans perte, cela ne devrait pas vous affecter.

Si vous voulez accélérer vos encodages, la chose la plus évidente à essayer est de définir une valeur de vitesse d'encodage avec la fonction -speed interrupteur. Les valeurs recommandées sont des nombres de 0 à 4, 0 étant vraiment, vraiment lent (pensez à -preset placebo en x264 mais en pire) mais de haute qualité et 4 étant rapide tout en étant de qualité inférieure. ffmpeg utilise -speed 1 par défaut, ce qui est un bon compromis entre vitesse et qualité pour un encodage avec perte. Cependant, je viens de faire un test rapide de l'encodage sans perte avec différentes valeurs de vitesse et j'ai remarqué une réduction de 32% de la taille du fichier en passant de -speed 1 à -speed 0 avec un encodage sans perte. Le temps d'encodage a cependant triplé, donc c'est à vous de voir si l'utilisation de 0 en vaut la peine. Le fichier produit par -speed 4 n'était que de 1,1% plus grande que celle produite par -speed 1 mais il a été encodé 43% plus vite. Donc, je dirais que si vous faites du lossless et -speed 0 est trop lent, vous pouvez tout aussi bien utiliser -speed 4 .

Une autre amélioration importante des performances d'encodage consiste à activer le multi-threading avec l'option -threads libvpx n'utilise pas automatiquement plusieurs threads donc cela doit être défini manuellement par l'utilisateur. Vous devez également définir le nombre de colonnes de tuiles avec l'option -tile-columns interrupteur. Cette option permet à libvpx de diviser la vidéo en plusieurs tuiles et d'encoder ces tuiles en parallèle pour un meilleur multi-threading. Vous pouvez trouver les nombres recommandés pour le nombre de colonnes de tuiles et de threads dans la section "Recommandations sur les tuiles et les threads" du site web de Guide d'encodage VP9 de Google . Comme vous pouvez le constater, le nombre de threads utilisés augmente avec le nombre de tuiles, ce qui signifie qu'en fonction du nombre de cœurs de processeur disponibles, votre processeur peut ne pas être entièrement saturé lors de l'encodage de vidéos en basse résolution HD. Si vous encodez principalement des vidéos à basse résolution, vous devriez envisager d'encoder plusieurs fichiers en même temps.

Cependant, il y a encore une fois moyen d'accélérer l'encodage VP9 : le multi-threading dans une seule tuile de colonne qui peut être activé avec la fonction -row mt 1 . Au 4 avril (2017, bonjour les gens du futur), il ne fait pas partie d'une version publiée de libvpx mais sera très probablement dans libvpx 1.6.2. Si vous voulez l'essayer avant la prochaine version, vous devez compiler des versions git récentes de libvpx et ffmpeg à partir des sources. Il suffit de suivre Guide de compilation de FFmpeg pour la distro de votre choix, mais au lieu de télécharger et d'extraire une archive de version, faites git pull https://chromium.googlesource.com/webm/libvpx ではなく

Quant à la veryslow qui n'est utilisé que dans x264 et x265. libvpx utilise le préréglage -speed et en plus le -quality best , -quality good または -quality realtime pour définir le temps que l'encodeur est autorisé à passer à encoder une image. La valeur par défaut est -quality good parce que -quality best est si lent qu'il est inutilisable et -quality realtime est destiné à être utilisé pour des applications à délai de réponse critique, comme les appels vidéo et le livestreaming.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X