Logo Studenta

Desarrollo de una plataforma basada en dispositivos Android para centralizar la informacion proveniente de camaras de seguridad privadas

¡Este material tiene más páginas!

Vista previa del material en texto

Trabajo Final
Ingeniería de Sistemas - Facultad de Ciencias Exactas - UNICEN
TEMA: Desarrollo de una plataforma basada en dispositivos Android para centralizar la
información proveniente de cámaras de seguridad privadas.
Alumnos:
● Casabó, Santiago.
● Maly Varni, Mateo.
Director: Dr. Rubiales, Aldo.
Co-Director: Ing. Domínguez, Leonardo Daniel.
A nuestra� familia�, amig�� � docente� po� acompañarn��
� l� larg� d� est� carrer�.
Mucha� gracia� � tod��.
Índice de Contenidos
1. Introducción Pág. 1
a. Motivación Pág. 1
b. Estado del arte Pág. 4
c. Metodología Pág. 5
d. Objetivos Pág. 6
e. Requisitos Funcionales Pág. 7
f. Estructura del Documento Pág. 9
2. Contexto Pág. 10
a. La Arquitectura Kurento Pág. 11
b. El problema detrás de NAT Pág. 13
c. Protocolos de envío y negociación Pág. 14
d. ¿Por qué utilizar Android? Pág. 14
e. Herramientas Pág. 15
i. WebRTC Pág. 15
ii. GStreamer Pág. 16
iii. FFmpeg Pág. 16
iv. Firebase Pág. 16
v. OwnCloud Pág. 18
vi. OpenCV Pág. 18
vii. TensorFlow Pág. 19
3. Desarrollo Pág. 20
a. El Sistema Pág. 20
b. Flujo de la aplicación: Interfaz de usuario Pág. 23
c. Estructuras de datos utilizadas Pág. 27
i. Cámara Pág. 27
ii. Archivos de video Pág. 28
iii. Dispositivos Pág. 28
d. Proceso de implementación Pág. 28
e. Resultados y pruebas preliminares Pág. 32
f. Implementación mediante FFmpeg Pág. 33
g. Consumo de Recursos: FFmpeg y GStreamer Pág. 37
i. CPU Pág. 37
ii. Memoria Principal (RAM) Pág. 38
iii. Uso de la red Pág. 39
iv. Consumo de energía Pág. 40
h. Organización de archivos Pág. 40
i. Eventos Pág. 42
j. Análisis funcional Pág. 43
i. Flujo funcional: Grabación Pág. 44
ii. Flujo funcional: Streaming Pág. 46
iii. Flujo funcional: Sincronización de archivos Pág. 48
k. Chequeos de conexión Pág. 51
l. Administración de almacenamiento Pág. 52
i. Cálculo efectivo de espacio requerido Pág. 53
ii. Administración dinámica de almacenamiento Pág. 55
iii. Asignación de memoria basada en bloques Pág. 56
iv. Escogiendo una alternativa Pág. 57
m. Procesamiento de imágenes Pág. 59
i. Herramientas y características Pág. 59
ii. Detectando objetos: Esquema de Funcionamiento Pág. 62
n. Resultados: Tiempo de procesamiento y uso de recursos Pág. 63
i. Comparación de rendimiento: Modelo optimizado para móviles
Pág. 63
ii. Uso de recursos del módulo de detección en móviles Pág. 65
o. Experiencia con el departamento de servicios de la Municipalidad de Tandil
Pág. 67
4. Conclusiones y trabajo futuro Pág. 70
5. Anexo Pág. 72
6. Bibliografía Pág. 82
Índice de Figuras
1. Arquitectura de Kurento Pág. 11
2. Diagrama de alto nivel de la arquitectura del sistema Cámaras Privadas Tandil
Pág. 13
3. Arquitectura del sistema de CámarasPrivadasTandil Pág. 21
4. Flujo de la aplicación CámarasPrivadasTandil Pág. 26
5. Consumo de CPU por parte de un proceso GStreamer Pág. 37
6. Consumo de CPU por parte de un proceso de FFmpeg Pág. 38
7. Consumo de memoria principal por parte de GStreamer Pág. 38
8. Consumo de memoria principal por parte de FFmpeg Pág. 39
9. Uso de red por parte de FFmpeg (Grabación). Las líneas azules representan la
recepción de datos mientras que la amarilla el envío de los mismos Pág. 39
10. Consumo de energía por parte de FFmpeg Pág. 40
11. Jerarquía para la organización interna de archivos dentro del dispositivo Pág. 41
12. Jerarquía para la organización de archivos en el servidor OwnCloud Pág. 41
13. Esquema de funcionamiento de un watcher Pág. 45
14. Flujo del proceso de grabación de video Pág. 46
15. Flujo del proceso de envío de video Pág. 48
16. Flujo del proceso de sincronización de archivos (solicitudes) Pág. 50
17. Flujo del proceso de sincronización de archivos (envío automático) Pág. 51
18. Esquema de alojamiento utilizando umbrales Pág. 55
19. Arquitectura presente de OpenCV en la manipulación de I/O Pág. 60
20. Esquema de funcionamiento del módulo de detección de objetos Pág. 62
21. Esquema final de funcionamiento del módulo de detección de objetos Pág. 63
22. Gráfico comparativo de los tiempos de procesamiento Pág. 64
23. Uso de energía por parte del módulo de detección de objetos Pág. 65
24. Uso de memoria principal por parte del módulo de detección de objetos Pág. 66
25. Uso de CPU por parte del módulo de detección de objetos Pág. 66
26. DVR en la sección de servicios de la Municipalidad de Tandil Pág. 67
27. Captura de la cámara en el depósito de camiones Pág. 68
28. Captura de la cámara en la gasolinera Pág. 69
29. Pantalla de Ingreso a la aplicación Pág. 72
30. Pantalla de creación del dispositivo (asignación de nombre) Pág. 72
31. Pantalla de creación del dispositivo (completar domicilio) Pág. 73
32. Menú principal de la aplicación sin ninguna cámara asociada Pág. 73
33. Menú principal de la aplicación con una cámara asociada (opciones sin desplegar)
Pág. 74
34. Menú principal de la aplicación con una cámara asociada (opciones desplegadas)
Pág. 74
35. Tarjeta de una cámara durante el proceso de grabación Pág. 75
36. Tarjeta de una cámara durante el proceso de streaming Pág. 75
37. Pantalla de creación de cámaras (asignación de nombre) Pág. 76
38. Pantalla de creación de cámaras (asignación de IP) Pág. 76
39. Pantalla de creación de cámaras (descubrimiento de dispositivos) Pág. 77
40. Pantalla de selección de canales para cámaras Pág. 77
41. Pantalla de selección de canales para NVRs/DVRs Pág. 78
42. Pantalla para completar el registro de la cámara, o para continuar en caso de contar
con usuario Pág. 78
43. Pantalla para completar la contraseña de la cámara y finalizar su integración
Pág. 79
44. Pantalla de visualización en vivo Pág. 79
45. Pantalla de visualización de los registros Pág. 80
46. Menú de ajustes de una cámara Pág. 80
47. Pantalla de opciones de grabación Pág. 81
48. Pantalla de opciones de streaming Pág. 81
Índice de Tablas
1. Valores para las fronteras utilizados en dispositivos con menos de 8GB de
almacenamiento Pág. 56
2. Valores para las fronteras utilizados en dispositivos con más de 8GB de
almacenamiento Pág. 56
3. Tiempos de procesamiento Pág. 64
4. Especificaciones de los equipos utilizados para ésta prueba Pág. 64
Introducción
Motivación
La reducción de costos y tiempos en el desarrollo tecnológico, han generado en los últimos
años una masificación de dispositivos electrónicos. Así, la evolución es apabullante. Si se
observa por ejemplo el proceso histórico de los microprocesadores, veremos que en 1971, el
Intel 4004 construido con 2300 transistores, era capaz de procesar 92000 instrucciones por
segundo [1] (0.092 MIPS) con una velocidad máxima de 740 kHz. 22 años más tarde, en 1993,
Intel lanzó el Intel Pentium, construido con 3.1 millones de transistores y una velocidad
máxima de 100 MHz, capaz de procesar 188 MIPS (2043 veces más rápido) mientras que 27
años después, en 2020, el AMD Ryzen 3990X alcanzó los 2356230 MIPS a 4.35 Ghz (12533
veces más rápido que el Pentium) [2]. Pero este drástico aumento en la capacidad y
velocidad de procesamiento no fue (ni es) el único gran avance realizado en las últimas
décadas. Por su parte, las telecomunicaciones han sufrido un cambio muy significativo
desde la aparición de ARPANET en la década de los ‘60 hasta la aplicación masiva de fibra
óptica en la actualidad: redes de gran tamaño y alta velocidad utilizadas para todo tipo de
aplicaciones desde transmisiones multimedia a ofimáticas de uso compartido [3] [4].
Sin embargo, estos procesos no se han llevado adelante de forma homogénea en todo el
mundo, sino que uno se ha visto más beneficiado que otro. Es el caso de nuestro país por
ejemplo, cuya infraestructura en telecomunicaciones no se encuentra lo suficientemente
desarrollada. Basta con alejarse de los grandes centros urbanos para evidenciar que incluso
los servicios de telefonía móvil no cuentan con una cobertura decente en un mundo dónde
se comienza a implementar de forma masiva el 5G. Pero si a esta situación se la compara con
la variedad de dispositivos y gamas de estos, nos encontraremos con una grata sorpresa:existe una gran capacidad de cómputo en los hogares de cada uno de los argentinos, desde
computadoras a teléfonos de última generación.
Esta capacidad de adquisición de dispositivos se ha visto incrementada últimamente tanto
en el mundo como en la Argentina, y en particular por sectores vinculados a la seguridad
con la adquisición de equipos de vigilancia. No resulta novedoso encender la televisión, o
abrir Twitter para recibir una ola de noticias sobre inseguridad tanto en la vía pública como
en los hogares de los ciudadanos. Con esta situación, tanto gobiernos como los particulares
se han hecho con cámaras de seguridad utilizadas para monitorear sitios de interés: el
1
primero las utiliza en espacios públicos como calles, plazas e instituciones; mientras que los
segundos en sus hogares y locales. En el caso de los actores públicos, estas cámaras son
gestionadas en general por un centro de monitoreo o CM, un agente público o privado que
tiene acceso a las imágenes. En la ciudad de Tandil, es el municipio el ente estatal encargado
de gestionar su propio sistema de cámaras de vigilancia (Anónimo), tarea llevada a cabo por
el centro de monitoreo de la ciudad. Pero es el municipio el encargado tanto del
mantenimiento de los equipos como de su adquisición [5].
La mayoría de los municipios de tamaño medio de la República Argentina tiene su propia
infraestructura de servidores, cámaras y red de alta velocidad que permite la transmisión en
tiempo real de video desde los distintos puntos de la ciudad. Generalmente estos videos son
almacenados de manera centralizada en un data center propio. El aumento de la calidad de
imágen de las cámaras, la cantidad de cámaras requeridas, y del costo de los equipos y
mantenimiento de las redes hace que para los Municipios cada vez sea más difícil estar a la
altura de los requerimientos actuales de la población. Esto hace que se deba pensar en
nuevos enfoques públicos/privados y descentralizados que permitan disminuir los costos
de tener un conjunto administrado de dispositivos registrando video en tiempo real.
Los mismos ciudadanos, comercios, estaciones de servicio u otros espacios, que no contratan
los sistemas de monitoreo, aún así suelen tener cámaras de vigilancia conectadas a una red
local que les permite observar el entorno que les rodea. Pero, ¿Es posible diseñar un sistema
capaz de integrar un conjunto de cámaras de diferentes fabricantes para así ofrecer un
servicio confiable de monitoreo? Pues la respuesta a esta pregunta es si. Sin embargo, esto
requiere que la cámara deba poder ser accedida desde fuera de la red privada. Para sortear
este obstáculo podría accederse al flujo de vídeo de forma pública, lo que implicaría que el
usuario realice una serie de pasos para configurar los equipos, para lo cual debería contar
con ciertos conocimientos técnicos que no necesariamente pueda tener. A su vez, a pesar de
que fuera capaz de realizar dicha tarea, implicaría una pérdida de seguridad por su parte, ya
que cualquier usuario podría acceder a la cámara y ver qué es lo que ocurre (aunque se
pueda agregar un usuario y una contraseña, exponer el dispositivo a internet, no es algo
recomendado). Es por esto que es necesario tener en cuenta que el sistema sea fácil de
instalar, previniendo además que el usuario exponga su privacidad. Para lograr esto, se
plantea la utilización de un dispositivo en los diferentes sitios que requieran de monitoreo, y
que este sea el responsable de realizar las grabaciones o enviar el video en caso de que el
centro de monitoreo así lo requiera. En principio, las grabaciones se harían localmente, lo
que evita el uso de la nube para su completo almacenaje. Ahora, si es necesario algún
2
archivo de video para su análisis por parte del centro de monitoreo, este podrá ser enviado a
través de internet (On-Demand). Además, será posible enviar las imágenes en tiempo real
hacia el sistema utilizado por el servicio de vigilancia, lo que da acceso inmediato a los
sucesos.
Asimismo, en este trabajo se propone aplicar los conceptos de Fog Computing o Edge
Computing [6] a los sistemas de video vigilancia buscando distribuir no sólo el
procesamiento de video sino también las necesidades de almacenamiento de los mismos. A
su vez, también se busca prescindir de una red de alta velocidad dedicada, y permitir que la
coordinación de los dispositivos y transferencia de video se realice a demanda utilizando los
enlaces de Internet de cada particular en forma óptima (por ejemplo si dos operadores
quisieran acceder al streaming de una cámara, solo se iniciaría una conexión al domicilio
particular).
Este proyecto se encuentra incluído dentro de SmartCam [7], una plataforma utilizada para el
análisis inteligente de video desarrollado por PLADEMA en conjunto con la Municipalidad
de Tandil. El mismo surge de la necesidad de incluir más cámaras, y en particular, equipos
desacoplados a la red de fibra óptica dispuesta por este último, de modo de poder
transportarlas de un punto a otro, en base a la demanda temporal (por ejemplo ante un
evento multitudinario, o en regiones con alguna problemática temporal). Una Smartcam es
un equipamiento de monitoreo y almacenamiento por video con capacidad de
procesamiento “in-situ” y acceso remoto vía 4G o WiFi local, utilizando técnicas de análisis
de imágenes gracias a la incorporación de una computadora robustecida conectada
directamente a la cámara y preparada para soportar cambios en las condiciones climáticas y
variaciones o cortes de suministro eléctrico (ya que cuenta con un sistema propio de
baterías).
El sistema tiene además, un módulo de software que opera como un monitor del
equipamiento, el cual reporta y genera alertas en casos de situaciones anormales. Los
sensores con los que cuenta el equipo son:
● Temperatura interna del equipamiento
● Apertura de puertas
● Tensión eléctrica y nivel de carga de la batería
● Tipo de conectividad
3
Actualmente el Municipio cuenta con un número cercano a 10 de estos dispositivos y dado
que el costo de estos dispositivos no es económico, es por eso que surge la necesidad de
integrarse con cámaras privadas, lo cual se alinea con el objetivo de la presente tesis.
Estado del arte
Actualmente las herramientas de las que se dispone para realizar tareas de vigilancia
resultan ser de lo más variadas tanto en los servicios que ofrecen como en la forma de
monetizarlo. Servicios como BriefCam1 permiten no sólo la grabación de las imágenes
captadas por las cámaras, sino también la posibilidad de realizar diversos análisis de las
mismas (ya sea reconocimiento facial o de objetos) haciendo uso de inteligencia artificial,
además de ofrecer un servicio de alertas personalizado. Otros como Angel Cam2 permiten,
mediante la adquisición de un dispositivo denominado AngelBox, conectar cámaras ip
locales para almacenar los videos en la nube, y observar tanto las imágenes en vivo como las
grabadas. Algunos de estos servicios son gratuitos y otros están disponibles luego del pago
de una suscripción mensual. La ventaja o lo disruptivo del servicio, es que con solo encender
y establecer la ubicación de las cámaras, ya se puede hacer uso completo del servicio sin la
necesidad de configuraciones técnicas sobre el router del hogar, ofreciendo así un servicio
plug and play.
Sin embargo, esta clase de servicios que requieren de una estable y rápida conexión a
internet resultan difíciles de implementar aquí, además de la dificultad de encontrar este
tipo de soluciones dada la situación para importar [8], por lo que debe optarse por otro tipo
de solución. Es por esto que se propone, en lugar de utilizar la nube en forma exclusiva para
el almacenamiento de los archivos, también hacerlo del disco interno de artefacto. De esta
manera no solo se permite aligerar los consumos de red, sino también permite distribuir la
responsabilidad de un hipotético servidor central. Los videos podrán ser accesibles desde la
nube,siempre en cuanto sean explícitamente solicitados, evitando también el mantenimiento
rutinario eliminando archivos no utilizados.
En lo referente al análisis de las imágenes, generalmente es realizado en servidores que
manipulan los videos almacenados en un repositorio remoto. En este proyecto se pretende
realizar pruebas preliminares que permitan, a modo de concepto, aligerar la responsabilidad
y la carga a estos aplicando conceptos de Edge Computing. Este paradigma plantea la
realización de tareas de procesamiento y análisis lo más cercano a la fuente de los datos
2 https://www.angelcam.com/
1 https://www.briefcam.com/
4
como sea posible. Este tipo de prácticas permitirá una reducción tanto en los tiempos de
respuesta así como en el ancho de banda. Es importante mencionar que este concepto no es
un sinónimo de Internet de las cosas (IoT [9]), ya que este último resulta ser una tecnología
incluída dentro de Edge Computing, tratándose en particular de una arquitectura y no de un
paradigma. Por lo tanto, para terminar de definir este concepto, se trata de aligerar la carga
en los servidores y la transmisión de datos al realizar tareas computacionales en los sectores
más cercanos a las fuentes. Generalmente quien se termina acercando a la fuente es el
servidor el cual cuenta con el poder de cómputo necesario para abarcar los procesamientos
más demandantes, pero resultaría costoso de implementar y de mantener para una ciudad
no muy extensa, como para el escenario planteado en este proyecto. En este caso particular
se introduce el concepto de mobile computing [10], lo que hace referencia al uso de
dispositivos móviles como los encargados de realizar las tareas de procesamiento y análisis,
para luego enviar solo información necesaria o ya pre-procesada, logrando de esta manera
atenuar tanto la carga total de procesamiento en los servidores y el ancho de banda necesario
para enviar el video capturado por las cámaras.
Metodología
El proyecto constó de 4 etapas. En la primera de ellas, se evaluó y recopiló información sobre
las diferentes alternativas a la hora de enviar video en tiempo real desde un dispositivo
Android. Esta etapa concluyó con una aplicación móvil de demostración que enviaba video
de una cámara pública a una aplicación web de pruebas dónde se observaba el video
emitido.
En la segunda se procedió a organizar los diferentes requisitos del sistema dentro de lo que
serían las pantallas de la aplicación, las cuáles una vez establecido su comportamiento, se
comenzó a implementar las mismas tanto visual como funcionalmente. En esta etapa
también se estableció la existencia de usuarios quienes cuentan con credenciales de
autenticación, lo que derivó en un sistema de reconocimiento para los mismos.
En la tercera se integró una base de datos en la nube tanto para la autenticación de usuarios
como para los dispositivos de estos y las cámaras con las que están asociadas, además de
incluir el escritor de archivos (que serán manipulados en una etapa posterior).
Finalmente, se trataron cuestiones relacionadas con la estabilidad de la aplicación y control
de concurrencia, temas que se abordarán con mayor profundidad en otros capítulos.
5
Objetivos
En primera instancia, desde la perspectiva del tratamiento de multimedia, se espera que la
aplicación sea capaz de realizar las siguientes tareas en simultáneo utilizando la menor
cantidad de recursos posibles de la forma más eficiente, ya que al utilizar esta clase de
dispositivos Android los recursos con los que se cuentan son más reducidos que en
cualquier otra plataforma:
● Permitir dar de alta cámaras IP o NVRs/DVRs para monitoreo.
● Grabar vídeo de forma contínua almacenando los archivos generados dentro del
almacenamiento local o extraíble del dispositivo. La calidad de la grabación deberá ser
lo mejor posible.
○ El video podrá ser solicitado por la central de monitoreo. En caso de que esto
ocurra deberá sincronizarse con un repositorio en la nube para su posterior
reproducción. Esto no deberá impedir que la aplicación siga grabando el
video de las cámaras.
○ El ciclo de grabación deberá regular el espacio utilizado. Para ello, se
eliminarán los archivos con mayor antigüedad, siguiendo un esquema FIFO
[11].
● Listar y visualizar los videos registrados por cada cámara.
● Enviar video de una cámara en tiempo real desde un dispositivo android con la menor
latencia posible cuando se lo solicite desde el centro de monitoreo.
○ Hay muchos factores a considerar a la hora de enviar video que pueden
afectar la transmisión del mismo: conectividad, procesamiento de imágenes o
uso de memoria. Es por esto que se debe hacer un balance entre estos para
obtener la mejor imagen posible en el menor tiempo.
○ En caso de que ocurra un error en la transmisión, ya sea por una falla debido
a alguna de las causas mencionadas anteriormente, la aplicación se deberá
recuperar automáticamente del fallo.
● Permitir al usuario ver en vivo cualquiera de las cámaras asociadas a la aplicación.
6
● Se debe notificar al usuario en todo momento el estado del sistema. Es decir, debe estar
al tanto del momento en que una cámara se encuentra compartida, grabando o
enviando video al centro de monitoreo.
● El usuario podrá controlar en todo momento cualquiera de los ajustes de la cámara
(compartir, grabar, entre otros).
● Se deberá iniciar el sistema de forma automática ante un fallo energético.
Un objetivo que es común a los anteriores mencionados y no hay que dejar de lado es la
eficiencia. Dado que, cómo se dirá más adelante, se está programando para un dispositivo
móvil, por lo que hay que tener demasiado cuidado en lo que se programa, ya que los
recursos son mucho más limitados que en un PC por ejemplo, haciendo este tipo de tareas
un poco más complejas que de costumbre.
Finalmente se plantea como último objetivo el evaluar la inclusión de un módulo de
detección de objetos al sistema en cuestión. Éste módulo se desarrolla como una prueba de
concepto de Edge Computing, permitiendo reducir la carga de procesamiento sobre un
servidor centralizado.
Requisitos Funcionales
Se espera que la aplicación permita realizar las siguientes acciones sin ningún orden en
particular:
● La aplicación debe ser de fácil utilización y navegación para el usuario, ya que el
mismo podrá hacer uso de un control remoto.
● Se debe permitir a los usuarios ingresar en su cuenta haciendo uso de un usuario y
contraseña.
● Un usuario debe poder configurar el dispositivo que utiliza, dotando al mismo de un
nombre y de la dirección del domicilio donde este se encuentra.
7
● Las cámaras deberán contener su URL, junto con un nombre para identificarlas. A su
vez se debe poder modificar sus atributos.
○ En caso de que la información ingresada no se corresponda con ninguna
cámara, se comunicará con un error.
● Debe mostrarse en la pantalla principal la lista de todas las cámaras gestionadas por
la aplicación. De cada una de ellas se mostrará su nombre y una pequeña fotografía
que muestra el lugar al que apunta.
○ Esta lista debe dar acceso a información particular de una cámara cuándo el
usuario desee ver información de alguna de las mismas, indicando si está
siendo transmitida, si está grabando o si la cámara está accesible.
● Por cuestiones de privacidad, el usuario debe poder elegir si desea compartir su
cámara (grabaciones y/o video en vivo).
● Se debe poder iniciar y detener la grabación de archivos de video locales cuando el
usuario así lo desee.
○ El proceso de grabación debe poder llevarse a cabo durante las 48 horas del
día de forma ininterrumpida.
○ Los mismos deben ser alojados dentro del almacenamiento interno del
dispositivo o en el almacenamiento externo en caso de contar con uno.
○ El acceso a dichos archivos de video debe ser directo desde la aplicación,
simplificando la búsqueda de los mismos.
○ En caso de falla de energía, el servicio de grabación debe reanudarse en el
momento en el quela aplicación vuelva a abrirse.
○ Si la cámara no es accesible a la hora de grabar, debe intentar hasta que se
logre conectar o el usuario deshabilite explícitamente el proceso.
○ Se debe poder configurar la calidad de grabación en caso de que el usuario
desee economizar el espacio de los archivos en el almacenamiento.
● La aplicación debe poder responder las peticiones que son enviadas desde la central
de monitoreo.
○ En caso de que se solicite el acceso al video en vivo, solicitud que solo llegará
en caso de que esto sea permitido por el usuario, se debe iniciar la
8
transmisión. El usuario podrá editar la calidad del video a fin de ahorrar
recursos tales como banda ancha y procesador.
○ Ante una petición de un archivo de video se debe sincronizar el mismo con la
nube, haciendo uso de los servicios de un tercero.
● La aplicación debe ser capaz de recuperarse ante un corte en el suministro eléctrico y
mantener los estados de las cámaras consistentes.
● La aplicación deberá integrarse al resto de herramientas que componen la plataforma
SmartCam.
Estructura del documento
En lo referente a la estructura de este documento, el primer capítulo introducirá cuál es el
problema, qué es lo que se quiere lograr y cómo fueron las etapas de desarrollo del proyecto.
En el siguiente se abordan conceptos generales, junto con las herramientas consideradas
para este proyecto junto a las ventajas y desventajas que estas presentan. En la tercera
sección de este documento se comenzará a comentar cuestiones relacionadas con la
implementación de la aplicación como bibliotecas utilizadas y los resultados obtenidos,
principalmente en el módulo de detección de objetos. Finalmente, en el apartado de
conclusiones se resumirán los resultados obtenidos junto con una breve reflexión sobre el
futuro del proyecto que ocupa estas líneas.
9
Contexto
Cuando se trata de manipular multimedia existen varios factores que complejizan la tarea,
más aún si se desea hacerlo en tiempo real. Algunos de estos se encuentran a la hora de
establecer una conexión, como la identificación de cada extremo o los protocolos de
negociación, y otros que permiten que la transmisión a través de la red sea lo más fluida
posible como los protocolos de transmisión o la latencia en la red. Ahora bien, existen
herramientas capaces de tomar en consideración todos estos factores logrando reproducir,
almacenar y compartir multimedia: estas son llamadas servidores multimedia (o media
servers en inglés). Algunos de los más populares son Red5 [12], Kurento [13], Wowza y Ant
Media Server3. Para lograr transmitir video en tiempo real se hace uso de WebRTC [14], un
proyecto de código abierto que permite conectar aplicaciones y proveer capacidades de
comunicación en tiempo real (RTC o Real Time Communication). En el caso de Red5, se
cuenta con un servidor multimedia de código abierto que solo ofrece la comunicación por
WebRTC en su versión paga, pero dado que es necesario reducir los costes de
mantenimiento, no se consideró su uso para este proyecto. Por otro lado, el resto de los
servidores multimedia proveen esta funcionalidad, pero aún así no resultan completamente
utilizables: el servicio provisto por Wowza ofrece un periodo gratuito de prueba que dura 30
días con todas las funcionalidades, una vez vencido el plazo se deberá abonar
mensualmente según el plan que se escoja; Ant Media Server tiene una versión gratuita con
todas las herramientas necesarias para lograr lo planteado en el proyecto, pero presenta una
latencia de entre 8 y 12 segundos en la transmisión de video, por lo que no permite que sea
en tiempo real como se desea; finalmente surge Kurento4, herramienta de código abierto que
implementa todas las funcionalidades requeridas sin la necesidad de pagar el servicio,
debido a que se trata de un proyecto financiado entre la Unión Europea y España. Es por
esto que se optó por Kurento para la realización de este proyecto: sus variadas utilidades en
conjunto con su nulo coste, hacen de esta la herramienta ideal. A continuación se
profundizará en los beneficios que conlleva la utilización de Kurento y se explicará más en
detalle algunos de los factores mencionados anteriormente a la hora de manipular
multimedia.
4 Desarrollado en conjunto entre el Ministerio de Economía, Finanzas y Competitividad de España y el Fondo de
Desarrollo Regional Europeo bajo el proyecto LERNIM (RTC-2016-4674-7).
3 https://github.com/ant-media/Ant-Media-Server/wiki.
10
La Arquitectura de Kurento
Tal y como se indicó con anterioridad Kurento es un media server, esto implica que es
utilizado para el almacenamiento y transmisión de multimedia a través de la red. El mismo a
su vez cuenta con una API que abstrae el comportamiento de otra herramienta utilizada
para el intercambio de multimedia llamada GStreamer [15]. La misma será explicada en una
sección posterior. En la figura 1 puede observarse la arquitectura de Kurento, dónde
podemos identificar la existencia de tres componentes principales:
● El Kurento Media Server (KMS), el cual es el encargado de gestionar las
comunicaciones entre los distintos interlocutores. Todo flujo de datos fruto del
intercambio debe pasar por aquí. Además es en este componente donde se pueden
aplicar modificaciones sobre los datos.
● El Kurento Application Server (KAS) es el encargado de regular la comunicación
entre cada uno de los individuos y el servidor, ya que el módulo se encuentra en
constante comunicación con estos.
● Finalmente la aplicación cliente será aquella que utilice el usuario final para enviar o
recibir multimedia.
Figura 1. Arquitectura de Kurento.
La interacción entre estos componentes se puede ver en dos fases separadas: Una de
negociación y la otra de intercambio de multimedia.
11
❖ Fase de negociación: En esta primera etapa el cliente, en caso de este proyecto el
centro de monitoreo, es quien inicia la comunicación hacia el servidor pidiendo algún
tipo de multimedia. En caso de que la multimedia sea en tiempo real, el cliente le
provee al servidor las preferencias deseadas a través de un protocolo llamado SDP
(Session Description Protocol [16]). Cuando el servidor (KAS) recibe la petición, y
según las instrucciones indicadas por el desarrollador, el KMS (Kurento Media
Server) instancia los elementos multimedia acordados y los asocia en un media
pipeline. Una vez creado, se devuelve al cliente el cómo y dónde acceder al contenido
multimedia. Durante este proceso sólo rigen protocolos de señalización.
❖ Fase de intercambio de multimedia: En esta etapa se produce el intercambio de
multimedia, donde el cliente le pide al servidor el contenido según la información
proveída en la etapa anterior.
Si bien ahora se tiene conocimiento de la arquitectura del software que se utiliza, es
necesario adquirir nociones básicas de cómo dotar del comportamiento deseado al software.
Para ello, es necesario comentar qué es un media pipeline y cómo relacionar el concepto
tanto con los usuarios como con los datos que estos desean enviar. Un media pipeline es un
canal por el cual se pueden enviar media elements, para proveer multimedia de una manera
específica, siendo un media element un componente que encapsula comportamiento
multimedia. Esto quiere decir que es posible dotar a este elemento de un comportamiento al
cual pueden someterse los datos de audio y video. Con Kurento se suelen utilizar dos tipos
de elements: endpoints y filtros. Los primeros representan a cada agente involucrado en la
comunicación, es decir, emisores y receptores. Como tales, tienen la capacidad de recibir o
enviar contenido multimedia al pipeline. Existen endpoints que describen el intercambio de
datos entre la web y el pipeline (WebRTC, RTP, HTTP [17]) y aquellos asociados a la
manipulación de archivos (grabar o leer).
Los filtros se encuentran en el medio del pipeline y son asociados a estos. Los mismos toman
una fuente de multimedia, le aplican una modificación (yasea un cambio de color o en la
perspectiva de la imagen) y generan una salida modificada fruto de la combinación de los
datos y filtros. Es importante recalcar que una vez asociado un filtro al pipeline, no es
posible disociarlo, por lo que es de vital importancia estar seguro de cuál es el proceso que se
desea llevar adelante.
12
El problema detrás de NAT
Se cuenta con una herramienta que es capaz de dar solución a nuestra necesidad de ofrecer
un servicio de calidad, pero existe una barrera que debe ser sobrepasada. El identificar los
actores que realizan la comunicación parece tratarse de un proceso trivial de localización de
interlocutores. Pues nada más lejos de la realidad. Debido a la utilización masiva de IPv4, lo
más probable es que la gran mayoría de usuarios se encuentren detrás de un NAT [18] que
garantice su acceso a internet. Esta situación dificulta el proceso de conexión ya que no se
sabe hacia dónde hay que transmitir la información. Para esto, es necesario utilizar STUN o
TURN [19]. La primera alternativa consiste en utilizar un servidor para obtener las
direcciones IP externas para luego comenzar con el proceso de comunicación; mientras que
la segunda se sustenta en el uso de un retransmisor, es decir, recibe datos del emisor y es este
quién debe garantizar el envío de la información hacia el receptor. Cabe destacar que TURN
soporta STUN. Generalmente se utiliza en principio STUN ya que es menos costoso, y en
caso de que no se obtenga una respuesta, se procede a utilizar TURN. En el caso de Kurento
se recomienda utilizar Coturn, una herramienta que permite la configuración de servidores
TURN y STUN.
Figura 2. Funcionamiento de TURN y STUN detrás de NAT.
13
Protocolos de envío y negociación
Existen múltiples enfoques para la transmisión de audio y video, pero en este trabajo se hará
hincapié en la comunicación en tiempo real. Para ello es necesario utilizar RTP o Real-Time
Transport Protocol [20], un protocolo diseñado para transmitir datos en tiempo real. De esta
manera, es posible transmitir multimedia prácticamente al mismo tiempo que se emite
despreciando un retardo entre la grabación y la realidad que siempre se encuentra presente
(por supuesto, con el objetivo de reducir al mínimo estos retardos).
Con RTP se busca entregar los paquetes que contienen datos multimedia de la manera más
rápida posible, pero es necesario para poder enviar estos que se haya establecido algún tipo
de conexión entre el emisor y el receptor del flujo multimedia. Es aquí cuando SDP entra en
acción. Este protocolo es utilizado para el establecimiento de sesiones, por las cuales se
transmitirán los datagrams de audio y video. Para ello, se pueden identificar tres
necesidades: anuncio de sesión, es decir, existe un usuario que desea establecer una conexión
con otro; la invitación a la sesión, donde el emisor envía formalmente una solicitud para
establecer la conexión; y finalmente la negociación de parámetros, donde ambos actores se
comunican estableciendo condiciones particulares para el intercambio (ya sea número de
puerto, tamaño de los paquetes, velocidad de transmisión y formato de los datos).
¿Por qué utilizar Android?
En los últimos años se ha popularizado el desarrollo de aplicaciones móviles en diversos
campos, ya sea en el desarrollo de aplicaciones para el estudio de la química del carbono
hasta los más variados juegos [21]. Y es algo que resulta más que lógico: el poder llevar
nuestra información y nuestras necesidades a cualquier lado es algo que se ha naturalizado
de forma anormal. Sin embargo, a pesar de que la informática ha realizado avances
sorprendentes en los últimos años, eso no quiere decir que resulte sencillo la programación
para este tipo de dispositivos. Los recursos con los que estos cuentan en su mayoría
continúan siendo escasos en comparación con los de una PC de escritorio o laptop, lo que
limita (al menos, hasta ahora) las posibilidades de estos. Pero incluso a pesar de esto, se ha
escogido como plataforma de desarrollo. Esto se debe a que a dos factores:
● Alta disponibilidad: Si bien alguien puede no contar con un equipo de escritorio o
portátil, es altamente probable que cuente con un dispositivo móvil o tablet que haga
14
uso de Android. Esto se debe a que prácticamente todos los grandes fabricantes de
dispositivos móviles incluyen en los suyos éste, lo que permite que se encuentre de
forma más fácil y a precios más accesibles debido a que cada uno de ellos
generalmente cuenta con tres gamas de dispositivos: gama baja, media o alta
(algunos contando con variantes intermedias, tales como la gama media-alta,
contando con prestaciones de ambas categorías), haciendo que prácticamente
cualquiera pueda hacerse con uno.
● Costo: De forma masiva, podemos identificar la existencia de dos sistemas
operativos: Android (desarrollado por Google) e iOS (desarrollado por Apple). Los
costes de adquisición del primero, si bien dependen de la gama del dispositivo,
tienden a ser menores que los del segundo. Además hay que tener en cuenta que es
necesario pagar para utilizar la plataforma de desarrollo de Apple, mientras que en
Android se puede desarrollar sin la necesidad de invertir dinero alguno.
La aplicación Android realizada para este proyecto puede ser ejecutada por cualquier
dispositivo (dentro del rango de versiones especificados), pero su principal destinatario son
aquellos denominados AndroidTV. Estos aparatos cuentan con el poder de procesamiento
necesario para actuar como un gestor de cámaras privadas y son más económicos que otros
dispositivos que cuentan con características similares, como por ejemplo, un raspberry pi. El
objetivo detrás de correr la aplicación en un dispositivo aparte de un teléfono móvil es por el
hecho de que siempre debe estar disponible para el correcto funcionamiento del sistema, es
decir con acceso a internet y encendido, estado en el que un dispositivo móvil no siempre se
encuentra.
Herramientas
A lo largo de este proyecto se han usado diversas herramientas para poder ofrecer las
funcionalidades requeridas. A continuación se comentarán éstas, junto con una breve
descripción de las mismas.
WebRTC
Como se ha comentado anteriormente, WebRTC son las siglas para Web Real Time
Communication (en español, Comunicación Web en Tiempo Real), es un framework de código
abierto que ofrece una alta calidad a la hora de establecer comunicaciones que requieren el
15
intercambio multimedia tales como las videollamadas o los chats por voz, por lo que busca
no limitarse solo a plataformas de escritorio sino también a las móviles o incluso en
dispositivos IoT intentando proveer mecanismos comunes para la interacción entre los
mismos.
Además se encuentra implementado en navegadores de amplia difusión como lo son Google
Chrome y Mozilla Firefox, buscando convertirse en un nuevo estándar en las
telecomunicaciones actuales.
GStreamer
GStreamer es un framework para la comunicación audiovisual basada en pipelines, es decir,
requiere establecer un canal para la manipulación de los datos. Se puede dotar a este
componente con múltiples comportamientos tales como la aplicación de filtros de video
(cambio de color o reconocimiento facial) y mecanismos de codificación y decodificación de
multimedia, además de operaciones sobre la misma tales como recorte, extracción de
segmentos particulares y su combinación, entre otras. La desventaja que presenta es que
ocupa más espacio si se lo compara con otro tipo de frameworks.
FFmpeg
De manera similar que GStreamer, FFmpeg [22] es un framework de código abierto capaz de
manipular contenido multimedia y altamente portable para integrar en sistemas. La
herramienta cuenta con bibliotecas que pueden ser utilizadas en aplicaciones y contienen lo
necesario para realizar la transmisión de video en tiempo real o para grabar el material de
un video en un sistema de archivos local, que como se ha mencionado en el apartado de
objetivos,estas operaciones son requeridas para el proyecto. En particular, se destaca por
soportar gran cantidad de codecs esenciales y altamente difundidos y filtros. Sin embargo, no
provee mecanismos a la hora de implementar entrada/salida (I/O) para audio y video.
Firebase
La aplicación contará con un sistema de usuarios, los cuáles para ingresar a la aplicación
requerirán de un usuario y una contraseña que ya tendrán asignados (por parte de los
administradores) al momento de utilizar la misma. Esto requiere entonces, de una base de
datos en donde almacenar y verificar los datos de autenticación, así como también la
información de sus cámaras de video. Con esto en mente, es posible lograr los objetivos
16
anteriores haciendo uso de una base de datos local o remota. La primera de las alternativas
queda descartada debido a que sería necesario contener una copia de la base de datos en
cada dispositivo para poder asegurar no solo el ingreso del usuario a sus cámaras sino la
información de estas. Esta situación solo nos deja con una alternativa: el uso de una base de
datos remota. Existen múltiples servicios que son capaces de proveer la funcionalidad
necesaria, pero en este proyecto se hará uso de Firebase, más concretamente de la
herramienta Firestore5. El mismo consiste en una base de datos no relacional [23] alojada en
servidores gestionados por Google, los cuáles permiten no solo el acceso a datos remotos,
sino que también cuentan con una gran ventaja como lo es su uso bajo condiciones de cero
conectividad. Esto quiere decir que si durante unos momentos el dispositivo no cuenta con
acceso a internet, dentro del mismo se almacena la estructura de la base de datos
perteneciente al usuario actual. Una vez que el internet vuelva a estar disponible, todas las
actualizaciones realizadas en la copia local se transmitirán al servidor de inmediato,
solucionando cualquier inconsistencia que pueda haber sido generada.
En lo que respecta a la estructura de la base de datos, Firestore organiza los datos dentro de
colecciones llamadas collections. A su vez, en el interior de las mismas se almacenarán los
llamados documents, que contendrán los atributos de los elementos que representen u otras
colecciones. Por ejemplo, para este trabajo podríamos identificar una colección de usuarios,
donde cada uno puede contar con un nombre completo, la dirección de su domicilio y un
número de teléfono, junto con una colección de cámaras, que contendrá cada una de las
cámaras que el usuario posee. Cabe recalcar que los atributos de los documentos son
representados por un único tipo primitivo: si el atributo “número de teléfono” está
representado por una cadena de caracteres, siempre esa instancia del atributo tendrá dicho
tipo.
En lo que respecta a la funcionalidad proveída por Firebase Firestore, alguna de las
utilizadas en este proyecto son:
● Observers/Listeners: Como se comentará en una futura sección, habrá situaciones
en las que ciertos eventos de la aplicación se activarán ante el cambio en un valor de
un atributo en la base de datos. Es posible desencadenar estas acciones haciendo uso
de listeners.
5 https://firebase.google.com/docs/firestore.
17
● Autenticación: Firebase incluye un sistema de autenticación basada en usuarios.
Cuándo uno ingresa a la aplicación, la base de datos guarda las credenciales del
mismo, permitiendo acceso a la aplicación sin la necesidad de estar reingresando a la
misma cada vez que se abre.
OwnCloud
Como ya se mencionó anteriormente, la aplicación deberá ser capaz de subir archivos de
video que hayan sido solicitados por el centro de monitoreo. Éstos estarán almacenados
localmente dentro del dispositivo o bien en una memoria externa, lo que implica que están
fuera del alcance de los operadores de seguridad que quieran ver el contenido grabado de
una cámara. Para lograr visualizar las grabaciones, es necesario tener algún servidor en la
nube y así compartir estos archivos con el centro de monitoreo. Es por esto que se optó por
hacer uso de la herramienta OwnCloud [24]. Este software actúa como un administrador de
archivos que se encuentra alojado en un servidor en la nube, permitiendo almacenar,
recuperar y organizar archivos de forma sencilla. Además de lo que se pueda esperar de un
servidor en la nube donde se alojarán archivos (almacenamiento, control de versiones,
cifrado), esta herramienta presenta varias ventajas, entre ellas: compartir archivos entre
grupos o usuarios de la base y la administración de los mismos, para lo cual se requieren de
credenciales (ya sea usuario y contraseña o un token de autenticación).
Si bien es vasta la funcionalidad que provee OwnCloud, sólo será de interés lo que compete
a la creación de archivos en un servidor remoto, siempre y cuando se utilicen las
credenciales correctas. Más adelante se abordará con profundidad cómo se llevó a cabo esta
tarea.
OpenCV
A fin de desarrollar el módulo de detección de objetos mencionado anteriormente, es
necesario tener la capacidad de tomar cada frame de un video para poder procesar el mismo.
Con este fin se hará uso de OpenCV, una biblioteca desarrollada para computer vision [25]. La
misma ofrece variadas funcionalidades además de la mencionada anteriormente, como
puede serlo la detección de movimiento, el reconocimiento facial y el reconocimiento de
expresiones.
18
En un futuro apartado se profundizará más en el papel de OpenCV y en las utilidades que el
mismo aportará en este proyecto.
TensorFlow
TensorFlow [26] consiste en una biblioteca desarrollada por Google utilizada en procesos de
inteligencia artificial (más concretamente en Machine Learning [27]), utilizada junto con
OpenCV en el módulo de detección de objetos propuesto en este documento. En particular
se hará uso de TensorFlow Lite, una herramienta recientemente lanzada optimizada para la
ejecución de esta herramienta en dispositivos móviles [28], plataforma a la cual se destina
este proyecto.
19
Desarrollo
En esta sección se detallarán cuestiones relacionadas con la implementación del sistema,
pudiéndose distinguir entre la aplicación Android y el sistema en el cual se integra la misma.
En principio se comentará sobre la arquitectura del sistema para luego continuar con el
desarrollo de la aplicación, elemento principal de este documento.
El sistema
Desde un punto de vista más abstracto, este sistema tendrá dos elementos centrales:
● El dispositivo Android (llamado en la imágen Android TV), el cuál tomará las
imágenes de una/s cámaras de vigilancia. El usuario manipulará los posibles cursos
de acción interactuando con la televisión a la cuál se encuentra el dispositivo
vinculado. Esta clase de elementos cuentan con un control remoto que permite
navegar dentro del sistema al usuario.
Figura 2. Diagrama de alto nivel de la arquitectura del sistema Cámaras Privadas Tandil.
20
● El centro de monitoreo, ente encargado de la visualización de las imágenes, en este
caso en particular se hace referencia al centro mantenido por la municipalidad de
Tandil.
Ambos se comunicarán mediante internet, y almacenarán datos de importancia para el
sistema dentro de una base de datos, la cuál será compartida para ambos. En la siguiente
imagen puede apreciarse su arquitectura. Como puede observarse existen seis elementos que
componen a la misma:
Figura 3. Arquitectura del sistema de CámarasPrivadasTandil.
● La aplicación Android, que contendrá el comportamiento que se ha comentado en la
sección anterior de este documento;
● El servidor OwnCloud, utilizado para el almacenamiento de los archivos de video
que hayan sido solicitados por la aplicación web;
● El componente Firebase Firestore utilizado como base de datos no relacional a lo
largo de todo el proyecto, que contendrá datos de los usuarios, sus cámaras y los
archivos filmados por las mismas;
21
● El servidor Kurento, encargado de gestionar el envío de video y la comunicación
entre el emisor y el receptor multimedia;● La cámara de video (IP Camera), elemento del cual se obtendrá toda multimedia
utilizada a lo largo de este proyecto, incluyendo imágenes y archivos de video;
● Y finalmente una aplicación web utilizada por un centro de monitoreo, principal
interesado en las imágenes obtenidas por las cámaras de los usuarios.
Cómo puede apreciarse, ambas aplicaciones harán uso de la misma base de datos para la
lectura y escritura de los datos (siendo en este caso Firebase Firestore, cómo ya se ha
comentado). Esto también implica que el servidor Kurento que utilizarán será el mismo,
representando el servidor el emisor de video y la aplicación web el receptor de este. Sin
embargo, a la hora de enviar los registros hacia la nube, se utilizará el servicio provisto por
OwnCloud para su almacenaje.
Si el centro de monitoreo desea acceder al video de alguna cámara, se iniciará una petición
desde la aplicación web. Para ello, enviará a Firestore los datos necesarios para iniciar el
proceso de visualización a una colección de alertas asociadas al dispositivo que administra la
cámara que se desea observar. La aplicación por su parte se encontrará monitoreando que se
ingresen entradas a la colección de alertas, y en caso de que esto ocurra, se verificará la
posibilidad de llevar a cabo la tarea deseada. Si la aplicación lo permite, se procederá con el
envío de video. Este procedimiento es similar si en lugar de la imágen de la cámara se
requiere una grabación: nuevamente se envía una solicitud a la colección de alertas la cual,
de ser aceptada por la aplicación, se procederá a enviar una copia del archivo al servidor
(más específicamente a OwnCloud). La única funcionalidad que podrá evocar el usuario por
su cuenta es la grabación de las cámaras, proceso que ocurre exclusivamente dentro del
dispositivo Android.
En lo que respecta a la recepción y envío de mensajes, se comentará en una futura sección
dónde se explique con mayor detalle cómo se implementó el mismo. Obviando este último
comentario, es posible continuar con el próximo punto, en donde se detallará el flujo de la
aplicación.
22
Flujo de la aplicación: Interfaz de usuario
Desde el punto de vista estructural del programa, al tratarse de una aplicación móvil,
podemos identificar en principio un componente básico: las pantallas. Dentro de las mismas,
el usuario interactúa con la aplicación a la hora de, por ejemplo, añadir una cámara o iniciar
una grabación. La pantalla que dará la bienvenida al sistema será la de ingreso. La misma se
compone de dos campos para completar: el correo electrónico utilizado por el usuario y su
contraseña. Una vez ingresados estos datos, se debe presionar el botón acceder, el cual
procederá a validar la identidad del cliente. En caso de que se haya verificado de forma
exitosa, la aplicación le permitirá continuar. De no ser así, se notificará al mismo que no se ha
podido verificar la existencia de un usuario con esas credenciales.
Dependiendo de los datos que se encuentren en el dispositivo, la pantalla que procederá al
inicio puede variar ante las siguientes condiciones:
● Si la aplicación no cuenta con un dispositivo registrado, ingresará a la pantalla de
creación de dispositivos.
● Si el usuario ya ha creado el dispositivo, se procederá al menú principal.
En todos los casos anteriores no es necesario el reingreso de las credenciales del usuario ya
que estas quedan cargadas en el dispositivo. En principio se comentará el flujo de la
aplicación siguiendo las condiciones establecidas en el primero de los puntos mencionados
anteriormente, más específicamente el caso en el que un usuario ingresa por primera vez a la
plataforma.
En ese caso no contará con ningún dispositivo asociado, por lo que deberá registrar uno.
Para ello deberá ingresar el nombre que desea darle, junto con la dirección geográfica en la
que se encuentra. Luego, al apretar el botón crear, se procederá al menú principal, dónde se
le dará la posibilidad de crear una nueva cámara para el dispositivo. El usuario deberá
escoger la opción Añadir. Esto abrirá una pantalla en la que se solicitará en primera instancia
el nombre que identificará a la cámara que se dará de alta. Si el nombre ingresado
corresponde a uno ya en uso dentro del dispositivo, se comunicará que debe de escoger otro.
De continuar con el proceso, se procederá a la pantalla de selección de IP, dónde el usuario
23
completará la dirección asociada a la cámara/NVR/DVR dentro de su red. Existen dos
posibles caminos a seguir para completar dicha información:
1) El usuario conoce la dirección, por lo que procede a colocarla en forma manual.
2) El usuario ignora la dirección, por lo que podrá hacer uso de un módulo de
descubrimiento de dispositivos6. Para hacer uso del mismo, el usuario deberá escoger
la opción Descubrir Dispositivos. La misma ejecutará una rutina que barre la subred en
la que se encuentra el dispositivo e intentará conectarse a cada uno de los 255 host de
la misma. De cada uno descubierto, obtendrá su IP y fabricante, a fin de facilitar la
identificación de cada dispositivo conectado.
Independientemente de la opción escogida se procederá a la pantalla de selección de canal,
en la que se deberá escoger uno de entre los disponibles discerniendo entre cámaras y
NVRs/DVRs. Esto es debido a que las primeras cuentan con 2 canales (generalmente uno
con menor calidad que el otro), mientras que los segundos cuentan con tantos canales como
cámaras tengan asociadas, generalmente variando entre los 16 y los 32 canales. Luego
continúa la pantalla de selección de usuario que resulta optativa, ya que el dispositivo a
asociar puede contar con credenciales. En caso de contar con ellas, deberá completar el dato
solicitado y proceder a la siguiente pantalla para colocar la contraseña.
Una vez completados todos los datos, ya posea o no credenciales, se procederá a validar la
información ingresada. Para ello, se compone la primera mitad de la dirección URL de la
cámara, pudiendo variar entre las alternativas
ó .𝑟𝑡𝑠𝑝: // < 𝑢𝑠𝑢𝑎𝑟𝑖𝑜 >: < 𝑐𝑜𝑛𝑡𝑟𝑎𝑠𝑒ñ𝑎 > @ < 𝑑𝑖𝑟𝑒𝑐𝑐𝑖ó𝑛 𝐼𝑃 > 𝑟𝑡𝑠𝑝: // < 𝑑𝑖𝑟𝑒𝑐𝑐𝑖ó𝑛 𝐼𝑃 >
Esto se realiza debido a que cada fabricante genera la URL del contenido de manera
diferente, pero en todas ellas se mantiene constante las representaciones mencionadas
anteriormente. Luego se procede a probar con cada posible terminación de entre las
cargadas en la aplicación, que son las más comunes encontradas durante el desarrollo de
este proyecto, junto con el canal provisto por el usuario. De no ser posible establecer una
conexión con ninguna de las alternativas, se mostrará una pantalla en la que se comunica al
usuario de esta situación, junto a la posibilidad de ingresar manualmente la dirección. De no
desearlo, podrá cancelar la operación retornando a la pantalla principal.
6 https://github.com/tejmagar/AndroidWiFiTools
24
Si la validación resulta exitosa, se comunica al usuario y se retorna al menú principal. Aquí
se mostrará un listado de tarjetas conteniendo todas las cámaras asociadas al dispositivo. Por
cada cámara se mostrará su nombre, un thumbnail (una pequeña captura) del video en vivo
y dos íconos que indicarán el estado de la cámara (es decir, si la cámara se encuentra
grabando o enviando video). En caso de que la tarjeta sea seleccionada, se desplegará un
pequeño menú que contendrá una serie de acciones.
● Observar video en vivo (preview): Como su propio nombre indica, al seleccionar esta
opción se podrá ver el video de la cámara en tiempo real de la cámara seleccionada.
● Ver grabaciones: En esta pantalla se mostrarán todas las grabaciones realizadas por la
cámara actual ordenadas decrecientemente por la fecha en que han sido grabadas.
● Ajustes: Aquí será posible editar la URL de la cámara, así como sus opciones de
grabación (la calidad de la imágen), y calidad de transmisión de video, junto a la
posibilidad de grabar la misma. En un apartado posterior se comentaráen más
detalle funcionalidades particulares de alguna de las opciones aquí seleccionables.
● Compartir: Este ajuste representa la comunicación entre la aplicación y el centro de
monitoreo. Su desactivación implica que este último no podrá acceder ni al video en
vivo así como a las grabaciones que el dispositivo contenga. En el caso contrario, será
posible solicitar ambos.
En el caso de que el usuario ingrese a la aplicación ya contando con un dispositivo creado, se
procederá a la pantalla principal, dónde podrá dar de alta las cámaras siguiendo el flujo
comentado con anterioridad.
El enfoque de este flujo es que sea lo más directo posible, es decir, no intentar de incorporar
toda la funcionalidad en un mismo lugar sino distribuirla a lo largo de la aplicación y guiar
así al usuario de forma más intuitiva. Dado que esta aplicación será principalmente utilizada
por los llamados AndroidTv, se descartó la idea de un menú y se optó por el uso de botones
para una experiencia más cómoda, ya que se debe utilizar control remoto para la
navegación, siempre con la posibilidad de volver hacia atrás entre pantallas.
25
26
Figura 4. Flujo de la aplicación CámarasPrivadasTandil.
Estructuras de datos utilizadas
En este proyecto fueron implementadas un conjunto de entidades que representan los
elementos más importantes de esta aplicación. Estos además contarán con sus propias
entradas en la base de datos de Firebase Firestore (en este caso en particular, colecciones),
por lo que resulta de vital importancia definir los mismos.
Cámara
Este componente es fundamental para la aplicación, ya que todo gira en torno a las cámaras.
A través de este se puede interactuar con ellas, siempre y cuando estén al alcance.
Representa un conjunto de ajustes, propiedades y estados que tendrán las cámaras.
● Entre los ajustes se pueden mencionar: la capacidad de grabar; la cantidad de horas a
grabar; qué codificador utilizar; la calidad de grabación; la calidad de transmisión de
video; y también si se desea sincronizar los archivos de video automáticamente con
la nube.
● Una cámara consta de: un nombre para identificarlas; una uri, esencial para acceder a
la cámara dentro de una red; un identificador que se crea desde la base de datos; el
tipo de cámara, que al estar asociadas a un dispositivo, todas serán del tipo privado;
una dirección física para ubicar esa cámara en una localidad; una fecha que
representa la última conexión con el sistema; y finalmente un nombre interno,
utilizado principalmente por el centro de monitoreo para una rápida búsqueda de
esta.
● Lo más importante de este componente para la aplicación son los estados, ya que
estos permiten informar al usuario que está sucediendo con la cámara. Son cuatro los
estados que puede poseer: si se encuentra disponible, es decir si se encuentra
encendida o es alcanzada por la red; si está grabando; si está transmitiendo video
hacia el centro de monitoreo; y si está siendo compartida, es decir, si se desea
permitir el acceso la cámara por centro de vigilancia. Éste es el estado que más
restringe la funcionalidad del dispositivo, ya que si no se desea compartir la cámara,
toda la interacción con el centro de monitoreo va a estar inhabilitada. Sin embargo la
27
grabación y la vista previa de la cámara pueden realizarse sin ningún inconveniente
permitiendo así al usuario gestionar sus cámaras de manera local. Si la cámara está
siendo compartida, la gestión local no se verá afectada y el centro de monitoreo
podrá solicitar una transmisión de la cámara en tiempo real o un video grabado, si es
que posee alguno.
Archivos de video
Estas estructuras contendrán información de los archivos que serán subidos al servidor en la
nube para su reproducción por parte del centro de monitoreo. De estos se tendrá el nombre,
su duración en segundos, el peso o espacio ocupado en el almacenamiento en megabytes
(MB) y un estado. El mismo representará la situación de un archivo en tiempo real. Si un
archivo, por ejemplo se encuentra disponible, el centro de monitoreo lo sabrá por este
campo.
Dispositivos
Finalmente, podemos definir la estructura de datos utilizada para los dispositivos. Los
mismos como ya se explicó con anterioridad contienen en su interior el conjunto de cámaras
asociadas al mismo, pero además cuentan con un nombre (utilizado para distinguir los
dispositivos del usuario), la versión de software que están corriendo, la fecha y hora de la
última conexión y una dirección, la cual contendrá la dirección del domicilio dónde se
encuentra el aparato.
Proceso de implementación
Cuándo se inició el proyecto, se evaluaron diferentes alternativas para manipular
multimedia. En principio, surgieron dos posibles: GStreamer y FFmpeg. Ambas ofrecen la
funcionalidad requerida mediante la ejecución de comandos contando cada uno con su
sintaxis particular, pero había una sutil diferencia que guió la elección: el soporte oficial. La
biblioteca de GStreamer cuenta con mantenimiento de sus desarrolladores (situación que
garantiza su estabilidad presente y futura), mientras que los proyectos de FFmpeg en
Android son desarrollados por comunidades de usuarios ajenas a los desarrolladores. Esto
llevó a que se considerase GStreamer como motor del proyecto.
28
Esta biblioteca, si bien está dirigida para sistemas Android, utiliza código nativo escrito en C
y C + +. Esto hizo que fuese necesario investigar sobre un conjunto de herramientas que
dispone Android llamada NDK por sus siglas en inglés Native Development Kit [29], dentro
de la que se encuentra JNI (Java Native Interface) que permite la utilización de código nativo
en Java mediante la compilación del mismo siguiendo una serie de pasos:
1) Se deben definir dos archivos llamados Android.mk y Aplication.mk. En el primero
de estos se especifica dónde se encuentran alojados los recursos de la biblioteca que
se quiere utilizar (en este caso, GStreamer); mientras que el segundo contiene
información de configuración, como la arquitectura del sistema destino y versión del
compilador nativo utilizado.
2) Se debe especificar, dentro de la clase Java que haga uso del código nativo, la
biblioteca utilizada y los métodos que se utilizarán definiéndose con la palabra
reservada native.
Una vez que se cuenta con ambos requisitos, se procede a compilar el código fuente escrito
en C para que el mismo pueda ser invocado y ejecutado en código Java. Ahora bien, este
código no podrá ser utilizado en cualquier segmento de código, sino que exclusivamente
puede ser ejecutada por la clase que se especifica dentro del código nativo y defina en su
interior los métodos nativos. ¿Qué quiere decir esto? JNI obliga a nombrar los métodos
nativos bajo el formato Java_<paquete>_<nombre de método>, siendo el paquete la jerarquía de
carpetas donde se encuentra la clase que ejecutará los métodos. Por ejemplo, si se quiere
invocar el método nativo “Ejemplo” en una clase que se encuentra dentro de las carpetas
/com/example/project/, en C (o C++) se deberá escribir una función que tenga por nombre
Java_com_example_project_Ejemplo. A su vez, dentro de Ejemplo se deberá definir como
método nativo <Modificador privacidad> native <Tipo de retorno> Ejemplo(<Parámetros>). Es por
esta razón que se decidió generar una clase que contenga en su interior todas las definiciones
necesarias para el funcionamiento de la aplicación. La misma fue llamada
MultimediaManager, ya que será la encargada de administrar cualquier operación multimedia
llevada a cabo.
Al tener en claro la necesidad de una clase para utilizar el código nativo, se procedió a
evaluar cómo realizar las tareas requeridas dentro de este. Primero, se implementó el
comando necesario para el envío de video. En este caso se utilizó un software provisto por
29
Kurento para realizar las pruebas pertinentes7. En ella se establece un puerto RTP al cual se
debe enviar el video. Anteriormente se comentó que ambas bibliotecas hacen uso decomandos para la gestión de multimedia, por lo que el problema se reduce a encontrar un
comando que sea capaz de tomar una fuente de video y la envíe a la aplicación web en el
puerto negociado. Dado que se desea enviar video, podemos identificar dos componentes
clave sin la necesidad de mencionar cuestiones relacionadas con la sintaxis del mismo:
1) Una fuente de video que será enviada a través de la red.
2) Si se desea transportar paquetes a través de la internet, es necesario especificar un
destino mediante una dirección IP por ejemplo.
Teniendo en cuenta lo anterior, el comando utilizado para realizar esta tarea puede
encontrarse a continuación.
uridecodebin uri=<URL de la cámara> ! videoconvert ! videoscale !
video/x-raw,width=426,height=240 ! x264enc tune=zerolatency bitrate=150 !
rtph264pay !
application/x-rtp,media=(string)video,payload=(int)103,encoding-name=(string)H264
! udpsink sync=false host=<IP del servidor> port=<Nro. Puerto>
Comando GStreamer utilizado para el envío de video.
El mismo toma como entrada una fuente de video utilizando un elemento llamado
uridecodebin el cuál toma el video de la fuente y un decodificador acorde al tipo de media que
posee la fuente. Luego se modifica la resolución del video haciendo uso de los elementos
videoconvert y videoscale, afectando cada frame (fotograma) decodificado. La resolución
escogida es de 426x240, ya que se buscó que el uso de banda ancha sea lo más bajo posible.
El video en estas instancias se encuentra en estado raw (es decir, solo con sus datos sin
formato) que posee la totalidad de la información de cada fotograma, por lo que en principio
no puede ser reproducido . Es por esto que para permitir que pueda ser utilizado por un
reproductor multimedia, se codificó con el elemento x264enc comprimiendo datos en el
formato H264 [30], uno de los más difundidos por la internet y las aplicaciones multimedia,
junto a algunas opciones que también ayudarían a reducir el tamaño de los paquetes
codificados logrando así que la transmisión de video sea en “tiempo real”. Ahora bien, como
se convierte el video a este formato, es necesario que los paquetes sean enviados con formato
H264, lo que se logra utilizando el elemento rtph264pay. Consecuentemente, se debe
7 https://doc-kurento.readthedocs.io/en/stable/tutorials/java/tutorial-rtp-receiver.html
30
especificar otras características de los paquetes como la carga por paquete y el tipo de datos
que se está enviando. Finalmente, se procede a especificar la dirección IP y puerto de destino
del video utilizando udpsink. Además de esto, puede verse que se especifica junto con estos
dos campos un tercero llamado sync. Este permite que, en caso de que se corte la
conectividad con el video, al reanudarse lo haga en el momento actual y que no recupere los
frames perdidos por la carencia de conectividad.
Luego de haber logrado enviar video desde el dispositivo android de forma satisfactoria, se
procedió a implementar la funcionalidad requerida para la reproducción por parte de la
aplicación del video filmado por las cámaras. Esto se hizo con el fin de que los usuarios
pudieran ver, si es que así lo desean, el video de las cámaras siempre que quieran de forma
fácil y rápida. Para esto, nuevamente se hizo uso de un comando GStreamer. El mismo,
puede encontrarse a continuación.
uridecodebin uri=<URL de la cámara> ! videoconvert ! videoscale !
video/x-raw,width=1280,height=720 ! autovideosink sync=false
Comando GStreamer utilizado para la reproducción de video.
Como es apreciable, existen en este nuevo comando elementos que fueron utilizados en el
primero mostrado en este documento, elementos como uridecodebin, videoconvert y videoscale,
con una única diferencia en la resolución del video: en esta ocasión se utilizará una
resolución de 1280x720p. El único elemento que no ha sido utilizado con anterioridad es
autovideosink, el cual se encarga de establecer de forma automática el destino de toda la
multimedia asociada a la dirección que se especifica. En este caso, se tiene como objetivo
observar el video en una superficie definida dentro de una pantalla. La opción sync continúa
presentando el mismo comportamiento que el especificado en udpsink, situación que denota
que ambos componentes forman parte de una misma familia: mientras que este último tiene
como finalidad establecer el destino del video a través de la red, autovideoskink lo hará de
forma automática (para este caso, en una superficie).
Finalmente se utilizó un comando para almacenar archivos de video en disco tomando como
fuente de entrada un flujo de video desde la red. El objetivo de la grabación local es que la
calidad sea la mayor posible, ya que los videos son la evidencia necesaria en caso de ocurrir
algún siniestro el cual nadie pudo presenciar más que la cámara. Para ello se toma el registro
31
de la cámara utilizando nuevamente la URL asociada a la misma y se graba en formato mp4.
El siguiente fragmento de código muestra el comando utilizado para realizar esta tarea.
uridecodebin uri=<URL de la cámara> ! queue ! videoconvert ! x264enc ! mpegtsmux
! hlssink target-duration=<Tiempo de grabación>
location=<Ubicación de escritura + "/" + Nombre de la cámara + /%05d.mp4>
playlist-location=<Ubicación de escritura + "/" + Nombre de la cámara +
/playlist.m3u8> max-files=<Cantidad de archivos>
Comando GStreamer utilizado para la grabación de video.
Al igual que en el caso anterior, aparecen elementos ya utilizados como uridecodebin,
videoconvert y x264enc. Por otra parte, surgen nuevos elementos. Queue se usa para
descomponer la entrada en diferentes buffers, ya que el proceso de grabación es lento por el
hecho de estar escribiendo en disco. Es por esto que se busca paralelizar lo mayor posible la
entrada y, a medida que se van grabando los fragmentos, se liberen los buffers. El otro
componente introducido en este comando es mpegtsmux, encargado de tomar varios streams
generados por el elemento descrito anteriormente y hacer un stream de transporte MPEG, el
cual define la manera en que se transportan los datos de video. Por último está el
componente que indica cómo se desea almacenar en disco los archivos generados, el hlssink.
Dado que la cámara graba en forma continua, por lo que en principio se contaría con una
fuente infinita de video, se debe especificar un tiempo de grabación para generar fragmentos
de este. En este proyecto se grabarán archivos de 5 minutos máximo, ya que se espera que
los mismos sean lo suficientemente pequeños como para poder envíarse con facilidad a la
nube sin consumir demasiados recursos de red. También se provee una cantidad de archivos
que se deseen grabar para no abarcar todo el espacio disponible en almacenamiento, y en
caso de que se llegue al límite, se irán reemplazando los videos más antiguos con los más
nuevos. Finalmente se indican las ubicaciones de los archivos junto a la lista de reproducción
que se genera automáticamente.
Resultados y pruebas preliminares
Con los comandos anteriores en principio se pudo obtener un prototipo funcional de la
aplicación, por lo que se pudo iniciar con la prueba de la misma para verificar que todo
funcione de manera correcta y eficiente. Sin embargo, se obtuvieron resultados poco
alentadores. Se notó un gran consumo de recursos por parte del dispositivo, sobre todo en el
proceso de grabación: uso de memoria por encima de 1 GB; uso del procesador casi al cien
por ciento; y un consumo de energía muy elevado. En el caso particular de las grabaciones,
32
el elemento hlssink presente en el comando no está optimizado para dispositivos móviles lo
que implica una ejecución demasiado exigente, situación que atenta contra uno de los
objetivos centrales de este proyecto. En el caso de la transmisión de video era evidente un
retraso acumulativo a medida que avanzaba en el tiempo, es decir que cuándo se presentaba
un problema de conexión, el video no avanzaba hacia el momento actual sino que mostrabalas imágenes desde que ocurrió el error perjudicando el requisito de realizar envíos en
tiempo real. Además, al mantener una sesión abierta por un tiempo prolongado, era mucho
más probable que esto ocurriese.
Por los motivos expuestos en el párrafo anterior se optó por abandonar el uso de GStreamer
en los procesos de grabación y envío de video, y utilizar la alternativa no escogida en los
inicios del proyecto, es decir, FFmpeg. Sin embargo, de ser necesario un potente
manipulador de multimedia, GStreamer sería la opción ideal para realizar el trabajo debido
a la amplia variedad de operaciones que soporta. Además este último no ha sido descartado
por completo, sino que continuará siendo utilizado a la hora de mostrar el video en vivo en
la aplicación. Esto se debe a que para la reproducción no hace uso de ningún codec, además
de permitir su integración de forma nativa con los componentes de interfaz provistos por
Android, algo con lo que FFmpeg no cuenta.
En las próximas líneas se explicarán los comandos utilizados para realizar cada una de las
tareas requeridas, evaluando si fué o no suficiente para lograr un uso eficiente de los
recursos del dispositivo.
Implementación mediante FFmpeg
FFmpeg a pesar de no contar con el soporte oficial de sus desarrolladores para su uso en
dispositivos móviles, cuenta con implementaciones por parte de la comunidad de usuarios
(situación ya expuesta en una sección anterior). Para este proyecto se hará uso de la
biblioteca FFmpegKit8 la cual implementa tanto FFmpeg (para manipulación de video) como
FFprobe (utilizado para la obtención de información de archivos multimedia o streamings).
En un principio se utilizaron ambos, pero por razones que se expondrán en siguientes líneas,
se determinó utilizar sólo el primero de los elementos. En lo que respecta a su adición en el
código, no es necesaria la utilización de JNI para su inclusión, ya que se encuentra contenida
8 https://github.com/tanersener/ffmpeg-kit
33
dentro de gestores de dependencias, lo que hace que sea más fácil de utilizar. Esta
herramienta tiene las siguientes características:
● Su funcionamiento radica en el uso de sesiones: cada comando que se ejecuta en el
sistema tiene asociada una sesión. Al finalizar la ejecución del comando, la sesión
finaliza.
● La ejecución de los comandos puede ser síncrona o asíncrona. Dado que las primeras
bloquean la interfaz de usuario (situación que hay que evitar en todo momento al
programar soluciones móviles), se hará uso de las segundas.
● Implementa callbacks para el final de ejecución. Esto resultará de suma importancia
ya que se podrán llevar a cabo acciones para mantener la consistencia en la
aplicación, como por ejemplo, la actualización de los estados de una cámara al
finalizar el proceso de streaming.
Con esto en mente, daremos paso a la explicación de los comandos utilizados. Al igual que
en la sección anterior, se iniciará comentando sobre el comando utilizado para el envío de
video. Para ello, fueron implementados dos comandos diferentes, donde la única diferencia
radica en el protocolo de transporte utilizado, es decir, TCP [31] y UDP [32]. En principio se
hace uso de la segunda opción, sin embargo, existen casos en los que por motivos de
configuración no se procede con la ejecución del comando y es necesario utilizar un canal de
conexión mediante TCP. Para lograr esto, se hizo uso de los callbacks mencionados
anteriormente, dónde ante la falla del comando UDP, se procede a ejecutar el segundo. A
continuación pueden observarse ambos.
-re -i <URL de la cámara> -an -c:v <Formato de encoding> -tune zerolatency
-preset superfast -payload_type 103 -f rtp rtp://<URL del servidor>:<Puerto de
escucha>
Comando FFmpeg utilizado para el envío de video (transporte UDP).
-rtsp_transport tcp -re -i <URL de la cámara> -an -c:v <Formato de encoding>
-tune zerolatency -preset superfast -payload_type 103 -f rtp rtp://<URL del
servidor>:<Puerto de escucha>
Comando FFmpeg utilizado para el envío de video (transporte TCP).
34
Comencemos definiendo los elementos utilizados en los comandos de izquierda a derecha.
Dado que ambos son idénticos con la única diferencia en las primeras líneas, utilizaremos el
segundo para la explicación. La opción -rtsp_transport es utilizada, como su nombre indica,
para especificar el tipo de transporte utilizado por el protocolo RTSP, el cuál será en ese caso
TCP. En el primero no se especifica ya que la opción por defecto es UDP. Luego, -re es
utilizado para especificar que se leerá multimedia en tiempo real, seguido de -i abreviatura
de input (entrada en inglés), donde a continuación se colocará el origen del video. Dado que
se utiliza la dirección de la cámara para acceder a su contenido, será este valor quién
continuará a dicho elemento. Dado que se desea enviar solo video, la opción -an descarta los
datos de audio (en caso de encontrarse). El elemento -c es utilizado para especificar el codec o
formato de codificación de un elemento multimedia, pero dado que es de importancia
exclusivamente el video, se especifica dicho tipo mediante :v. De esta manera, -c:v representa
el tipo de codec para video. Existen tres diferentes tipos de encoding que podrán ser
utilizados y configurados por los usuarios de la aplicación:
● Copy consiste en copiar el formato con el cual se obtiene el video. Por ejemplo, si este
se encuentra en formato H.264 al ser leído, el stream será enviado en dicho formato.
La ventaja que presenta es que no se utilizan recursos extra para su conversión, lo
que evita un exceso en el procesamiento en el dispositivo.
● El otro tipo de encoding es H.264 o Advanced Video Encoding, que se obtiene
utilizando el elemento libx264. Este es uno de los formatos estándar más difundidos
en la actualidad para la compresión de video. La desventaja de este (y de cualquier
otro formato que no sea obtenido por copy) consiste en que es necesario que el
procesador transforme los paquetes de un formato a otro, haciendo uso de CPU y
memoria extra. Esto a su vez dependerá del tipo de sistema que ejecute la aplicación,
ya que existen dispositivos que cuentan con soporte para realizar las conversiones de
forma más eficiente.
● Finalmente la tercera opción que se podrá seleccionar será, mediante el uso de
libx265, H.265 (también conocido como High Efficient Video Coding) que es el sucesor
del formato anteriormente mencionado. La ventaja que presenta este frente a su
antecesor es que posee mayores niveles de compresión a medida que la resolución
del video se incrementa, situación cada vez más común en la tecnología moderna.
35
Además presenta un ahorro del bitrate9 de entre el 25% y 50% comparado con el
presentado en la biblioteca anterior, manteniendo la misma calidad visual10. Sin
embargo, continúa presentando la misma desventaja que H.264, con el agravante de
que solo se encuentra optimizado en dispositivos más modernos, por lo que no es
recomendable utilizar este bajo sistemas más antiguos o de bajo rendimiento.
Relacionado con este apartado se encuentran los elementos -tune y -preset. El primero
permite modificar la configuración del proceso de encoding según la entrada, en este caso el
video de la cámara, utilizando zerolatency ya que permite un rápido proceso de encoding y
un video de baja latencia, fundamental para lograr los objetivos planteados en este proyecto;
mientras que el segundo es utilizado para proveer determinadas velocidades de encoding y
tazas de compresión, para lo cual se utilizará la opción superfast, siendo la más rápida, solo
detrás de ultrafast. Finalmente, las últimas opciones son similares a las especificadas en el
comando GStreamer utilizado originalmente: -payload_type denota el tipo de datos que se
enviará a través de la red (nuevamente con el valor 10311); y -f utilizado para forzar el
formato del video en la salida, que sería en este caso el destino del video representado por la
URL del servidor y el puerto en el cual

Continuar navegando