RTMP: Servidor streaming video en docker

Cuando estás emitiendo en live en youtube, te estás conectando a un servidor rtmp. Guardando las distancias en términos de potencia de calculo, podemos hacer lo mismo con nuestro mini servidor.

Yo estoy usando este sistema para retransmitir eventos religiosos en mi pueblo a las 2 televisiones locales por cable. Internet es bastante inconstante en este pueblo así que si transmito directamente a youtube y ellos se conectan allí, suele ocurrir que se pare la live cada dos por tres con malo resultados en las TVs.

Así que la idea ha sido la de poner 2 raspberryPi con un server nginx-rtmp y yo con obs me conecto a uno de los dos server rtmp, y luego reinvio por medio de ffmpeg al otro server rtmp, a youtube, a twitch y a la radio web.

Y las dos empresas de TVs se conectan directamente a su servidor asignado que se encuentra en el pueblo, así que internet es muy rápida y no hay lags ni interrupciones.

Pero tu puedes usar el mismo sistema para tener tu propio servidor de streaming para usarlo en casa o en caso de calamidad, tener tu propria cadena de televisión para compartirla con la gente.
En este caso Será de baja resolución, pero si pensamos que hace solo 20 años casi todas las TV eran a 240p, creo que en caso de necesidad podemos volver hacer lo mismo.

De todas formas así como lo vamos a configurar la resolcución de salida va a ser la misma de entrada. O sea que si le pones una peliculas a 1080p, esta sará la resolución de salida.

Doy por descontados que el server rtmp va a estar montando en un contenedor de docker con raspberrypi4 en RaspbianOS Buster, traefick, portainer y que la IP del servidor el 192.168.0.22.

Conectate por ssh al server y dale:

cd /opt
git clone https://github.com/alfg/docker-nginx-rtmp.git
cd docker-nginx-rtmp
mv nginx.conf nginx.conf.orig
mcedit nginx.conf

y pega en el nuevo nginx.conf esto:

daemon off;
error_log /dev/stdout info;
events {
    worker_connections 1024;
}
    rtmp {
            server {
                    listen 1935;
                    allow play all;
                    #creates our "live" full-resolution HLS videostream from our incoming encoder stream and tells where to put the HLS video manifest and video fragments
                    application live {
                            allow play all;
                            live on;
                            #record all;
                            #record_path /video_recordings;
                            #record_unique on;
                            hls on;
                            hls_nested on;
                            hls_path /hls/live;
                            #hls_playlist_length 4s;
                            #hls_fragment 1s;
                            hls_fragment 10s;
                    }
            }
    }
    http {
            include       mime.types;
            default_type  application/octet-stream;
            server {
                    listen ${HTTP_PORT};
                    # return 301 https://$host$request_uri;
                    #creates the http-location for our full-resolution (desktop) HLS stream - "http://my-ip/live/my-stream-key/index.m3u8"     
                    location /live {
                            # Disable cache
                            add_header 'Cache-Control' 'no-cache';

                            # CORS setup
                            add_header 'Access-Control-Allow-Origin' '*' always;
                            add_header 'Access-Control-Expose-Headers' 'Content-Length';

                            # allow CORS preflight requests
                            if ($request_method = 'OPTIONS') {
                                    add_header 'Access-Control-Allow-Origin' '*';
                                    add_header 'Access-Control-Max-Age' 1728000;
                                    add_header 'Content-Type' 'text/plain charset=UTF-8';
                                    add_header 'Content-Length' 0;
                                    return 204;
                            }
                            types {
                                    application/vnd.apple.mpegurl m3u8;
                            }
                            alias /hls/live;
                    }
                    #allows us to see how stats on viewers on our Nginx site using a URL like: "http://my-ip/stats"     
                    #location /stats {
                    #        stub_status;
                    #}
                    location /stat {
                            rtmp_stat all;
                            rtmp_stat_stylesheet stat.xsl;
                    }
                    location /stat.xsl {
                            root html;
                    }
                    location /control {
                            rtmp_control all;
                    }
                    #allows us to host some webpages which can show our videos: "http://my-ip/my-page.html"     
                    location / {
                            root   html;
                            index  index.html index.htm;
                    }

            }
    }

ahora modifica el Dokerfile

mcedit Dockerfile

y añade antes de «EXPOSE 1935» esta linea

RUN mkdir -p /hls/live

Guarda el fichero y dale ahora

docker-compose up --build -d

Si te da un error al descargar los paquetes mira esta otro articulo para resolver el problema: https://www.preparandonos.es/docker-build-no-descarga-los-ficheros-desde-los-repositorios/

Cuando acaba ya estás listo para empezar:

De momento deja de un lado OBS, que es bastante complejo de usar, y en su lugar vamos a usar ffmpeg y un vídeo en mp4 que tengas en tu equipo.

Crea este script con

mcedit streamer.sh

y pegale dentro esto:

#!/bin/bash

# Server RTMP URL
RTMP_URL=rtmp://192.168.0.22/live
# Stream name/key
Key=pelis
SOURCE="$1"  # mp4 video file with h264 video codec, and acc audio codec

###############################################

ffmpeg -re -i "$SOURCE" \
-c:v copy \
-c:a copy \
-f flv "$RTMP_URL/$Key"

Luego pon los permisos

chmod 750 streamer.sh
./streamer.sh pelicula.mp4

y si no hay errores va aparecer algo así:

Ahora es el momento de ver la pelicula. vamos a usar vlc apra esto:


vlc http://192.168.0.22:8082/live/pelis/index.m3u8

Notarás que la llave «pelis» está en la url.

Nota: Para la llave puedes usar cualquier palabra en el script.

y aquí el resultado:

Comentarios cerrados.