J’ai récemment découvert que plusieurs vidéos sur mon forum Discourse auto-hébergé échouaient silencieusement lors de la lecture sur iPhone et iPad. Après investigation, la cause racine s’est avérée être que les vidéos avaient été encodées avec le codec VP9 dans un conteneur MP4 — une combinaison que Safari sur iOS ne peut pas lire.
Comment cela se produit
Facebook (et peut-être d’autres plateformes) livre parfois des vidéos encodées en VP9 lorsque les utilisateurs téléchargent leur contenu. Lorsque ces fichiers sont téléchargés sur Discourse, ils sont acceptés sans problème — l’extension .mp4 ne donne aucune indication sur le codec contenu à l’intérieur. Sur les navigateurs de bureau et Android, les vidéos se lisent correctement, donc le problème passe inaperçu. Sur Safari iOS, la vidéo affiche une vignette et un bouton de lecture, mais un appui dessus ne produit qu’un indicateur en rotation. Les utilisateurs supposent généralement qu’il s’agit d’un problème réseau et passent à autre chose sans le signaler.
Pourquoi c’est difficile à détecter
- L’extension du fichier (
.mp4) est identique à celle d’un fichier H.264 fonctionnel - Les navigateurs de bureau prennent en charge VP9, donc les administrateurs testant sur bureau ne remarquent aucun problème
- Les utilisateurs iOS ne signalent souvent pas les échecs individuels de médias, surtout lorsque d’autres contenus dans le même message sont visibles et lisibles
- Il n’y a aucun avertissement ou erreur visible pour l’administrateur
Résolution suggérée
Lors du téléchargement d’une vidéo, Discourse pourrait inspecter le codec vidéo (ffprobe est déjà disponible dans le conteneur Docker) et soit :
- Rejeter le téléchargement avec un message clair expliquant que VP9 n’est pas pris en charge sur iOS, en demandant à l’utilisateur de réencoder en H.264, ou
- Transcoder automatiquement la vidéo en H.264 lors du téléchargement (comme le font certaines plateformes pour normaliser les uploads)
L’option 1 est moins complexe et constituerait déjà une amélioration significative. L’option 2 serait idéale pour une expérience utilisateur fluide.
Environnement
- Discourse auto-hébergé dans Docker, stockage local (pas de S3)
- Version de Discourse : 2026.4.0-latest
- Proxy inverse Apache devant le nginx de Discourse
Contournement
Pour les administrateurs confrontés à ce problème, la correction implique :
- Identifier les fichiers VP9 avec
ffprobe - Réencoder en H.264 avec
ffmpeg -c:v libx264 -profile:v main -level 3.1 -r 30 -movflags +faststart - Mettre à jour les champs
sha1,url,filesizedans la tableuploads - Mettre à jour les tokens d’URL courte
upload://dans le markdown brut des messages concernés - Rebake les messages affectés
Il s’agit d’un processus manuel non trivial que la plupart des administrateurs de forum ne sont pas en mesure d’effectuer.