Peering

Peering / Blog

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.

Un escritorio de Mac con un editor de código abierto, transmitido en vivo a un iPhone con Peering.
La imagen del teléfono es un vídeo codificado, no una serie de capturas de pantalla.

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:

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.