Streaming de video con ''nginx'' e ''ffmpeg''
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.