🚧RTMP-HLS server

Para la práctica usaremos un servidor ubuntu con docker y crearemos un servidor de streaming en directo de vídeos con el objetivo de aprender el funcionamiento del protocolo RTMP y asentar los conocimiento sobre códecs y multimedia.

Protocolo RTMP

RTMP (Real-Time Messaging Protocol) es un protocolo desarrollado originalmente por Adobe para transmitir audio, video y datos entre un servidor y un cliente. Aunque nació para Flash, todavía se usa muchísimo, especialmente para la transmisión en vivo (streaming), por ejemplo, cuando alguien hace un directo en Twitch, YouTube o Facebook Live. RTMP trabaja principalmente en tres pasos:

1. Captura y codificación

Primero, el contenido (video y audio) es capturado desde una cámara o micrófono. Luego, un programa de codificación como VLC u OBS (Open Broadcaster Software) convierte ese contenido en un formato digital comprimido que RTMP puede transmitir.

2. Transmisión desde el cliente al servidor

El codificador se conecta a un servidor RTMP (contenedor de docker, nginx con el módulo RTMP, Wowza, etc.). Ahí comienza a enviar el flujo de datos en tiempo real a través del protocolo RTMP usando una URL como:

rtmp://servidor.com/live/streamkey
Diagrama de funcionamiento

3. Distribución a los espectadores

El servidor recibe ese flujo y lo puede:

  • retransmitir a otras plataformas (como YouTube Live)

  • convertirlo a HLS o DASH, que sí son compatibles con navegadores y reproductores modernos.

Visto esto, vayamos con la práctica!


RTMP-HLS en contenedor Docker

Instalación

Obviamente para la instalación requieres tener instalado docker, si no lo tienes aún revísate esta guía.

Para instalar el contenedor simplemente descarga y activa la imagen de docker hub :

docker run -d -p 1935:1935 -p 8080:8080 alqutami/rtmp-hls

En la documentación del hub puedes ver que también tienes la opción de descargar la imagen con alpine y una con el archivo de configuración de nginx personalizable.

Este contenedor viene con varios reproductores web ya instalados (basados en video.js y hls.js) dentro de/usr/local/nginx/html/players.

Configuración de multimedia

Antes de empezar, deberemos tener en cuenta que el formato de salida FLV del comando para el contenedor solo es compatible con los siguientes códecs de vídeo:

  • H.264 (AVC o MPEG-4)

  • VP6

  • Sorenson Spark

  • H.263

En el caso de usar otro códec de vídeo puedes tener un error tal que este:

Error de compatibilidad con códec

Para evitar este error, primeramente observa que códec de vídeo tiene el video descargado con:

ffmpeg -i <video>
Obsérvalo en la línea marcada

Y luego, conviértelo:

ffmpeg -i <video_input> -vcodec libx264 <video_output>

Una vez tenemos el vídeo disponible, como ya hemos visto antes, deberemos enviar el flujo multimedia, para ello enviaremos el archivo con ffmpeg al formato de salida flv dentro del servidor.

ffmpeg -re \                                     
    -stream_loop -1 \
    -i falloutintro_264.mp4 \
    -c:v copy  \
    -r 24 -g 24 \
    -preset superfast \
    -tune zerolatency \
    -f flv rtmp://localhost:1935/live/<clave>

Explicación de los parámetros utilizados:

  • -re: Indica a ffmpeg que lea la entrada a velocidad de reproducción en tiempo real.

  • -stream_loop -1: continuará haciendo un bucle del archivo una vez que el flujo alcance el final. Si obvias este parámetro o lo pones a 0, el video se reproducirá una sola vez.

  • -i /ruta/al/archivo_de_video.mp4: Especifica la ruta al archivo de video que deseas transmitir.

  • -c:v libx264 -preset veryfast -tune zerolatency -pix_fmt yuv420p: Configuración de video para codificar utilizando el códec H.264 con ajustes rápidos para baja latencia y formato de píxeles yuv420p.

  • -c:a aac -ar 44100 -ac 2: Configuración de audio para codificar utilizando el códec AAC con frecuencia de muestreo de 44100 Hz y 2 canales de audio.

  • -f flv: Especifica el formato de salida como FLV (Flash Video), que es compatible con la transmisión RTMP.

  • rtmp://localhost:1935/live/<clave>: URL del servidor RTMP donde se enviará el flujo de video/audio. Para la <clave> invéntate un nombre como identificación.

Por ejemplo:

ffmpeg -re \                                     
    -stream_loop -1 \
    -i falloutintro_264.mp4 \
    -c:v copy  \
    -r 24 -g 24 \
    -preset superfast \
    -tune zerolatency \
    -f flv rtmp://localhost:1935/live/test

Streaming con VLC

Instala VLC en tu ordenador host desde la web oficial.

Una vez instalado, accede a Medio> Abrir ubicación de red

La URL que deberás poner será la siguiente:

rtmp://192.168.32.182:1935/live/test
El vídeo se reproducirá en bucle y podrás pararlo cuando quieras pero no adelantarlo ni atrasarlo.

Adicionalmente, para revisar información sobre usuarios conectados en streaming:

http://<TuIP>:8080/stats
En la página puedes revisar quienes están conectados al streaming

🚧 Streaming con web player

(...)

To view the stream

  • Using provided web players: The provided demo players assume the stream-key is called test and the player is opened in localhost.

    • To play RTMP content (requires Flash): http://localhost:8080/players/rtmp.html

    • To play HLS content: http://localhost:8080/players/hls.html

    • To play HLS content using hls.js library: http://localhost:8080/players/hls_hlsjs.html

    • To play DASH content: http://localhost:8080/players/dash.html

    • To play RTMP and HLS contents on the same page: http://localhost:8080/players/rtmp_hls.html


🚧 REVISAR DE HACER CON MEDIAMTX


HLS sobre Apache

A nivel usuario (streamer): Open Broadcaster Studio / OBS

  1. Multiplataforma y muy potente

  2. Captura fuentes de video y audio en tiempo real, compone escenas y añade filtros

  3. Codifica ( x264 ) , graba y retransmite (RTMP)

  4. Se conecta con plataformas de streaming (youtube, vimeo, twitch, etc)

A nivel de infraestructura:

  1. Uso de ffmpeg con protocolos de streaming

  2. Tu biblioteca de Audio y Video en Internet (Ampache )

  3. Uso de plataforma web para streaming:

    1. Uso de HLS (crear listas m3u8 ) y ver con cliente (p.ej. VLC)

    2. Uso de reproductor HLS (con javascript)

A nivel CDN (IaaS): por ejemplo con CloudFare / ¿ Qué es ?

  1. Almacena

  2. Codifica

  3. Reproduce

!!!

Instalar un servicio de streaming


Webgrafía

Última actualización