- 1fps.video es una herramienta de pantalla compartida basada en enlaces que arranca de inmediato como un binario único, pensada para colaboraciones donde hace falta revisar la pantalla más que tener reuniones, como en equipos de desarrollo, TI y especialistas en seguridad
- Parte de la idea de que, para colaborar programando, un FPS bajo suele ser suficiente, y reduce el uso de CPU, memoria y red, disminuyendo la carga en laptops antiguas
- La pantalla se comparte a 1 FPS, pero el seguimiento del cursor basado en WebSocket muestra el movimiento del puntero casi a 30 FPS, complementando las demostraciones que requieren precisión
- Ofrece cifrado de extremo a extremo; la clave generada en el cliente se incluye después del
#en la URL y no se envía al backend - Se enfoca en sesiones largas y en compartir con poco tráfico, con soporte para múltiples monitores, ajuste de calidad de imagen y tamaño de captura, y omisión del envío cuando la pantalla no cambia
Cómo funciona el uso compartido de pantalla a 1 FPS
- 1fps.video es una herramienta para iniciar rápidamente una pantalla compartida; se puede obtener el binario en Download
- Sus principales destinatarios son desarrolladores, equipos de TI, especialistas en seguridad y usuarios que prefieren colaborar sin reuniones
- El uso compartido de pantalla con bajo FPS parte de la premisa de que suele ser suficiente para la mayoría de las tareas colaborativas, especialmente para desarrolladores que pasan mucho tiempo escribiendo código
- Este enfoque se centra en reducir recursos y tráfico
- Al no requerir audio, fomenta una cultura sin reuniones
- Reduce considerablemente el uso de CPU, memoria y red
- Las laptops antiguas pueden funcionar mejor durante la pantalla compartida
- Al usar menos recursos, también es más amigable con el medio ambiente
- El entorno de uso compartido se puede ajustar según las condiciones de la red
- Admite compartir múltiples monitores
- Permite ajustar la calidad de imagen para optimizar el uso de tráfico
- En pantallas grandes, se puede ajustar el tamaño de captura para reducir aún más el tráfico
- Usa comparación inteligente de pantalla para evitar transmitir datos innecesarios cuando la pantalla no ha cambiado
Seguridad, privacidad y modelo de uso compartido
- Considera que 1 FPS es suficiente para la mayoría de las tareas de programación y desarrollo, mientras que el movimiento del cursor se ofrece casi a 30 FPS mediante seguimiento basado en WebSocket
- Es adecuado para usuarios introvertidos y trabajadores remotos que quieren compartir solo la pantalla, sin llamadas de audio ni video
- Puede usarse junto con aplicaciones de chat de equipo existentes, y sus opciones de múltiples monitores, calidad de imagen y ajuste de tamaño de pantalla permiten adaptar la experiencia de uso compartido a la situación de la red
- La estructura de privacidad y seguridad se basa en enlaces y en la gestión de claves del lado del cliente
- Todos los datos están cifrados de extremo a extremo
- La clave de cifrado se genera del lado del cliente y no se envía al servidor
- La clave se incluye después del
#en la URL, por lo que no se transmite al backend - Solo quienes tengan el enlace completo pueden acceder a la pantalla compartida
- La comparación de pantalla minimiza la transmisión de datos y refuerza la privacidad
- Actualmente se está trabajando en el cifrado de coordenadas del cursor
- El código fuente está disponible en Source Code
1 comentarios
Opiniones de Hacker News
Hiciste bien en publicar el proyecto. La idea es genial y sorprendentemente minimalista, pero en el código fuente se ven varias fallas criptográficas, así que no debería usarse en situaciones donde el cifrado sea algo central.
[0]: https://github.com/1fpsvideo/1fps/blob/main/1fps.go#L99
[1]: https://github.com/1fpsvideo/1fps/blob/main/1fps.go#L287
[2]: https://eprint.iacr.org/2016/475.pdf
[3]: https://soatok.blog/2020/05/13/why-aes-gcm-sucks/
En este caso, me pregunto si la razón principal para no recomendar simplemente arreglar el problema del nonce es por las trampas de implementación, o si está conectada de forma más sutil con los problemas generales mencionados en los artículos anteriores.
Visto ingenuamente, AES-GCM se usa en muchos lugares, como TLS o SRTP, así que alguien que no sepa mucho de criptografía podría pensar que es una buena elección.
Al ver el código, parece que toma y envía una captura de pantalla (.jpg) cada segundo. Me pregunto si este método realmente ahorra ancho de banda frente a la compresión de video moderna, que reutiliza información de cuadros anteriores.
Grabé un video de 1 minuto editando código en VS Code a 1440p 10fps con codificación AV1, y resultó tener aproximadamente la mitad del tamaño que 60 capturas JPEG de la misma pantalla. Me interesaría ver cifras si las han probado.
Las capturas ocupaban mucho espacio en disco y, al ver que casi nada cambiaba entre fotos, se me ocurrió un algoritmo que guardara solo las diferencias con la imagen siguiente. Unos minutos después me di cuenta de que estaba reinventando la compresión de video.
Así que convertí la secuencia de imágenes a mp4 con ffmpeg, y el tamaño del archivo se redujo aproximadamente un 95%. Con ImageMagick incrusté los nombres de archivo con timestamp en las imágenes, y creo que básicamente repliqué la funcionalidad de TimeSnapper Classic con 2 comandos.
De un lado está el uso de CPU y del otro la red. Mi opinión es que la red es barata, pero la codificación es cara. No tengo pruebas, solo experimentos locales, pero empezar a medir sería una muy buena idea.
También hay otra idea: escanear la pantalla y enviar solo las partes que cambiaron. Incluso enviando solo la mitad de la pantalla, creo que podría superar a la codificación de video desde el punto de vista de la red. Eso sí, el algoritmo de diff tendría que ser muy rápido. En 1280x720 hay 914400 píxeles y, a 4 bytes cada uno, habría que procesar 3.49 MB de información por segundo.
También me interesa cuánto cuesta generar 60 JPEG frente a la eficiencia de la codificación de video. ¿Son parecidas?
Si uno quisiera, probablemente podría hacer ambas cosas fácilmente, pero no sé si valdría la pena la molestia. Coincido en que, si escala desde la misma IP, este enfoque podría volverse pesado.
Me gusta
Nuestro flujo de trabajo está diseñado para eliminar la necesidad de una oficina y de infraestructura técnica. Transmitimos en tiempo real la salida de la línea de tiempo, es decir, el resultado de la edición de video, y mantenemos un canal de comunicación abierto. La mayoría del equipo es bastante introvertida, así que usamos push-to-talk, y si no hace falta una discusión grupal, por lo general solo dejamos notas en el chat
Muchas veces las soluciones toscas terminan siendo las adoptadas
¿Cuál es el caso de uso de compartir pantalla sin audio? No termino de ver cuándo sería útil. De todos modos, ¿no hay que comunicarse de alguna forma con la otra persona?
También hay veces en que necesitas mantener la pantalla compartida durante reuniones largas. A veces prefieres programar en vez de sentarte a escuchar una reunión de 1 o 2 horas
Y también encaja con gente como yo, a la que no le gusta el audio. Hay muchos estudiantes a los que quiero ayudar, pero no quiero meter audio en el medio. Mi chat de voz no es un recurso que se paralelice bien
Parece más cercano a chatear por texto enviando capturas de pantalla que a “compartir pantalla durante una llamada de voz”. Entiendo por qué algunas personas lo preferirían
Sobre la parte de “estoy cansado de compartir pantalla porque Google Meet tiene límite de 1 hora y Zoom de 40 minutos”, jitsi[0] es una alternativa open source[1] de videoconferencia basada en WebRTC. Es bastante completa como reemplazo de Zoom, Google Meet, Slack y similares
Puedes usarla desde el sitio principal o alojarla tú mismo si quieres
[0]: https://meet.jit.si/
[1]: https://github.com/jitsi
[1] https://github.com/strukturag/nextcloud-spreed-signaling
Podría ser interesante crear una heurística para elegir qué frame usar. Elegir siempre a ciegas el frame más reciente probablemente no sea lo ideal; podría ser mejor escoger un frame con poco movimiento, sin animaciones en curso o con métricas similares
Si quisieras hacerlo más sofisticado, también podrías analizar por ventana y luego construir algún tipo de agregación para el frame completo
Es una idea interesante, y en ajedrez he oído que un concepto similar se llama búsqueda de quietud (quiescence search)[1], pero probablemente no valga el esfuerzo
[0] https://old.reddit.com/r/Android/comments/11nzrb0/samsung_sp...
[1] https://en.wikipedia.org/wiki/Quiescence_search
Aun así, suena como una gran idea y un problema interesante
Me da un error de compilación en
github.com/go-vgo/robotgoporque faltaX11/extensions/XTest.hhttps://github.com/go-vgo/robotgo?tab=readme-ov-file#require...
Hay un prerrequisito que no aparece en la página. En Mint 22 tuve que instalar el paquete libxtst-dev
robotgotiene algunos problemas en Windows, así que ahora estoy revisando parte de esoJusto hoy estaba buscando algo así. Estoy monitoreando remotamente un evento de pruebas físicas, y dejar abierto un Google Meet con grabación activada es un desastre, pero aun así necesitaba chat de texto para la interfaz
Parece una interfaz minimalista muy buena. Si me da la gana, quizá podría agregarle algún tipo de persistencia al chat
Además, ¿se supone que el texto o la voz sincronizados van por otro lado, como una llamada telefónica o una explicación por texto en Slack?
Para mi uso, Moonlight Game Streaming casi reemplazó a VNC. Solo haría falta que mejoren un poco funciones como transferencia de archivos y compartir el portapapeles
Hay un problema con el seguimiento del cursor. No sé si será porque tengo varios monitores
En esta imagen, el anillo marca la posición real del cursor https://i.imgur.com/TvzskjS.png