Reducción de la latencia del flujo de video de AVFoundation a través de usbmuxd (usando PeerTalk)

Estoy trabajando en un proyecto que refleja su pantalla desde su dispositivo macOS a su dispositivo iOS a través de USB, usando PeerTalk . Tengo una versión en ejecución, y puede encontrar el código fuente aquí si está interesado.

Funciona bien, pero hay una latencia de alrededor de 87 ms desde que se captura el cuadro en la Mac hasta que se muestra en el iPhone, y el usuario lo nota bastante. Teniendo en cuenta que hay una conexión por cable, no debería haber una latencia tan alta. Duet Display es una aplicación que hace algo muy similar y no tienen tanta latencia.

Estoy usando AVFoundation para capturar la pantalla de la Mac, haciendo una serie de conversiones para serializar y comprimir los datos, enviarlos a través de PeerTalk y luego deserializar cada cuadro en un UIImageiPhone.

Estos son los pasos que tomo (total ~ 87ms):

  • Convertir fotograma singular de CMSampleBufferRefa NSData(~0 ms)
  • Comprima datos usando este algoritmo de compresión gzip (~17ms)
  • Enviar datos a través de PeerTalk (~54 ms)
  • Descomprimir datos usando este algoritmo de descompresión gzip (~5ms)
  • Convertir NSDataa CMSampleBuffer(~0 ms)
  • Convertir CMSampleBufferpara UIImageusar este algoritmo (~ 11 ms)
  • Configurar UIImagepara mostrar en pantalla

También probé sin compresión; enviar los datos sin procesar a través de PeerTalk toma ~98ms solo, por lo que ya es peor que lo anterior.

No estoy seguro de cómo disminuir la latencia. Algunas preguntas que estoy considerando:

  • No estoy familiarizado con AVFoundation, por lo que tal vez usar un UIImagepara mostrar cada cuadro sea una mala idea, pero no conozco las alternativas.
  • ¿Hay un mejor algoritmo de compresión que pueda usar sin perder demasiada calidad?

Todas y cada una de las sugerencias son bienvenidas, incluso si eso significa rehacer completamente la canalización que tengo actualmente. Una vez más, siéntase libre de echar un vistazo al código aquí si le ayuda.

Answer