Comment Peering diffuse l'écran de votre Mac sur votre iPhone
Un bureau à distance est un flux vidéo avec une exigence inhabituelle : celui qui regarde est aussi celui qui pilote. Chaque choix de conception ci-dessous découle de la volonté de garder cette boucle courte.
Capture : demander l'image au système
L'app Mac utilise ScreenCaptureKit d'Apple pour obtenir les images. La source peut être un écran entier, toutes les fenêtres d'une app, ou une seule fenêtre, et vous pouvez passer de l'une à l'autre sans couper la connexion. C'est aussi pourquoi macOS demande l'autorisation Enregistrement d'écran la première fois : sans elle, le Mac ne peut fournir qu'une image noire.
Encodage : faible latence, sans réordonnancement
Les images vont à l'encodeur VideoToolbox d'Apple sur le Mac, en H.264 ou en HEVC, selon ce que l'iPhone indique pouvoir décoder. Les réglages sont l'opposé de ceux d'un service de streaming :
- Pas d'images B. Une image B a besoin d'une image du futur, donc les utiliser oblige à retenir des images. Sans elles, l'ordre de décodage est l'ordre d'affichage et rien n'attend.
- Un contrôle de débit à faible latence. L'encodeur dépense ses bits au fur et à mesure, sans regarder en avance.
- Une image clé au moins toutes les deux secondes, et immédiatement quand un nouveau spectateur arrive, reprend ou change de source, pour qu'une image perdue se répare vite.
- Un débit proportionnel à l'écran. Par défaut, c'est le nombre de pixels multiplié par la fréquence d'images multipliée par 0,12, borné entre 4 et 30 Mbit/s, à 60 images par seconde par défaut.
Les informations de configuration du décodeur (les jeux de paramètres) sont envoyées une seule fois, dans un message à part, et ne sont pas répétées dans chaque image. Un iPhone qui rejoint le flux en cours de route reçoit ce message, puis une image clé.
Envoi : des images sacrifiables, des images clés protégées
Chaque image voyage avec un petit en-tête de 25 octets : s'il s'agit d'une image clé, sa taille en pixels et un horodatage de présentation. Sur une connexion relayée ou directe, elle est découpée en datagrammes d'environ 1 080 octets, chacun scellé avec ChaCha20-Poly1305 à l'aide d'une clé que seuls les deux appareils connaissent. Un compteur dans chaque datagramme alimente une fenêtre anti-rejeu de 64 entrées, de sorte qu'un paquet capturé ne puisse pas être rejoué plus tard.
La règle en cas de congestion est tranchée : la vidéo est sacrifiable, les images clés ne le sont pas. Si une nouvelle image est prête alors qu'une ancienne attend encore de partir, l'ancienne est remplacée, sauf qu'une image clé non livrée n'est jamais remplacée par une image ordinaire. Montrer l'écran tel qu'il est maintenant compte plus que montrer chaque image qui ait jamais existé.
Sur un réseau domestique, l'image voyage plutôt sur sa propre connexion TCP, où le réseau
est assez fiable pour que cette règle ait rarement à s'appliquer. Chaque socket active TCP_NODELAY.
Le comportement par défaut, qui regroupe les petites écritures, ajoute des dizaines de millisecondes à chaque saut, ce qui est
invisible dans un téléchargement et très visible quand on déplace un curseur.
Récupération : payer la perte en image, pas en latence
L'UDP ne retransmet pas : un datagramme perdu signifie une image abîmée. L'iPhone ne l'attend pas. Il continue de décoder, et les dégâts disparaissent à l'image clé suivante, au plus deux secondes plus tard. Si vous remarquez une traînée après un mauvais passage de Wi-Fi, c'est ce que vous voyez. Mettre l'image en pause puis la reprendre force immédiatement une image clé.
Si le chemin rapide cesse complètement de livrer, le flux se replie sur la connexion de contrôle à un débit plus bas, comme le décrit l'article sur la connexion, et revient quand le chemin rapide se rétablit.
Affichage : s'adapter à l'iPhone, pas au Mac
L'iPhone choisit un niveau de qualité et peut demander moins d'images par seconde, que le Mac ramène dans une plage raisonnable. L'app peut ajuster tout le bureau à l'écran ou le remplir, et même demander au Mac un écran virtuel à la forme de l'iPhone, pour qu'un moniteur en paysage ne soit pas écrasé dans un écran en portrait. Les touchers sur l'image font le chemin inverse, ce que traite comment un toucher devient un clic.
Questions
Quel codec vidéo Peering utilise-t-il ?
H.264 ou HEVC, encodé sur le Mac avec VideoToolbox, sans images B et avec des réglages de faible latence. L'iPhone indique au Mac lequel il peut décoder.
Pourquoi l'image traîne-t-elle parfois un instant ?
Un paquet réseau perdu abîme une image, et l'image se répare à l'image clé suivante, qui arrive au moins toutes les deux secondes. Peering préfère une brève traînée à l'attente d'une retransmission.