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.
El sistema se basa en varios componentes, que incluyen:
A continuación, se presenta el diagrama del flujo del proceso, desde la cámara ip/NVR hasta la visualización en internet:
Los siguientes son los pasos clave para la implementación de esta solución:
FFmpeg no se instala en Windows mediante un instalador tradicional, sino como una librería de archivos. Para instalar FFmpeg, sigue estos pasos:
C:\ffmpeg).
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:
-i "rtsp://admin:Dekra.2024@10.198.56.20:554/cam/realmonitor?channel=3&subtype=1": Este es el stream RTSP de la cámara IP.-c:a aac: Indica que el audio se codificará usando el codec AAC.-b:a 160000: Define la tasa de bits para el audio en 160 kbps.-ac 2: Especifica que se utilizarán dos canales de audio (estéreo).-s 854x480: Define la resolución de video como 854x480 píxeles.-c:v libx264: El codec H.264 para video.-b:v 800000: La tasa de bits del video en 800 kbps.-hls_time 10: Segmenta el video en fragmentos de 10 segundos.-hls_list_size 10: Mantiene una lista de reproducción de hasta 10 segmentos.-hls_flags delete_segments: Elimina automáticamente los segmentos antiguos.-start_number 1: Inicia la numeración de segmentos desde 1./mystream.m3u8: Archivo de salida HLS.
<!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>
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.
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.