Streaming de video con ''nginx'' e ''ffmpeg''

De Manuais Informática - IES San Clemente.
Ir a la navegación Ir a la búsqueda

O servidor web nginx pode ser usado como provedor de fontes rtmp de streaming. RTMP (Real Time Messaging Protocol) foi inicialmente un protocolo propietario desenvolvido por Macromedia para facer streaming de audio, video e datos a través de Internet, entre un reproductor flash e un servidor. Macromedia hoxe en día é propiedade de Adobe, que liberou unha versión incompleta par o uso polo público xeral.

Instalación

Nginx, por si so, non soporta as fontes rtmp. Para poder usalo ten que ser compilado con un módulo específico que si o soporta.

Os pasos para instalar o paquete en Ubuntu son os seguintes:

  • Actualizamos as fontes, instalamos as utilidades para compilar paquetes, e instalamos os paquetes dos que depende nginx
sudo apt-get update
sudo apt-get install dpkg-dev
sudo apt-get build-dep nginx
  • Descargamos as fontes de nginx
sudo apt-get source nginx
  • Descargamos empregando a utilidade git o módulo de rtmp para nginx.
sudo git clone https://github.com/arut/nginx-rtmp-module.git
mv nginx-rtmp-module /usr/src/nginx/
  • Posicionamonos no directorio das fontes do nginx
cd nginx-[version-number]
  • Engadimos no ficheiro debian/rules ao final da sección add-modules a seguinte liña:
--add-module=/usr/src/nginx/nginx-rtmp-module \
  • Compilamos e esperamos un longo tempo (da tempo a preparar un café)
dpkg-buildpackage -b
  • Unha vez rematado, accedemos ao directorio anterior, e instamos os paquetes .deb necesarios (o nome dos paquetes pode variar dependendo do número de versión de nginx).
cd ..
sudo dpkg -i nginx-common_1.4.6-1ubuntu3.2_all.deb
sudo dpkg -i nginx-full_1.4.6-1ubuntu3.2_i386.deb

A partires de agora, xa podemos reiniciar o servizo nginx cando cambiemos a configuración do servidor.

sudo service nginx restart

Preparar nginx para fornecer fontes rtmp

Engadimos no ficheiro de configuración /etc/nginx/nginx.conf dentro da sección http o seguinte:

    server {
        listen       8080;
        server_name  localhost;

        # sample handlers
        #location /on_play {
        #    if ($arg_pageUrl ~* localhost) {
        #        return 201;
        #    }
        #    return 202;
        #}
        #location /on_publish {
        #    return 201;
        #}

        #location /vod {
        #    alias /var/myvideos;
        #}

        # rtmp stat
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }
        location /stat.xsl {
            # you can move stat.xsl to a different location
            root /usr/build/nginx-rtmp-module;
        }

        # rtmp control
        location /control {
            rtmp_control all;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

Ao final do ficheiro de configuración /etc/nginx/nginx.conf algunha das seguites seccións.

  • Video baixo demanda. Indicamos un directorio onde poñemos os arquivos cos vídeos.
rtmp {
    server {
        listen 1935;
        application vod {
            play /var/flvs;
        }
    }
}
  • Servizo de broadcast en directo.
rtmp {
    server {
        listen 1935;
        application live {
            live on;
        }
    }
}
  • Retransmitir outro servidor rtmp
rtmp {
    server {
        listen 1935;
        application tv {
            live on;
            pull rtmp://cdn.example.com:443/programs/main pageUrl=http://www.example.com/index.html name=maintv;
        }
    }
}

No caso de que xa introduciramos unha sección rtmp, so sería necesario introduir as seccións application.

Fornecer contido mediante rtmp usando ffmpeg

Coa utilidade ffmpeg podemos unir contido en directo desde un ficheiro, desde a pantalla dun equipo, ou desde unha camara web. Se non temos instalada a utilidade ffmpeg instalámola:

sudo apt-add-repository ppa:mc3man/trusty-media
sudo apt-get install ffmpeg

Unha vez instalado, xa podemos usala para fornecer contido mediante rtmp (pode facerse desde calquera equipo):

  • Publicar o contido dun ficheiro (/var/videos/test.mp4) por rtmp
ffmpeg -re -i /var/Videos/test.mp4 -c copy -f flv rtmp://<ip servidor>/live/mystream
  • Publicar o contido dun ficheiro (/var/videos/test.mp4) por rtmp, codificando audio mediante (AAC) e video (H264). Será necesario instalar as librarías libx264 e libfaac.
ffmpeg -re -i /var/Videos/test.mp4 -c copy -f flv rtmp://<ip servidor>/live/mystream
  • Publicar o contido dun ficheiro (/var/videos/test.mp4) por rtmp, codificando audio mediante (MP3) e video (H264). Será necesario instalar as librarías libx264 e libmp3lame.
ffmpeg -re -i /var/Videos/test.mp4 -c copy -f flv rtmp://<ip servidor>/live/mystream
  • Publicar o contido a partires da webcam
ffmpeg -f video4linux2 -i /dev/video0 -c:v libx264 -an -f flv rtmp://localhost/live/mystream

Reproducir contido con ffmpeg

Se non dispoñemos dun reproductor que soporte o protocolo rtmp, podemos empregar a utilidade ffmpeg para reproducilo.

ffplay rtmp://localhost/live/mystream

Incluír o contido rtmp nunha páxina web. No cartafol test/rtmp-publisher do módulo hai utilidades para incrustar os vídeos nunha páxina web.