Cómo transmite Peering la pantalla de tu Mac a tu iPhone
Un escritorio remoto es una transmisión de vídeo con un requisito inusual: quien mira es también quien controla. Cada decisión de diseño de abajo sale de mantener corto ese bucle.
Captura: pedir la imagen al sistema
La app del Mac usa ScreenCaptureKit de Apple para obtener fotogramas. La fuente puede ser una pantalla completa, todas las ventanas de una app o una sola ventana, y puedes cambiar entre ellas sin perder la conexión. Por eso también macOS pide el permiso de Grabación de pantalla la primera vez: sin él, el Mac solo puede entregar una imagen negra.
Codificación: baja latencia, sin reordenar
Los fotogramas van al codificador VideoToolbox de Apple en el Mac, como H.264 o HEVC, el que el teléfono diga que puede decodificar. Los ajustes son lo contrario de lo que usa un servicio de streaming:
- Sin fotogramas B. Un fotograma B necesita un fotograma del futuro, así que usarlos obliga a retener imágenes. Sin ellos, el orden de decodificación es el orden de visualización y nada espera.
- Control de tasa de baja latencia. El codificador gasta sus bits sobre la marcha en lugar de mirar hacia delante.
- Un fotograma clave al menos cada dos segundos, e inmediatamente cuando se une un nuevo espectador, se reanuda o se cambia de fuente, para que una imagen perdida se recupere rápido.
- Una tasa de bits que escala con la pantalla. Por defecto es el número de píxeles por la tasa de fotogramas por 0,12, entre 4 y 30 Mbps, a 60 fotogramas por segundo por defecto.
La información de configuración del decodificador (los conjuntos de parámetros) se envía una vez, como mensaje propio, y no se repite en cada fotograma. Un teléfono que se une a mitad de la transmisión recibe ese mensaje y luego un fotograma clave.
Envío: fotogramas descartables, fotogramas clave protegidos
Cada fotograma viaja con una pequeña cabecera de 25 bytes: si es un fotograma clave, su tamaño en píxeles y una marca de tiempo de presentación. En una conexión por relay o directa se corta en datagramas de unos 1080 bytes, cada uno cifrado con ChaCha20-Poly1305 usando una clave que solo conocen los dos dispositivos. Un contador en cada datagrama alimenta una ventana de repetición de 64 entradas, así que un paquete capturado no puede reproducirse después.
La regla ante la congestión es tajante: el vídeo se puede descartar y los fotogramas clave no. Si un fotograma nuevo está listo mientras uno antiguo sigue esperando para salir, el antiguo se sustituye, salvo que un fotograma clave sin entregar nunca se sustituye por uno ordinario. Mostrar la pantalla tal como está ahora importa más que mostrar todos los fotogramas que han existido.
En una red doméstica la imagen viaja por su propia conexión TCP, donde la red
es lo bastante fiable como para que esa misma regla rara vez tenga que aplicarse. Cada socket activa TCP_NODELAY.
El comportamiento por defecto de agrupar escrituras pequeñas añade decenas de milisegundos en cada salto, algo
invisible en una descarga y muy visible cuando mueves un cursor.
Recuperación: la pérdida se paga en imagen, no en latencia
UDP no retransmite, así que un datagrama perdido significa un fotograma dañado. El teléfono no lo espera. Sigue decodificando, y el daño desaparece en el siguiente fotograma clave, como mucho dos segundos después. Si notas un borrón tras un mal momento de Wi-Fi, es eso lo que ves. Pausar y reanudar la imagen fuerza un fotograma clave de inmediato.
Si el camino rápido deja de entregar por completo, la transmisión vuelve a la conexión de control con una tasa de bits menor, como describe el artículo sobre la conexión, y regresa cuando el camino rápido se recupera.
Visualización: ajustada al teléfono, no al Mac
El teléfono elige un nivel de calidad y puede pedir menos fotogramas por segundo, que el Mac limita a un rango razonable. La app puede ajustar todo el escritorio a la pantalla o llenarla, e incluso pedir al Mac una pantalla virtual con la forma del teléfono, para que un monitor horizontal no se apriete en una pantalla vertical. Los toques sobre la imagen viajan en sentido contrario, que es el tema de cómo un toque se convierte en un clic.
Preguntas
¿Qué códec de vídeo usa Peering?
H.264 o HEVC, codificado en el Mac con VideoToolbox, sin fotogramas B y con ajustes de baja latencia. El iPhone le indica al Mac cuál puede decodificar.
¿Por qué a veces la imagen se emborrona un momento?
Un paquete de red perdido daña un fotograma, y la imagen se recupera en el siguiente fotograma clave, que llega al menos cada dos segundos. Peering prefiere un borrón breve a esperar una retransmisión.