Pourquoi une chaîne fonctionne sur Windows mais pas sur Xbox

Les deux applications partagent chaque écran et chargent deux bibliothèques natives de lecteur différentes. Presque toutes les différences que vous rencontrerez viennent de ce seul fait.

L’Application Windows et l’Application Xbox sont 2 têtes d’une seule base de code. Mêmes écrans, même logique métier, même compte, même playlist. Ce qui diffère, c’est la bibliothèque native du lecteur en dessous, et presque tous les signalements du type « ça marche ici, pas là » remontent à cela.

Le bureau charge libvlc 3.0.23. La console lie une build UWP issue de 3.0.16 avec le jeu de plugins app-container, qui est la forme qu’une application Store pour console a le droit d’embarquer. Ce n’est pas la même bibliothèque avec un numéro de version différent. Elles embarquent des modules différents.

                    Windows            Xbox
libvlc              3.0.23             3.0.16 (UWP app-container build)
AV1 hardware        yes, recent GPUs   no decoder in the build
decoder threads     automatic          capped at 3
HDR output          yes                no
audio passthrough   yes                no
usable memory       system RAM         about 1 GB

Vérifiez d’abord le codec

Pour une chaîne qui joue sur Windows et échoue sur la console, le codec vidéo est la réponse la plus probable, et il faut 30 secondes pour le vérifier dans le panneau d’informations du flux.

AV1 est le cas évident. Le FFmpeg de la build console n’a aucun décodeur matériel AV1, donc AV1 retombe en logiciel. Décoder en logiciel un flux AV1 haute résolution sur le matériel de la console ne suit pas, et le résultat, ce sont des saccades ou rien du tout. Sur un GPU Windows récent, la même chaîne se décode en matériel sans effort.

HEVC et H.264 fonctionnent bien sur les deux. Si votre chaîne défaillante utilise l’un de ces codecs, le codec n’est pas votre réponse. Passez à la suite.

Il y a un effet de second ordre. La console plafonne les threads de décodage d’images à 3, pour une raison mesurée : laissé choisir seul, le décodeur en a pris 6, ce qui a produit un pool de sortie de 40 surfaces en 4K, environ 500 Mo de commit visible par le GPU contre à peu près 1 Go utilisable sur la console. Le décodage matériel n’utilise pas ces threads, donc le plafond ne coûte rien sur les chemins qui fonctionnent. Il ne mord que sur le repli logiciel, qui est exactement là où AV1 atterrit.

Pourquoi la console n’essaie pas quand même

Parce qu’elle ne peut pas échouer en douceur. Passer au lecteur une option appartenant à un module que sa build n’embarque pas ne dégrade rien et n’est pas ignoré ; cela fait échouer l’instance entière. Nous l’avons déjà vécu une fois, avec un commutateur de tampon de préchargement, et c’est pour cela que les commutateurs sont désormais choisis par tête, en un seul endroit, à partir d’une liste d’autorisation, la console ne recevant que le sous-ensemble que sa build peut honorer.

C’est pourquoi la Sortie HDR et le passthrough audio sont masqués sur la console plutôt qu’affichés et désactivés. Il n’en existe pas de version partielle. 4K et HDR sur Xbox est la liste complète de ce que la console émet et n’émet pas.

La mémoire, qui est l’autre moitié

La console dispose d’environ 1 Go utilisable pour une application comme celle-ci. Nous avons profilé une session de navigation de 12 minutes sur le bureau et elle a culminé à 1 080 Mo.

Ce n’est pas une marge mince. C’est une absence de marge. Les mots mêmes du rapport : sur une Xbox, le pic à lui seul est une terminaison. C’est un problème ouvert plutôt qu’une caractéristique, et c’est pourquoi une console peut se comporter différemment après 20 minutes de navigation qu’au premier écran.

Ce qui m’a surpris, c’est l’endroit où se trouvait la mémoire. Je m’attendais à un problème de tas managé, du genre qu’un ramasse-miettes finit par régler. Sur trois cycles de navigation identiques, mesurés après une collection gen-2 forcée à chaque fois, le tas managé retenu est resté à 61.1, 62.6 et 62.5 Mo, à plat, tandis que le working set grimpait de 827 à 918 Mo. La croissance est native, ce qui est le mauvais endroit où regarder pour un profileur de tas managé, et le thread UI ne s’est jamais bloqué plus de 392 millisecondes pendant tout ce temps, donc rien ne paraissait lent pendant que cela se produisait.

Le chiffre associé : un démarrage à froid de la console a été mesuré à 39.5 secondes et 1.4 Go, contre environ 4.6 secondes pour un lancement à chaud sur le bureau. Si votre console est lente à son premier lancement de la journée et va bien ensuite, c’est cette forme-là que vous voyez.

Quand ce n’est pas le codec

Procédez dans cet ordre.

Essayez la même chaîne sur la console juste après avoir redémarré l’application. Si elle joue à ce moment-là et pas après une session de navigation, vous regardez une pression mémoire plutôt que la chaîne.

Essayez une autre chaîne de la même source. Si tout ce qui vient de cette source échoue sur la console et fonctionne sur Windows, soupçonnez la limite de connexions plutôt que la console : 2 appareils contre une ligne à 2 connexions, cela veut dire que le second est refusé, et l’appareil qui perd dépend de celui qui a demandé en second. Connexions maximales traite le sujet.

Vérifiez si la console est en Wi-Fi et le PC en câble. Banal, et souvent toute la réponse.

Une catégorie qui n’est pas un défaut

Avant de signaler quoi que ce soit : plusieurs destinations de la console sont des écrans de substitution par conception. Sources, Profils, Appareils, Paramètres, Abonnement, le Guide autonome et les Rappels affichent tous un écran de substitution, et chacun d’eux est une surface de gestion plutôt que de lecture.

