30 décembre 2021

Activer l’accélération matérielle pour Jellyfin sur un Mele Quieter 2

Il y a quelques mois, j’ai acheté un mini PC Mele Quieter 2.

C’est une machine extrêmement compacte, mue par un processeur J4125 de chez Intel, de faible puissance, mais à la consommation très faible aussi, et surtout sans ventilateur donc totalement silencieuse. J’y ai installé plusieurs services, dont un serveur Jellyfin permettant le partage de vidéos de famille dans mon réseau interne, mais aussi externe pour que mes enfants et moi-même puissions y accéder de n’importe où.

J’y ai adjoint un disque dur externe de grande capacité branché en USB3, et un ssd Nvme interne de 1 To pour avoir un peu de place, servir de cache et de stockage pour les autres services.

J’ai découvert cet appareil grâce au site Minimachine et notamment cet article dont je remercie chaudement l’auteur.

Je ferai sans doute d’autres articles sur le sujet, mais aujourd’hui je vais me concentrer sur un point en particulier, l’accélération matérielle du décodage/encodage de vidéos.


Jellyfin est tout rouge

La machine est normalement livrée avec Windows 10, mais j’ai préféré installer une Ubuntu récente. L’installation s’est déroulée sans aucun problème, tout le matériel est reconnu et l’appareil est étonnamment efficace pour toutes les tâches que je lui demande d’effectuer.
Parmi celles-ci, la plus gourmande est sans conteste Jellyfin, et notamment sa fonction de transcodage.

Jellyfin est un serveur de média open-source, équivalent du très connu Kodi, qui permet de se construire une bibliothèque de contenu, de l’organiser en différentes médiathèques et de servir ses fichiers à, à peu près n’importe quoi, du simple navigateur internet, à la smart TV, Nvidia Shield, ou téléphone.

Lorsque le client est capable de décoder le flux, ce dernier est transmis directement. Dans le cas contraire, Jellyfin se charge de transcoder le média à la volée.
Jusqu’à peu, tout allait bien, mais récemment j’ai récupéré une vidéo de vacances encodée en 4K avec le format H265. Ce fichier comportait aussi de nombreux sous-titres, ainsi que des pistes audio 7.1.
Impossible de le lire sans saccades, coupures et gels de plusieurs dizaines de secondes.

Un btop me montre que le transcodage monte tous les cœurs du CPU à pas loin de 100% en permanence.

Je comprends alors que l’accélération matérielle n’est pas activée.

Accélération matérielle

Voici donc le résultat de mes recherches.

Le processeur vient avec une partie graphique de chez intel, le UHD 600 :

orlanth@zeus:~$ sudo lshw -c video
*-display
description: VGA compatible controller
product: GeminiLake [UHD Graphics 600]
vendor: Intel Corporation
physical id: 2
bus info: pci@0000:00:02.0
version: 06
width: 64 bits
clock: 33MHz
capabilities: pciexpress msi pm vga_controller bus_master cap_list
configuration: driver=i915 latency=0
resources: irq:133 memory:a0000000-a0ffffff memory:90000000-9fffffff ioport:f000(size=64) memory:c0000-dffff

Le driver par défaut est le intel-media-va-driver.

J’ai vu sur certains sites, que la version non-free est sans doute plus avancée. Je ne suis pas sûr que cette étape soit obligatoire, mais au cas où, j’installe cette version puis je reboote.

orlanth@zeus:~$ sudo apt search intel-media-va-driver-non-free

Ayant installé Jellyfin via docker (et surtout docker-compose), il faut impérativement passer la carte graphique du système « réel » au système du docker.
Pour cela il faut ajouter quelques lignes au fichier docker compose.

orlanth@zeus:/var/www/jellyfin$ cat docker-compose.yml
version: '3'
services:
  jellyfin:
    image: jellyfin/jellyfin
    container_name: jellyfin

    network_mode: "host"

    volumes:
    - /home/orlanth/.jellyfin:/config
    - /media/:/media
    environment:
    - PUID=1000
    - PGID=1000
    restart: always
    devices:
    - /dev/dri/renderD128:/dev/dri/renderD128
    - /dev/dri/card0:/dev/dri/card0

Il s’agit des 3 dernières lignes, devices et les deux devs.
Il faut les ajouter telles quelles.
Ensuite docker-compose down pour arrêter les services et docker-compose up -d pour les relancer.
On est bon côté système, maintenant il faut l’activer côté applicatif.

Encore quelques clics

Dans le tableau de bord de Jellyfin, il faut aller dans Lecture.

Puis Transcodage.

Dans la liste « Accélération matérielle », choisir Video Acceleration API (VAAPI).

Cocher HEVC puis descendre jusqu’au Profil d’encodage.

J’ai choisi superfast en me disant que je pouvais me contenter d’une qualité moindre, mais je ne sais pas si cela a un gros impact par rapport à fast utilisé par défaut.

Enfin ne pas oublier de sauvegarder les modifications en cliquant sur le bouton en bas de la page.

Attention à ne PAS cocher Adapter la vitesse du transcodage.

Je relance la vidéo et mon btop me montre que cette fois les cœurs du CPU ne montent plus qu’à 25% en moyenne.

L’accélération est donc bien activée !

Yeah !

À suivre

Si j’ai gagné en CPU et en chaleur, ainsi qu’en fluidité puisque j’arrive à lire un peu mieux le fichier, j’ai toujours des freezes mais beaucoup moins nombreux et beaucoup plus court.

Du coup, je peux faire deux choses.

En changeant la qualité pour quelque chose d’inférieur au 4K je réduis grandement la charge, notamment sur le réseau.

Et sinon, je fais comme sur Youtube à la grande époque des embrouilles avec Free, je lance le film, je mets la pause et j’attends une trentaine de secondes que le chargement se fasse, ensuite je suis à peu près tranquille.

En résumé, je suis toujours très content, mais je ferai plus attention au format des films de vacances que je peux trouver.