Guillaume Cheseaux

← Tous les articles

Pourquoi ma vidéo de 12 heures mettait une éternité à démarrer

Ma médiathèque se trouve sur un Mac mini à la maison, et Plex la lit sur l’Apple TV du salon. Elle contient une vidéo d’ambiance de près de 12 heures, du genre qu’on laisse tourner en arrière-plan. Chaque fois que je lançais la lecture ou que je la reprenais, l’app Plex de l’Apple TV mettait une éternité à la charger.

Un soir, j’ai ouvert un terminal et demandé à Claude Code d’examiner le serveur Plex. Cet article raconte deux hypothèses fausses, dont l’une était la mienne, et comment des mesures ont trouvé la vraie cause.

Deux hypothèses fausses

Je pensais que le serveur Plex ne faisait pas vraiment de streaming, et qu’il obligeait l’Apple TV à télécharger tout le fichier de 31,7 Go avant de le lire. C’était faux. En réalité, l’Apple TV demande la vidéo au serveur morceau par morceau, au fil de la lecture. Le serveur envoie chaque morceau tel quel, sans le convertir, ce que Plex appelle Direct Play.

La première explication de l’assistant était à moitié juste. Il avait trouvé deux choses: le fichier avait un index anormalement gros, sur lequel je reviens plus bas, et l’Apple TV recevait les données lentement, à environ 2,6 Mo/s. Il a aussi suggéré de brancher l’Apple TV avec un câble, au cas où elle serait en Wi-Fi. Quand j’ai répondu en une ligne qu’elle l’était déjà, l’assistant s’est remis à chercher.

Mesurer plutôt que deviner

Au lieu d’avancer une nouvelle théorie, l’assistant a testé chaque maillon de la chaîne, un par un:

  • Le disque qui contient la vidéo la fournissait à 77 Mo/s.
  • Le serveur Plex envoyait le même fichier à mon ordinateur portable à 47 Mo/s.
  • L’Apple TV ne recevait qu’environ 2,6 Mo/s par son câble, alors que le serveur aurait pu lui envoyer les données bien plus vite.
  • La vidéo elle-même n’a besoin que d’environ 0,7 Mo/s pour être lue.

Le disque et le serveur allaient donc bien: la lenteur venait de l’Apple TV. Et comme la lecture ne demande que 0,7 Mo/s, bien moins que les 2,6 Mo/s que recevait l’Apple TV, la vidéo passait sans à-coups une fois lancée. La question devenait de savoir ce que l’Apple TV devait télécharger avant de pouvoir afficher la première image.

Une table des matières de 2,6 millions de lignes

Un fichier MP4 contient un index, une sorte de table des matières qui indique au lecteur vidéo où se trouve chaque image dans le fichier, quelle est sa taille et quand l’afficher. Un lecteur vidéo lit toute la table avant d’afficher quoi que ce soit.

Ma vidéo tourne à 60 images par seconde pendant près de 12 heures. Cela fait 2’573’708 images, chacune avec sa propre ligne dans la table. En MP4, son index pesait à lui seul 85 Mo. A 2,6 Mo/s, cela représente plus de 30 secondes de téléchargement avant la première image.

L’Apple TV ouvrait aussi une nouvelle connexion au serveur quand je reprenais la lecture après une pause, ce qui laisse penser qu’elle relisait tout l’index à chaque fois. C’est une déduction, pas une mesure, mais elle correspond aux reprises lentes.

Le conseil habituel pour un MP4 lent à démarrer en ligne est de placer son index au début du fichier, une option souvent appelée « fast start ». Cela n’aurait servi à rien: dans mon fichier, l’index était déjà au début. Le problème n’était pas l’emplacement de l’index, mais sa taille.

Même vidéo, autre conteneur

L’assistant a proposé plusieurs solutions. La première était de découper la vidéo en parties d’une heure, chacune avec un index plus petit. J’ai refusé. Une autre était de laisser le serveur Plex convertir la vidéo pendant la lecture, avec une qualité moindre. La dernière était de garder la vidéo telle quelle, et de changer seulement le format de fichier qui l’entoure.

Le MP4 n’est qu’un conteneur, une sorte d’enveloppe pour la vidéo et le son. Le MKV, aussi appelé Matroska, en est un autre, et il peut contenir la même vidéo et le même son sans les modifier. Son index ne liste pas chaque image, seulement les points à partir desquels un lecteur vidéo peut commencer la lecture. Dans ma vidéo, il y en a 7’743, environ un toutes les cinq ou six secondes.

J’ai choisi cette dernière solution: copier la vidéo et le son dans un MKV tels quels, sans les convertir, pour que l’image reste exactement la même.

J’ai demandé que la copie se fasse sur le Mac mini avec ffmpeg, un outil vidéo gratuit en ligne de commande. Elle a pris 19 minutes pour le fichier de 31,7 Go. Le résultat, MP4 contre MKV:

  • Index
    85 Mo contre 180 Ko, environ 475 fois plus petit.
  • Entrées dans l’index
    2’573’708 images contre 7’743 points de repère.
  • Taille du fichier
    31,7 Go contre 31,6 Go.
  • Démarrage sur l’Apple TV
    Une éternité contre presque instantané.

Je n’ai pas chronométré le nouveau démarrage, mais la différence se passait de chronomètre. Ma réaction sur le moment, tapée à la hâte, a été « c’est hyper rapiiiiiiiiide ».

Pour vérifier que ce n’était pas propre à mon fichier, j’ai créé avec ffmpeg une vidéo de test de 12 heures à 60 images par seconde. En MP4, son index pesait 68 Mo, et aller directement au milieu obligeait à le lire en entier. En MKV, l’index pesait 232 Ko, et le même déplacement lisait moins de 300 Ko.

Je n’ai jamais su pourquoi l’Apple TV recevait les données aussi lentement. Avec le MKV, cela n’avait plus d’importance.

Seules les très longues vidéos valent la peine d’être converties. Deux choses à savoir avant de convertir vos propres fichiers:

  • Plex a traité le MKV comme une nouvelle vidéo, et non comme une nouvelle version de l’ancienne. Quand j’ai supprimé le MP4, Plex a oublié où je m’étais arrêté dans la vidéo.
  • QuickTime Player n’ouvre pas les fichiers MKV. Pour une vidéo que vous regardez aussi sur un Mac, ou que vous partagez, gardez le MP4.

Ce que j’en retiens

  • Une première hypothèse n’est qu’une hypothèse, la mienne comme celle de l’assistant. Aucune des deux n’a trouvé la cause, ce sont les mesures qui l’ont trouvée.
  • Corriger l’assistant tôt. En précisant simplement que l’Apple TV était déjà branchée par câble, j’ai tout de suite aiguillé l’assistant vers la recherche de nouvelles hypothèses.
  • Garder la main sur les décisions. L’assistant proposait, et je choisissais.