Donc un écran que vous pouvez atteindre sur Windows et pas sur la console, c’est généralement la séparation qui fonctionne comme prévu. Installer sur Xbox explique où cette ligne est tracée et pourquoi.

Pour la classification générale des défauts de lecture, corriger la mise en mémoire tampon et les saccades est le point de départ.

Ce que cet article a mesuré21 affirmations, chacune avec les preuves derrière elles
RéclamationPreuveCompté
Les deux têtes compilent les mêmes pages XAML partagées et la même logique métier, et chargent des bibliothèques natives de lecteur différentes : 3.0.23 sur le bureau, une build UWP issue de 3.0.16 sur la console.n = 123 août 2026
Le FFmpeg de la build console n’embarque aucun décodeur matériel AV1, donc AV1 y retombe en décodage logiciel.n = 123 août 2026
La console plafonne les threads de décodage d’images à 3. Laissé choisir, le décodeur en a pris 6 et a produit un pool de sortie de 40 surfaces en 4K, environ 500 Mo de commit visible par le GPU contre à peu près 1 Go utilisable sur la console.n = 131 août 2026
Passer au lecteur une option appartenant à un module que sa build n’embarque pas fait échouer l’instance entière au lieu d’être ignoré, ce qui explique que la liste des commutateurs soit décidée par tête en un seul endroit.n = 123 août 2026
Une session de navigation de 12 minutes sur le bureau a culminé à 1 080 Mo de working set. Sur une console, où environ 1 Go est utilisable, ce pic à lui seul est une terminaison.n = 330 août 2026
Un démarrage à froid de la console a été mesuré à 39.5 secondes et 1.4 Go, contre un lancement à chaud du bureau d’environ 4.6 secondes.n = 126 août 2026
Les deux têtes sont nommées comme des paquets natifs différents, pas comme une bibliothèque à deux versions : le bureau lie VideoLAN.LibVLC.Windows 3.0.23.x avec le jeu complet de plugins, la console lie VideoLAN.LibVLC.UWP 3.3.2 construit à partir de libvlc 3.0.16 avec le jeu de plugins app-container.n = 21 sept. 2026
Le mode de défaillance qui consiste à passer à la console une option qu’elle ne peut pas prendre en charge n’est pas théorique : le même piège a déjà été rencontré une fois avec un commutateur de tampon de préchargement, ce qui explique que le constructeur d’options conditionne chaque commutateur à la tête qui possède le module.n = 11 sept. 2026
La prise en charge du commutateur HDR par la bibliothèque chargée est lue à l’exécution plutôt que déduite de la tête, si bien qu’un paquet natif rétrogradé se dégrade en absence de HDR au lieu d’empêcher complètement le démarrage du lecteur.n = 11 sept. 2026
Le constructeur d’options reçoit la précision à laquelle la surface vidéo s’est réellement créée, pas celle que l’utilisateur a demandée, si bien qu’une demande 10 bits échouée ne peut pas produire un commutateur incohérent.n = 11 sept. 2026
Trois rôles de lecteur existent et ils ne sont pas égaux : une instance principale que le spectateur regarde, une instance de secours pour la bascule, et des tuiles multivue dont plusieurs tournent à la fois, chacune avec son propre lecteur.n = 31 sept. 2026
La mise en page console réserve une marge de sécurité télévision de 5 pour cent sur chaque bord, 96 par 54 pixels effectifs en 1080p, et la marque et la puce de profil vivent à l’intérieur plutôt que dans le chrome de fenêtre.n = 11 sept. 2026
La console embarque un dictionnaire de ressources de surcharge qui agrandit la typographie de 25 pour cent pour la lecture à 10 pieds, faisant passer le corps de texte de 14 à 18 et l’affichage de 32 à 40, avec un espacement au-dessus d’un seuil agrandi de 30 pour cent pour laisser de la place au moteur de focus.n = 81 sept. 2026
Chaque écran console se termine par une barre d’indications obligatoire de 72 pixels effectifs, et le jeu d’indications vient du modèle de vue de la page, si bien qu’il est localisé de façon centrale plutôt que par écran.n = 11 sept. 2026
L’image dans l’image n’est pas simplement absente sur la console, elle est compilée comme un stub dont l’état actif est définitivement faux et dont la bascule ne fait rien.n = 11 sept. 2026
Les deux têtes ne sont pas deux applications : les pages vivent dans une seule arborescence source partagée et sont compilées dans chaque tête via un fichier de propriétés partagé, si bien qu’une différence d’écran est une condition de tête plutôt qu’un fork.n = 11 sept. 2026
La mémoire que la console ne peut pas se permettre est native plutôt que managée : sur trois cycles de navigation identiques, le tas managé retenu est resté à 61.1, 62.6 et 62.5 Mo tandis que le working set grimpait de 827 à 918 Mo.n = 330 août 2026
La même session de profilage a établi que la réactivité n’était pas le problème : le thread UI ne s’est jamais bloqué plus de 392 millisecondes et n’a jamais cessé de pomper les messages.n = 130 août 2026
Le plafond de threads de la console ne s’applique qu’aux instances hors multivue, si bien que les tuiles de mosaïque n’en sont pas affectées.n = 11 sept. 2026
La décision sur les commutateurs que chaque tête reçoit est délibérément conservée en un seul endroit pur et couvert par des tests unitaires, sans dépendance à l’UI ni à la plateforme, si bien qu’on peut la faire varier un axe à la fois dans les tests.n = 11 sept. 2026
Plusieurs destinations de la console sont des écrans de substitution, et toutes sont des surfaces de gestion plutôt que de lecture, si bien qu’un écran manquant sur la console est généralement délibéré plutôt qu’un défaut.n = 731 août 2026