Escritorio de Pantalla Múltiple Usando VNC - Parte 2 Una Versión Mejorada y Simplificada

Me parece que todos vamos a estar atrapados en casa más tiempo de lo que pensábamos. Algunos de nosotros también hemos tenido que trabajar durante este tiempo. Trabajar en una pantalla de ordenador portátil pequeña no es una tarea divertida, y usar cables HDMI mientras los niños corren tampoco es divertido. Entonces, ¿qué tal si usamos un ODROID como pantalla secundaria? Esto es algo así como una continuación de mi anterior artículo "Escritorio multipantalla con VNC" presentado en un número anterior de ODROID Magazine: https://bit.ly/3bw1oEb.

Entonces, la buena noticia es que no necesitas nada de lo que se describe en ese artículo. He echado un vistazo a la página del manual de x11vnc y encontré algunas opciones que simplifican enormemente las cosas y reducen la cantidad de hacks necesarios.

Crear un escritorio extendido

El objetivo es tener una configuración de doble pantalla: una pantalla sería la pantalla de tu ordenador portátil, la segunda pantalla sería un ODROID en red. El ordenador portátil (en mi caso) ejecuta Linux (obviamente), por lo que estamos buscando una solución de Linux. Lo ideal una que funcione a través de wifi.

Lo primero que debemos hacer es extender el escritorio físico. En el artículo anterior usé xrandr para extender el tamaño físico del escritorio. Sin embargo, tiene algunos problemas, especialmente con aplicaciones que no saben dónde termina la pantalla física, lo que hace que maximizar las ventanas se convierta en un auténtico quebradero de cabeza. Esta vez ampliaremos el escritorio agregando una nueva pantalla virtual.

Para un ordenador portátil con una GPU Intel, podemos hacer esto agregando /usr/share/X11/xorg.conf.d/20-intel.conf con el contenido que se describe en https://bit.ly/2xQSQZW:

Section "Device"
  Identifier "intelgpu0"
  Driver "intel"
  Option "VirtualHeads" "2"
EndSection
Si tienes una GPU NVidia, puede probar esto en su lugar: https://bit.ly/3awV5yW.

Si reinicias tu servidor Xorg, verá dos nuevas pantallas virtuales en tu salida:

$ xrandr | grep VIRTUAL
VIRTUAL1 disconnected (normal left inverted right x axis y axis)
VIRTUAL2 disconnected (normal left inverted right x axis y axis)
Ahora que tenemos una nueva pantalla disponible, necesitaremos configurar una resolución específica y activarla. En mis pruebas, utilicé una resolución de 720p porque es lo suficientemente pequeña como para transmitirla sin problemas y lo suficientemente grande como para ser legible desde la distancia en un televisor de pantalla grande.

Deberás calcular los tiempos correctos para la resolución deseada y agregar un nuevo modo a la pantalla virtual. Afortunadamente, hay una herramienta que lo hace en función de una resolución de entrada y una frecuencia de actualización y forma parte del paquete

$ gtf 1280 720 60
Puedes usar la salida del comando para obtener la información necesaria y habilitar la pantalla:
$ xrandr --newmode "1280x720_60.00" 74.48  1280 1336 1472 1664  720 721 724 746  -HSync +Vsync
$ xrandr --addmode VIRTUAL1 "1280x720_60.00"
$ xrandr --output VIRTUAL1 --right-of LVDS1
Ahora debería aparecer una ventana emergente, como en la Figura 1, que muestra la nueva pantalla y te pregunta qué quiere hacer con ella.

Figura 1. Crear una pantalla virtual

Lamentablemente, no puedes habilitar las pantallas virtuales de la misma manera en ODROID-XU4, por lo que esta técnica requiere que tu PC maestro esté basado en Intel. Pero espera, si solo tiene un ODROID (con suerte un ODROID-XU4, donde xrandr se ejecuta muy bien) como ordenador maestro, no todo está perdido. Todavía puede expandir el escritorio, tal y como se describe en el anterior artículo utilizando el script: https://bit.ly/34VZiuV:

$ DISPLAY=:0 xrandr --output HDMI-1 --fb 2560x720 --panning 1280x720
El parámetro fb especifica la resolución total, mientras que el parámetro de panorámica especifica una resolución de pantalla. Esto creará espacio para su segunda pantalla (a la izquierda de la pantalla principal), pero se comportará como un monitor (por lo que al maximizar no funcionará correctamente sin fakexinerama, que también tiene sus problemas).

