Informe sobre la Incrustación de Video IP

1. Introducción

El cliente nos solicitó incrustar la transmisión de una cámara ip/NVR de seguridad en un reproductor de video dentro de una página web, con el fin de que esta pudiera ser visualizada por el público general. Este proceso debe replicarse en varias oficinas, permitiendo a todos los usuarios acceder a la transmisión de forma simultánea y sin complicaciones.

Para cumplir con este requerimiento, fue necesario explorar soluciones que permitieran la transmisión de video de manera eficiente y accesible a través de internet. Después de analizar diferentes opciones, se decidió utilizar el formato HLS (HTTP Live Streaming), que es compatible con la mayoría de los navegadores y permite una transmisión fluida. El proceso incluye la conversión de la señal de la cámara en formato RTSP a HLS mediante el uso de FFmpeg, y la distribución del stream a través de un servidor web con soporte para conexiones seguras.

2. Descripción del Proceso

El sistema se basa en varios componentes, que incluyen:

Flujo del Proceso

A continuación, se presenta el diagrama del flujo del proceso, desde la cámara ip/NVR hasta la visualización en internet:

graph LR A[Camara IP] -->|RTSP| B[Transcoder FFMPEG] subgraph Docker direction TB B[Transcoder FFMPEG] -->|HLS: .ts y .m3u8| C[Servidor Web] C <--> D[Certbot] end C --> E[Internet] D--> E

3. Implementación Técnica

Los siguientes son los pasos clave para la implementación de esta solución:

  1. Configurar la cámara IP: Asegurarse de que la cámara IP esté transmitiendo en el protocolo RTSP. Este protocolo será utilizado por FFmpeg para recibir el video.
  2. Opcional: Utilizar Docker para optimizar la implementación. Es posible crear un contenedor Docker que ejecute tanto FFmpeg como Nginx para simplificar y estandarizar la implementación en las diferentes oficinas.
  3. Instalar FFmpeg en Windows:

    FFmpeg no se instala en Windows mediante un instalador tradicional, sino como una librería de archivos. Para instalar FFmpeg, sigue estos pasos:

  4. Instalar Nginx y Certbot:
  5. Utilizar FFmpeg para recibir el stream RTSP y convertirlo a HLS:
    ffmpeg -i "rtsp://admin:Dekra.2024@10.198.56.20:554/cam/realmonitor?channel=3&subtype=1" -c:a aac -b:a 160000 -ac 2 -s 854x480 -c:v libx264 -b:v 800000 -hls_time 10 -hls_list_size 10 -hls_flags delete_segments -start_number 1 /mystream.m3u8
            

    Explicación del comando:

  6. Configurar Nginx para servir el archivo HLS: Configurar Nginx o Apache para servir el archivo .m3u8 y los segmentos .ts generados por FFmpeg.
  7. Usar Certbot para habilitar HTTPS: Obtener el certificado SSL utilizando Certbot y configurarlo en Nginx para servir el contenido de manera segura.
  8. HTML de prueba para incrustar HLS en una página web: Utilizar el siguiente código HTML para probar la incrustación del stream HLS en un reproductor de video en la web:
  9. <!DOCTYPE html>
    <html>
    <head>
        <title>Live Cam</title>
        <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
    </head>
    <body>
        <h1>HOLA</h1>
        <video id="video" autoplay="true" controls="controls"></video>
        <script>
            if (Hls.isSupported()) {
                var video = document.getElementById('video');
                var hls = new Hls();
                hls.attachMedia(video);
                hls.on(Hls.Events.MEDIA_ATTACHED, function () {
                    console.log("Video and HLS.js are now bound together!");
                    hls.loadSource("mystream.m3u8");
                    hls.on(Hls.Events.MANIFEST_PARSED, function (event, data) {
                        console.log("Manifest loaded, found " + data.levels.length + " quality level(s)");
                    });
                });
            }
        </script>
    </body>
    </html>
        

4. Implementación en la nube

El proceso descrito también puede ser implementado en la nube. Para ello, basta con hacer público el stream RTSP directo desde el NVR (grabador de video en red). Esto permite que el stream de video pueda ser accedido desde cualquier parte, sin necesidad de alojar los componentes en servidores locales en cada oficina.

Los pasos para implementar esta solución en la nube son similares, pero en lugar de utilizar servidores locales con Docker y FFmpeg, se puede configurar un servidor en la nube para gestionar la conversión de RTSP a HLS, y servir los archivos mediante un servidor web. Además, se puede seguir utilizando Certbot para asegurar la conexión con HTTPS.

5. Conclusión

Este sistema permite la incrustación y distribución de un stream de video de cámaras IP en múltiples oficinas de manera eficiente, utilizando tecnologías estándar como RTSP, HLS y HTTPS para garantizar la seguridad y calidad de la transmisión. La solución también es escalable a la nube, lo que ofrece una mayor flexibilidad y accesibilidad para la transmisión pública del video.

Con el uso de Docker, FFmpeg y un servidor web como Nginx o Apache, es posible estandarizar la implementación y facilitar el despliegue en cada oficina. Al mismo tiempo, Certbot asegura que las conexiones sean seguras mediante el uso de certificados SSL.