Sebastián Castillo - Nicolas
Miranda
sebastian.castilloar@sansano.usm.cl - nicolas.mirandav@sansano.usm.cl
sábado, 10 de diciembre de 2022
1....................................................... Índice
2...................................... Tabla
de figuras
3................................................. Resumen
4........................................... Introducción
5.................................................. Solución
5.1......................... Diseño
de la solución
5.2.................................. Implementación
5.3... Escenarios
de prueba y resultados
6.................. Conclusión
y trabajo futuro
7............................................. Referencias
8......................................... Código
fuente
9............................. Conceptos
Utilizados
Figure 1: relación entre
programas
Figure 2: Comunicación en pasos para lograr una
transmisión
Figure 3: Diagrama de flujo Cliente Webcam
Figure 4: Diagrama de flujo server relay
Figure 5: Diagrama de flujo Cliente playout
Figure 6: Diagrama de secuencia, conexion entre programas
Figure 7 Ejecución cliente webcam
Figure 8 Ejecución Cliente playout
Figure 10 Vista cliente playout cuando se conecta otra
webcam
Se plantea transmitir una señal de
video de una webcam desde cualquier punto a servidor playout, el cual se
encarga de retransmitir el video para posteriormente por parte del usuario
poder visualizar el contenido en televisión digital. Para esto se mejora una
solución existente, la cual permite únicamente transmitir webcam a servidor playout
desde un lugar fijo, agregándole la capacidad de transmitir desde cualquier
punto y además de recibir más de una cámara web seleccionable. Para dicha
mejora se plantea una solución en la que se utiliza un servidor intermediario,
quien recibe el video de webcam desde cualquier punto y lo retransmite a un
dispositivo capaz de comunicarse directamente con el playout. La solución
implica a tres programas trabajados en lenguaje C donde los contenidos presentes
en la solución, abarcan desde uso de creación de
procesos, hilos, sincronización entre ellos, hasta uso de clientes y servidores
tanto UDP como TCP.
El objetivo por alcanzar es transmitir el video emitido por una webcam
desde cualquier punto y poder visualizarlo a través de la televisión
digital. ¿Cómo se puede lograr en
rasgos generales? Para
lograrlo se transmite el video de la webcam al playout, este modula el video y lo
emite por aire, la señal emitida es recibida por el decodificador el cual
recupera el video demodulado para que finalmente pueda ser observado en la
televisión. Esta solución ya existe y es usada como base en este proyecto, pero
tiene una limitación, pues solo
funciona si es que el computador que está emitiendo el video de la webcam tiene
comunicación directa con el playout, lo cual sólo se cumple si es que ambos dispositivos
están bajo la misma subred.
Ahora toca responder la pregunta ¿Por qué sólo se cumple si ambos están bajo
la misma red? Porque como muchos dispositivos presentes en Internet, el playout se encuentra escondido detrás de
una NAT, lo que provoca que no podamos contactar de forma directa al
dispositivo si es que se le desea ubicar desde fuera de la subred. Por lo tanto,
la problemática a solucionar se
resume en buscar cómo puede llegar el
video de la webcam desde fuera de la
red al playout.
La solución está compuesta por tres distintos
programas:
· Un cliente webcam que produce un video por Webcam que quiere ser
reproducido a una TV mediante el Playout.
· Un cliente playout que se encuentra en la misma red que el dispositivo
playout, y es capaz de elegir un cliente webcam para recibir su video desde el
servidor relay y así reenviarlo al playout que permite la reproducción en la
TV.
· Un servidor intermedio que redirecciona los paquetes de video hacia el cliente playout según cual haya pedido. Además, mantiene registro de los posibles clientes webcam disponibles para informarle al cliente playout de sus opciones.
Figure 1: relación entre programas
Toda la comunicación entre ambos
clientes ocurre con el servidor como intermediario.
Figure 2: Comunicación en pasos para lograr una transmisión
La estructura general del Cliente
Webcam utiliza un solo hilo que se conecta, registra con el servidor y escucha
sus comandos para comenzar o terminar la transmisión del video, creando un
nuevo proceso que ejecute un script bash con el comando ffmpeg para emitir
mediante UDP el video al servidor.
Figure 3: Diagrama de flujo Cliente Webcam
La estructura general del Servidor
Relay consta de dos hilos para mantener comunicación con ambos tipos de
clientes y un arreglo global con los clientes webcam conectados.
Para los clientes webcam es necesario
recibirlos y revisar un espacio en el arreglo global para agregarlos o
denegarles la conexión en caso de ser necesario, además estar atento a la desconexión
de alguno de los activos para removerlos.
El único cliente playout debe ser
informado de los clientes webcam activos y recibir su opción elegida para comenzar
la retransmisión de paquetes UDP, mientras se escucha un requerimiento para
parar el video y elegir otro o una desconexión para comenzar a aceptar un nuevo
cliente playout.
Figure 4: Diagrama de flujo server relay
El Cliente Playout necesita un
solo hilo para conectarse, recibir sus opciones de transmisión, enviar su elección
y cuando se reciba la confirmación crear un hilo nuevo solo para redireccionar
los paquetes UDP de video hacia el destino final del playout. Además de
permitirle al usuario para y comenzar a elegir una nueva transmisión.
Figure 5: Diagrama de flujo Cliente playout
La implementación de los tres
programas es en lenguaje C, con el script ffmpeg en bash.
Para el funcionamiento del script
bash es necesario la ejecución del cliente webcam en un computador Linux con
webcam y conocer el nombre del dispositivo de video (ejecutar “v4l2-ctl
--list-devices”, del paquete v4l-utils).
El script permite dos posibles nombres al momento de iniciar la ejecución, “/dev/video0” y “/dev/video1”.
Además, para la transmisión en necesario
tener el paquete “ffmpeg” instalado, ya que este se encarga de extraer
el video y comenzar a mandar los paquetes UDP al servidor.
Por otro lado
para el servidor relay es necesario que tener ip fija y dos puertos fijos para
aceptar conexiones.
En conjunto el proceso de
comunicación entre los programas para iniciar la transmisión de un video es una
combinación de TCP para mantener conexión y comunicar comandos, y UDP
para transportar el video.
Figure 6: Diagrama de secuencia, conexion
entre programas
Se realizaron dos pruebas para
observar el resultado de la solución diseñada. Estas fueron hechas en el Laboratorio
de Televisión Digital de la universidad, utilizando la red del laboratorio y la
proporcionada a los estudiantes. Para ambas pruebas se ejecuta programa Server
relay en servidor aragorn.
1.-Prueba con una cámara fuera de la
red del playout:
Se ejecuta programa Cliente webcam
en computador conectado a la red de estudiantes.
Figure 7 Ejecución cliente webcam
Se ejecuta programa Cliente
playout en computador conectado a la red del laboratorio, a la cual también
está conectado el playout.
Figure 8 Ejecución Cliente playout
Se sintoniza canal para observar
resultado.
Figure 9 Resultado prueba 1
2.-Prueba con dos cámaras fuera de la
red del playout:
Para prueba 2 se agrega un cliente
webcam y se escoge para su visualización.
Figure 10 Vista cliente playout cuando se conecta otra webcam
Se sintoniza canal para observar
resultado.
Figure 11 Resultado prueba 2
Video
sobre prueba realizada en LAB TVD
Se logra diseñar una solución a la problemática,
pudiendo transmitir video de webcam desde fuera de la red de playout, mejorando
así el estado inicial de la solución base. Por otro lado, la manipulación de
más de una cámara también se logra de manera satisfactoria.
Respecto a la asignatura Programación
de Sistemas, se aplicaron la mayoría de los contenidos impartidos (programación
Shell, procesos, hilos, sincronización, comunicación remota…). Además, se logra
aplicar el aprendizaje obtenido en una problemática real de otra área,
específicamente un problema de Redes de Computadores.
Para finalizar, se identifican y
ofrecen algunos puntos que pueden ser interesantes de trabajar en un futuro:
· Seguridad de los datos, especialmente tráfico
UDP.
· Aceptar dispositivos webcam según
disponibilidad del cliente webcam, por ejemplo: si se tiene más de una webcam
conectado al computador poder elegir entre ellas cuál usar.
· Permitir modificar la transmisión
para ajustarse a distintos anchos de banda.
· Envío instantáneo de video apenas
exista conexión para observar respuesta ante cambios de webcam, a diferencia de
solución actual que se requiere detener una cámara para comenzar a utilizar
otra.
·
"Manual Transmisión
ISDBT V2019" de Gonzalo Callender y Roberto Muñoz. Con
revisión de Eric Borzone.
·
"Manual Transmisión Camara USB ISDBT V2019" de Jose Luis Rojel. Con revisión de Eric Borzone.
·
"Transmisión de cámara web a televisión digital – Proyecto
ELO323" de Sebastián Castillo, Sebastián Madariaga y Darael Badilla.
Repositorio con código fuente:
https://gitlab.com/nicolas.mirandav/elo330-proyecto
· Comunicación TCP
· Comunicación UDP
· Scripts Bash
· Manipulación de Hilos
· Creación de procesos.
· Sincronización de procesos e hilos.
· Ejecución de script externo a
programa.