Dernière modification
07/30/2025

Electron - Lecture de vidéo avec Hardware Acceleration sur Raspberry Pi (RPi)

Lecture de 4 minutes

Lorsqu'un vidéo HD est joué dans Electron sur un Raspberry Pi 4B, les performances de lecture sont médiocres (par exemple, le son coupe au ~3 secondes et le CPU est très sollicité). Pourtant, la lecture est bonne dans le navigateur Chromium fourni avec le RPi OS, ce qui démontre qu'un peu plus de performance est possible.

Essayons de comprendre pourquoi.

Comparaison des performances

Un vidéo YouTube en HD est utilisé à de fins de test.

Pour savoir quel codec est utilisé, dans YouTube, il suffit de faire clic-droit sur la vidéo, puis Stats for nerds.

Pour savoir quel décodeur est utilisé, dans l'inspecteur de Chromium, l'outil «Media» doit être sélectionné dans More tools. Puis, on accède aux informations du vidéo en cours de lecture.

Choix du codec

Le codec utilisé est établi au cours d'une "négociation" entre le navigateur et le fournisseur de vidéo. Le fournisseur émet une liste de codecs disponibles, et le navigateur liste ceux qu'il supporte avec la fonction window.MediaSource.isTypeSupported(). Le codec jugé optimal est alors lu dans le navigateur.

Une plateforme comme YouTube va offrir des dizaines d'options de codecs au navigateur, alors qu'un vidéo personnalisé hébergé sur un site web va habituellement en offrir qu'un ou deux.

Environnements concernés

Les enjeux de performances se produisent en date du 29 juillet 2025 avec les configurations suivantes :

  • Raspberry Pi 4B (non testés sur les autres modèles)
  • Les versions de Electron 34.5.8, 35.7.2, 36.7.3, 37.2.4 et 38.0.0-alpha.11 (sur les versions précédentes, les performances sont aussi médiocres, mais les informations dans chrome://gpu sont différentes).
  • Raspberry Pi OS (64-bit), 13 May 2025, Kernel 6.12, Debian 12 (bookworm)

Performances dans Chromium

La lecture de vidéo dans le Chromium fournie dans le OS est acceptable. La lecture d'un vidéo HD sur YouTube se fera sans trop de framedrop. Le vidéo est décodé en utilisant le décodeur V4L2VideoDeocder.

Informations de GPU 1

Si on ouvre la page chrome://gpu, on peut y lire Video Decode: Hardware accelerated.

Performances dans Electron

La lecture du même vidéo dans Electron est beaucoup moins fluide. Par défaut, les codecs sélectionnés sont parfois différents et ils sont décodés par le décodeur Dav1dVideoDecoder ou FFMpegDecoder.

Informations de GPU 2

Si on ouvre la page chrome://gpu, on peut y lire Video Decode: Software only. Hardware acceleration disabled.

On peut aussi forcer les codecs utilisés en utilisant une extension comme h264ify. Des codecs plus similaires sont alors utilisés sur Chromium et dans Electron, facilitant les comparaisons. Bien que, théoriquement, ce soient les mêmes codecs, les performances sont très différentes.

On comprend donc que sur Electron, le décodage n'est pas fait avec V4L2VideoDeocde, comme sur Chromium de Raspberry Pi OS. Il est plutôt fait par un autre décodeur qui est très gourmand en CPU et qui n'est pas Hardware accelerated.

Pourquoi les performances sont si différentes

Après avoir fait plusieurs tests et recherches, aucun chromium flag ajouté dans Electron n'est en mesure d'activer le Hardware Accelereted Video Decoding ou d'améliorer les performances de la lecture de vidéo. J'ai fait des tentatives avec les flags mentionnés dans ces articles :

On peut comprendre pourquoi ce n'est pas une question de flags en lisant le code source de RPi OS : le navigateur web Chromium qui est livré avec le RPi OS a été altéré afin de s'adapter aux particularités du Raspberry Pi à l'aide de patches appliquées au build de Chromium.

Github patches example

Quelles sont les solutions possibles ?

Dans un mode idéal, Electron (ou un third-party) mettrait à notre disposition une version compilée et adaptée au Raspberry Pi, qui incluerait les patches si l'application est lancée un RPi. Par contre, cela ne semble pas du tout dans les plans.

Pour arriver à une version Electron aux performances similaires à celles obtenues dans Chromium, il faudrait donc compiler notre propre Electron, qui inclurait les patches Chromium de RPi OS. Or, cela n'est pas si simple, puisque compiler une telle application est long (plusieurs heures), nécessite plusieurs dépendances et un ordinateur puissant.

II serait intéressant de faire les comparaisons de performances sur un Raspberry 5. Bien que le Hardware Acceleration ne sera pas activé là non plus dans Electron, peut-être que ses performances supplémentaires en CPU nous permettraient d'arriver à un résultat acceptable.

Finalement, la solution la plus simple pour avoir des performances de lecture vidéo optimales sur Pi est peut-être d'éviter Electron quand c'est possible et d'utiliser le Chromium de RPi OS en mode kiosk.

Ressources liées