J’ai récemment fait quelques recherches suite à une idée qui me paraissait géniale au premier abord : streamer le flux vidéo de ma XBOX 360 sur Internet, puis bricoler un programme informatique afin qu’un ordinateur relié à la console puisse retransmettre les commandes d’un joueur distant.
Cette idée n’aboutira pas pour plusieurs raisons. D’abord, la XBOX 360 est la dernière console à proposer à la fois une sortie vidéo analogique et numérique HDMI sans DRM (HDCP a été intégré à la PS3, PS4 et XBOX1).
La seconde raison, c’est que tout le problème vient de l’extraction du flux d’une connectique HDMI (carte d’acquisition), de son encodage éventuel puis de sa mise en ligne. Cela créé une latence cumulée considérable qui rendrait l’expérience finale désastreuse dans la plupart des jeux nécessitant des réflexes, excepté peut être Halo Wars qui est un RTS.
Prenons un exemple concret :
– Je connecte la sortie HDMI de ma console sur une carte d’acquisition, puis la sortie de cette carte sur ma télé. L’instant où l’image apparaît à l’écran est la latence de référence, moins de 40ms sur une bonne télé, c’est ce que voit le joueur présent physiquement.
– La carte d’acquisition transmet à mon PC, en USB ou en PCI, le flux vidéo qu’elle encode (souvent en H264), créant une latence initiale de ~350ms.
– Le flux doit alors être traité logiciellement par un ordinateur (cvlc/ffmpeg/gstreamer/…) pour être encapsulé dans des trames réseau. Un bloggeur avait écrit une option pour l’encoder x264 afin qu’une frame soit compressée jusqu’à tenir dans un seul paquet du protocole choisi, il affirmait générer une latence de 10ms pour une résolution de 800×600. Si le lien est mort à ce jour, d’autres sites parlent de « ultra low latency » à moins de 50ms.
– Reste le transport, constaté avec un ping vers le PC d’un ami au travers d’Internet, qui donne 75ms en moyenne, soit ~40ms à l’aller.
À ce stade, une pièce du puzzle aurait été de savoir comment lire un flux vidéo en acceptant des pertes de paquets, mais en le lisant sans buffer.
Aujourd’hui le codec h264 serait dépassé par h265, VP9 et Daala mais je n’ai pas trouvé beaucoup d’infos sur ce sujet. Le codec audio Opus pourrait être joint à tous ces codecs vidéo dans les conteneurs habituels (webm/mkv/…), le site officiel parle par ailleurs d’une latence réduite à 26ms (contre plus de 200ms pour le MP3 à titre d’exemple).
Il aurait enfin fallu agir sur ce flux vidéo, en remontant les interruptions clavier ou de gamepad dans le sens inverse, soit une latence supplémentaire de ~40ms (retour), puis le traitement et la transcription sur le port USB pour imiter la sortie d’une manette en quelques millisecondes.
Le bilan théorique que j’ai établi devant vous avoisinerait 500ms dans le meilleur des cas, soit cinq fois le lag supportable pour un FPS. 🙁
Le cas de figure où un internaute doit interagir avec un flux vidéo est assez rare à ma connaissance, le seul autre cas qui m’est venu à l’esprit est le pilotage de drones avec caméra embarquée (un projet réalisé par le passé, sans tenir compte de la latence). En ayant réfléchi au sujet quelques temps, il me parait inconcevable que le Cloud Gaming voit un jour le jour avec pour support un flux vidéo, donc la possibilité de jouer sur des machines avec une puissance de calcul minimale.
Concernant la carte d’acquisition, je n’ai trouvé qu’un seul boîtier autonome capable de streamer directement à moins de 100€, qui ne fait aucune mention de sa latence. J’ai pensé à en créer une moi même à partir d’un Raspberry Pi. Et aussi incroyable que cela puisse paraître, il m’a été impossible de trouver sur le net une carte d’extension pour lui ajouter une entrée HDMI.
Je jette donc l’éponge !
Errata ! Le Cloud Gaming me paraissait inconcevable car j’ai oublié un détail important : les jeux ne tournent pas sur des consoles mais sur des serveurs ! Les services tels que Playstation Now ou Onlive se passent donc de l’acquisition vidéo, partie la plus coûteuse en temps (les 350ms de l’article) et peuvent compresser directement bien plus rapidement qu’un PC ordinaire. Ce n’est donc plus surprenant que ces services puissent tenir une latence égale ou inférieure à 100ms.
Je reste malgré tout curieux de connaitre la technique de streaming numérique qui ne nécessite pas de buffer.
J’ai pu tester Nvidia Grid après avoir acheté une Shield Tablet (et avant de la flasher avec un meilleur OS…), ça marche plutôt bien, la latence est suffisante pour jouer à la plupart des jeux tant que ce n’est pas compétitif, mais effectivement il n’y a pas non plus d’acquisition…
Les cartes NVidia basées sur l’archi Kepler permettent de streamer des flux de cette manière là (uniquement sur Windows), il y a même un client libre pour Android (Moonlight).