Así que ahora tenemos una nueva superficie de escritorio a la derecha de la pantalla principal y necesitamos proyectarla en una pantalla física diferente. Tenemos dos formas de hacerlo.

El modo Chromecast

Pero espera: ¡no tengo un Chromecast! Acabo de hacerme con un ODROID-N2 con Android TV ... Bueno, ¡estás de suerte! Tiene un Chromecast, pero necesitas instalar una aplicación de Play Store llamada Cast Receiver (https://play.google.com/store/apps/details?id=com.softmedia.receiver.castapp&hl=en) que actúa como un Chromecast y puede recibir transmisiones de aplicaciones compatibles con Chromecas (https://forum.odroid.com/viewtopic.php?f=178&t=37501). Ten en cuenta que la aplicación es una demo, pero para algunas cosas (como la transmisión de Youtube) no impone límites de tiempo

Entonces, lo lógico es usar la función de la pestaña Cast de Chromium para transmitir la segunda pantalla al dispositivo Chromecast. Veamos esto en acción. Abre Chromium, selecciona el menú de tres puntos, seleccione Cast ... y si estás en la misma LAN con tu Chromecast, debería verlo en la lista (Figura 2).

Figura 2. Lista de dispositivos Chromecast en la LAN

Si haces clic en el botón Sources… puede seleccionar entre la pestaña Cast y el escritorio Cast. Si selecciona Cast desktop, debería aparecer una selección de aplicaciones o las pantallas que desea transmitir. Si solo quieres lanzar una aplicación, está bien, pero nosotros queremos transmitir la pantalla virtual. Desafortunadamente, parece haber un error de Chrome que nos impide hacerlo: dirígete al escritorio combinado como una pantalla, no como dos pantallas independientes.

Figura 3. Selección de pantalla

Figura 4. Transmisión de pantalla extendida a través de Chrome: difícilmente útil

Por lo tanto, actualmente el envío desde Chrome no es posible, aunque podría cambiar en el futuro. La calidad era buena, el rendimiento estaba bien y solo había un retraso de medio segundo entre la entrada del ratón y la retroalimentación visual. No es adecuado para juegos, pero está bien para la mayoría de las tareas de oficina.

De modo que, el plan B es el que usa mkchromecast para emitir un área de la pantalla. Puedes instalarlo con

$ sudo apt-get install mkchromecast
Puedes ejecutarlo con el parámetro --discover para obtener los nombres de los Chromecasts en tu red (consulta la figura 5).

Figura 5. Descubriendo Chromecasts en su LAN

Conociendo el nombre, puede escribir un comando más complicado para usar ffmpeg y usar X11 con un tamaño específico y desde un offset específico y transmitir el video a tu Chromecast:

$ mkchromecast -n "ODROID-N2-159" --video --command 'ffmpeg -f \
x11grab -r 15 -s 1280x720 -i :0.0+1600,0 -vcodec libx264 \
  -preset ultrafast -tune zerolatency -maxrate 10000k \
  -bufsize 10000k -pix_fmt yuv420p -g 60 -f mp4 \
  -max_muxing_queue_size 9999 -movflags \
  frag_keyframe+empty_moov pipe:1'
La mayoría de los parámetros anteriores deben permanecer fijos para obtener la mejor velocidad de transmisión. El parámetro -n te permite seleccionar el chromecast de salida deseado, -r especifica la velocidad de fotogramas, -s representa el tamaño de la pantalla virtual, mientras que: 0.0 + 1600,0 representa el desplazamiento desde donde desea capturar. Este desplazamiento se lee como sigue: lee desde Xserver: 0.0, con un desplazamiento de +1600 píxeles en el eje xy un desplazamiento 0 en el eje y. El valor x debe ser el ancho de la pantalla de tu ordenador portátil en píxeles, para que ffmpeg pueda omitir tu pantalla física. El valor y es 0 porque X11 lee el eje y comenzando desde arriba, hacia abajo.

Figura 6. Ampliación del escritorio con Chromecast

Ahora, el resultado se ve mejor. Excepto que el rendimiento no está cerca de lo que Chrome puede hacer. A pesar del ajuste del parámetro ffmpeg, debido a los búferes de red, los búferes de compresión, etc., hay un retraso de 5-6 segundos entre su acción y la respuesta de la pantalla. Por lo tanto, esto solo es adecuado como una segunda pantalla para leer documentación, el correo electrónico y las cosas que no requieren interacción (por ejemplo, ver registros).

El método VNC

Podemos hacerlo mejor. ¿Qué tal si proyectamos la pantalla a través de VNC? Esto es lo que intenté en mi artículo anterior, pero de una manera enrevesada que no funcionó tan bien porque tuve que capturar/transportar y renderizar la mitad del escritorio fuera de la pantalla. Si hubiera pasado más tiempo leyendo el manual de x11vnc (http://www.karlrunge.com/x11vnc/x11vnc_opts.html), ¡habría descubierto la opción -clip que hace exactamente eso! La idea es iniciar un servidor VNC que esté recortado al tamaño de la pantalla virtual y, en el lado del televisor, usar un programa de visualización VNC para mostrar el contenido del servidor. La gran ventaja es que puede "transmitir" a cualquier sistema habilitado para VNC, por lo que no necesita ejecutar Android en su Odroid, y también, si su televisor inteligente tiene una aplicación de cliente VNC, puede usarse directamente.

Creé un pequeño script shell que crea la pantalla virtual y también inicia x11vnc en segundo plano sin autentificación. Configurarlo para que se ajuste a tus necesidades:

$ cat new_720p_screen.sh
#!/bin/bash

# calculate the desired modeline with gtf:
# gtf 1280 720 60
#
#  # 1280x720 @ 60.00 Hz (GTF) hsync: 44.76 kHz; pclk: 74.48 MHz
#  Modeline "1280x720_60.00"  74.48  1280 1336 1472 1664  720 721 724 746  -HSync +Vsync

/usr/bin/xrandr -d :0 --newmode "1280x720_60.00" 74.48  1280 1336 1472 1664  720 721 724 746  -HSync +Vsync

/usr/bin/xrandr -d :0 --addmode VIRTUAL1 "1280x720_60.00"
/usr/bin/xrandr -d :0 --output VIRTUAL1 --right-of LVDS1

#start x11vnc
x11vnc -forever -bg -geometry 1280x720 -shared -noprimary -auth /var/run/lightdm/root/:0 -display :0 -clip 1280x720+1600+0 -threads -noxdamage
Los parámetros interesantes de x11vnc que necesitarás son: -geometry establece la resolución de la sesión de VNC de destino y debe coincidir con el tamaño de tu pantalla virtual -clip define una resolución de destino (1280x720) y un desplazamiento desde la pantalla actual (1600 píxeles desde el borde del servidor X11, en el eje x, 0 píxeles desde el eje y). El desplazamiento debe coincidir con el tamaño de la pantalla principal si se extiende hacia la derecha, y debe ser negativo y coincidir con el tamaño de la pantalla virtual si se extiende hacia la izquierda de la pantalla principal

-threads y -noxdamage mejoran la capacidad de respuesta del video

Una vez que ejecute esos comandos, puede usar cualquier cliente VNC para conectarse a la dirección IP de su PC en el puerto 5900 y ver solo la pantalla virtual. Si estás en Android TV, puede usar TruVNC (https://play.google.com/store/apps/details?id=com.mm.truvnc.lite&hl=en) que funcionó realmente bien en mi caso, cualquier soporte de cliente VNC debería funcionar perfectamente.

En términos de rendimiento, ¡es genial! Recibo menos de 1s de retraso en wifi y una respuesta mucho más rápida al usar una conexión por cable, ¡así que estoy muy contento con ello! Ejecuté glmark2 en la pantalla virtual y se renderizó sin problemas sobre VNC, con el efecto de desgarro ocasional debido a la opción de noxdamage (de lo contrario, se bloquea). La reproducción de video también es suave, excepto por algunos parpadeos. El uso de la CPU tampoco es tan alto. De modo que, pruébalo, tu gustará tu nuevo escritorio expandido.

Figura 7. Expansión a través de VNC

Para mí, lo usaré así durante la cuarentena, y cuando vuelva a trabajar, configuraré un ODROID-XU4 con un viejo monitor 1280x1024 como mi tercer monitor, ¡así seré la envidia de la oficina! Para comentarios, preguntas y sugerencias, visite la publicación original en https://forum.odroid.com/viewtopic.php?f=53&t=38409.

Be the first to comment

Leave a Reply