Configure Nginx en Ubuntu para transmitir video HLS en vivo

HTTP Live Streaming (HLS) es un protocolo de transmisión de video muy robusto implementado por Apple Inc. HLS utiliza transacciones HTTP que atraviesan firewalls, servidores proxy y se pueden distribuir a través de CDN con facilidad. Por lo tanto, esta tecnología puede llegar a una audiencia de visualización mucho mayor que RTP u otros protocolos basados ​​en UDP. Gran parte del video de transmisión en vivo en línea hoy en día está alojado por sistemas caros que usan HLS, pero generalmente son caros y requieren muchos recursos del servidor. Este tutorial le mostrará cómo configurar un VPS VULTR Ubuntu 14.04 muy asequible para hacer eventos de transmisión en vivo HLS utilizando solo software de código abierto.

El primer paso es leer y configurar su servidor de acuerdo con Vultr Doc " Setup Nginx-RTMP en Ubuntu 14.04 ". Las instrucciones en ese documento fueron las más completas para la etapa de configuración, en el momento de la escritura. Mencionaría que es posible que desee sustituir "nginx-1.7.5" con "nginx-1.9.4" o cualquiera que sea la última versión de Nginx disponible. La otra sugerencia es compilar Nginx con el módulo de estado de código auxiliar HTTP para poder monitorear cuántos visores HLS en vivo tiene más adelante.

En lugar de compilar con:

./configure --with-http_ssl_module  --add-module=../nginx-rtmp-module-master

Use esta cadena en el procedimiento descrito en el documento de requisitos previos:

./configure --with-http_ssl_module --with-http_stub_status_module --add-module=../nginx-rtmp-module-master

El ejemplo de este tutorial creará transmisiones "en vivo" y "móviles" (optimizadas) y utilizará ffmpeg (instalado en el tutorial anterior) para generar la transmisión HLS optimizada para móviles y con velocidad de bits ajustada. El ejemplo también mostrará cómo hacer que el servidor grabe sus transmisiones en vivo automáticamente y le permita reproducir las grabaciones como un servicio de reproducción de video a pedido (VOD).

Primero, cree las estructuras de carpetas necesarias para contener los manifiestos y fragmentos de video HLS en vivo y móviles:

sudo mkdir /HLS
sudo mkdir /HLS/live
sudo mkdir /HLS/mobile
sudo mkdir /video_recordings
sudo chmod -R 777 /video_recordings

Probablemente sea una buena idea tener su firewall activado si aún no lo ha hecho. Si es así, debe permitir el tráfico en los puertos utilizados por Nginx y HLS. Si desea ejecutar sin el firewall por ahora, ignore la sección ufw a continuación.

sudo ufw limit ssh
sudo ufw allow 80
sudo ufw allow 1935
sudo ufw enable

La transmisión HLS requiere una configuración Nginx significativamente diferente de la configuración RTMP en el primer artículo. Edite su nginx.confarchivo para usar lo siguiente, sustituyendo "my-ip" y "my-stream-key" con su información. Puede usar cualquier cosa que desee para "my-stream-key", es solo una palabra que es única y útil para usted. Es posible que desee hacer una copia de seguridad de su archivo de configuración original primero, luego pegue la información de configuración proporcionada en el editor, reemplazando todo lo que estaba allí:

sudo cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.original
sudo nano /usr/local/nginx/conf/nginx.conf

Nuevo nginx.conf:

worker_processes  1;
error_log  logs/error.log debug;
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_fragment 10s;

#creates the downsampled or "trans-rated" mobile video stream as a 400kbps, 480x360 sized video
exec ffmpeg -i rtmp://192.168.254.178:1935/$app/$name -acodec copy -c:v libx264 -preset veryfast -profile:v baseline -vsync cfr -s 480x360 -b:v 400k maxrate 400k -bufsize 400k -threads 0 -r 30 -f flv rtmp://192.168.254.178:1935/mobile/$;
}

#creates our "mobile" lower-resolution HLS videostream from the ffmpeg-created stream and tells where to put the HLS video manifest and video fragments
application mobile {
allow play all;
live on;
hls on;
hls_nested on;
hls_path /HLS/mobile;
hls_fragment 10s;
}

#allows you to play your recordings of your live streams using a URL like "rtmp://my-ip:1935/vod/filename.flv"
application vod {
play /video_recordings;
}
}
}


http {
include       mime.types;
default_type  application/octet-stream;

server {
listen 80;
server_name 192.168.254.178;

#creates the http-location for our full-resolution (desktop) HLS stream - "http://my-ip/live/my-stream-key/index.m3u8"      
location /live {
types {
application/vnd.apple.mpegurl m3u8;
}
alias /HLS/live;
add_header Cache-Control no-cache;
}

#creates the http-location for our mobile-device HLS stream - "http://my-ip/mobile/my-stream-key/index.m3u8"        
location /mobile {
types {
application/vnd.apple.mpegurl m3u8;
}
alias /HLS/mobile;
add_header Cache-Control no-cache;
}   

#allows us to see how stats on viewers on our Nginx site using a URL like: "http://my-ip/stats"     
location /stats {
stub_status;
}

#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;
}   
}
}

Presione Ctrl + X para salir. Di "sí" para guardar los cambios.

Puede encontrar instrucciones claras y ejemplos de las variables posibles en este nginx.confarchivo si consulta en su motor de búsqueda favorito las "directivas nginx-rtmp". He estado usando nginx-rtmp con HLS durante algunos años, sin usar las directivas "permitir publicación" y "negar publicación" y he visto cero instancias de personas que usan / invaden mis servidores de video. Así que no incluí esas directivas aquí. Lea y agregue estas directivas si lo desea.

Después de cambiar el nginx.confarchivo, debe reiniciar Nginx para usar la nueva configuración:

sudo service nginx restart

Esté atento a cualquier mensaje de error de Nginx y aborde cualquier error que pueda haber sido causado por faltas de ortografía, propiedad de carpetas o problemas de permisos. Si no tiene mensajes de error, está listo para crear su secuencia de codificación.

Debe tener un codificador de video para crear la transmisión. Uso OBS (Open Broadcaster Software), que es de código abierto y funciona bien para mí. Hay otras soluciones para elegir, que están fuera del alcance de este tutorial. No cubriré todo sobre la configuración de un codificador de video RTMP. Sin embargo, todos requieren aproximadamente las mismas variables de entrada. Las configuraciones clave que necesitará ingresar para usar mi nginx.confconfiguración exacta y funcionar bien en la mayoría de los jugadores / navegadores / plataformas son las siguientes:

  1. Codificador-x264
  2. Velocidad de bits variable (no CBR o velocidad de bits constante), calidad más alta
  3. Velocidad de bits máxima: 600 kbps
  4. Audio-Codec-AAC
  5. Formato de audio-44.1khz
  6. Audio-bitrate-64kbps
  7. URL de FMS- "rtmp: // my-ip: 1935 / live"
  8. Clave de transmisión- "my-stream-key"
  9. Resolución-640x480
  10. FPS (cuadros por segundo) -30
  11. CFR (velocidad de fotogramas constante): sí
  12. Intervalo de fotogramas clave: 2 segundos (un fotograma clave cada 2 segundos)
  13. Perfil base de codificación x264 (puede funcionar con main; depende del reproductor utilizado)
  14. CPU x264 Presente-muy rápido

Recomiendo probar diferentes codificadores y experimentar con ellos. Es posible que desee una relación de aspecto amplia, o su cámara (u otra transmisión) puede exigirla. Si es así, asegúrese de cambiar esta información en su codificador y también la relación de aspecto que figura en la sección exec-ffmpeg del nginx.confarchivo que he proporcionado; de lo contrario, obtendrás algunos videos de aspecto tonto.

Una vez que su codificador está configurado, puede probarlo todo. Encienda el codificador con su cámara web o algún tipo de prueba de alimentación que se ejecute en él. Puede ver su transmisión en este momento con el reproductor VLC usando URL como:

http://my-ip/live/my-stream-key/index.m3u8
http://my-ip/mobile/my-stream-key/index.m3u8

Estos son para sus transmisiones de video principal y móvil, respectivamente. Sustituya su IP y la clave de transmisión en consecuencia.

Después de haber transmitido con éxito su primera verificación de transmisión (a través de ssh o ftp) de que su transmisión en vivo se grabó en la /video_recordingscarpeta de su Vultr VPS. También puede intentar reproducir este archivo grabado en VLC con una URL como:

rtmp://my-ip/vod/filename.flv

Las estadísticas de Nginx también están disponibles (con Nginx stub_status). Para ver las estadísticas de visitante / espectador, acceda a:

http://my-ip/stats

Para ver su video en una página web, necesitará un reproductor integrable. Hay muchos reproductores integrables disponibles que reproducirán videos HLS. He usado JW Player durante algunos años, pero la versión gratuita no jugará HLS. Flowplayer y Bitdash by Bitmovin (entre otras soluciones) son lo suficientemente generosos como para ofrecer una versión no comercial de sus reproductores de forma gratuita, lo que hará que su transmisión HLS esté incrustada en una página web. Para este artículo, los probé a ambos y descubrí que ambos funcionan bastante bien con mi servidor de video basado en Vultr / Nginx. Mostraré brevemente cómo hice funcionar Flowplayer con mi máquina de banco de pruebas.

Si va a utilizar la transmisión en vivo de HLS de forma regular, sostenida o comercial, le recomiendo que compre una licencia de Flowplayer o el jugador que decida utilizar. Obtendrá un reproductor que tiene menos restricciones, más funciones y puede ser calificado con su organización. También recibirá soporte, que puede ser muy importante. Aparte del Vultr VPS, este es realmente el único costo asociado con el proyecto.

Antes de hacer cualquier otra cosa, es importante tener en cuenta las llamadas restricciones de "dominio cruzado", que de otro modo cerrarían su capacidad de transmitir a una página web / sitio web. Cree un crossdomain.xmlarchivo en su nginx/htmlcarpeta y coloque instrucciones para permitir que los datos fluyan entre dominios:

sudo nano /usr/local/nginx/html/crossdomain.xml

Primero copie (desde esta página) y luego pegue (clic derecho) en el campo del editor nano los siguientes datos XML:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>

Presione Ctrl + O para escribir, luego Ctrl + X para guardar el archivo en el disco y salir.

Tomé el HTML5 (versión 6.0.3) de Flowplayer que me dio una cantidad de archivos y una carpeta cuando lo descomprimí. Cargué todos los archivos y la carpeta en una subcarpeta de la carpeta raíz Nginx / HTML que denominé "flowplayer". El camino exacto era /usr/local/nginx/html/flowplayer.

Para probar nuestro video cuando está incrustado en una página web, cree un par de archivos HTML en la raíz de la carpeta Nginx / HTML usando nano y complételos con los siguientes contenidos.

Archivo:

sudo nano /usr/local/nginx/html/hls.html

Código HTML:

<!doctype html>
<head>
<link rel="stylesheet" href="#">
</head>

<body>
640x480 664kbps (live) Desktop Browsers<br>
<div style="width:640px;" class="flowplayer" data-swf="flowplayer/flowplayer.swf" data-ratio="0.75">
<video>
<source type="application/x-mpegurl" src="">
</video>
</div>
<br><br>
480x360 464kbps (mobile) Mobile Browsers <br>
<div style="width:480px;" class="flowplayer" data-swf="flowplayer/flowplayer.swf" data-ratio="0.75">
<video>
<source type="application/x-mpegurl" src="">
</video>
</div>
</body>

Archivo:

sudo nano /usr/local/nginx/html/hls_progressive.html

Código HTML:

<!doctype html>
<head>
<link rel="stylesheet" href="#">
<style> .flowplayer { width: 640px; } </style>
</head>

<body>
<div class="flowplayer" data-swf="flowplayer/flowplayer.swf" data-ratio="0.75">
<video>
<source type="application/x-mpegurl" src=""> 
<source type="application/x-mpegurl" src="">
</video>
</div>
<br>
</body>

Asegúrese de sustituir "my-ip" y "my-stream-key" con sus datos.

Debe sustituir la ruta flowplayer/skin/functional.csspor el signo "#" en la hoja de estilo href="#". El software tutorial elimina el camino. Debe completar una URL en la src=""parte; el software tutorial la está eliminando, use http://my-ip/live/my-stream-key/index.m3u8y http://my-ip/mobile/my-stream-key/index.m3u8, respectivamente. También debe agregar srcetiquetas de script en la cabeza para ambos jquery-1.11.2.min.jsy para flowplayer.min.js. El software tutorial elimina las etiquetas. Puede encontrar cómo crear estas etiquetas mirando el example htmlarchivo incluido con el kit Flowplayer.

Encienda el codificador con su cámara web o algún tipo de prueba de alimentación que se ejecute en él. Puede ver su transmisión en un navegador utilizando las siguientes URL:

http://my-ip/hls.html
http://my-ip/hls_progressive.html

La primera página simplemente muestra cada una de sus transmisiones: la principal y la plataforma móvil. Podrá iniciarlos a ambos y verlos. Notarás que la transmisión de la plataforma móvil es de menor tamaño. Estos pasos son solo para asegurarse de que todo esté funcionando.

La segunda página muestra una sola secuencia. Pero está configurado de una manera que se llama "transmisión progresiva". Lo que esto significa es que cuando un espectador reproduce el video, tanto el servidor como el reproductor intentan darle al espectador una transmisión de alta velocidad de bits y alta calidad si la conexión de los espectadores puede mantenerlo. Si su conexión es deficiente y no puede mantener la conexión, se despliega para mostrar el flujo de velocidad de bits más baja (móvil) que es 200 kbps más bajo en ancho de banda. Si lo desea, puede crear secuencias más progresivas y graduadas con ffmpeg y configurarlas con mi ejemplo.

Probé esta configuración en un solo núcleo, Vultr VPS de 1GB y descubrí que con una sola transmisión en vivo, más la transmisión móvil trans-clasificada que crea con ffmpeg, el uso de la CPU era inferior al 35% y había consumido solo 100 MB de mi 1GB de ram Ahora que es una configuración muy eficiente.

Si planea transmitir video que es mucho más grande en dimensiones de píxeles que SD, es posible que tenga que usar un VPS más potente. Tenía curiosidad acerca de esto y ejecuté mi transmisión principal hasta 1280x960 píxeles y 2Mbps, poniendo una carga adicional en las cosas. Pero el VPS todavía solo usó 50% de CPU y el uso de memoria se mantuvo en 100MB. Agregué una docena de visores / navegadores y casi no hubo diferencia en la carga en el VPS: solo aumentó el ancho de banda utilizado. Estoy seguro de que la creación de transmisiones con clasificación adicional con ffmpeg continuaría poniendo una carga adicional en el sistema.

He usado este tipo de servidor en entornos de producción con entre 50 y 100 usuarios concurrentes y descubrí que el uso de recursos aumentó muy poco con el aumento de las conexiones de los espectadores. Experimenta con eso. Pero creo que la mayoría de los usuarios estarían contentos con un VPS de 1GB de un solo núcleo. ¡Disfruta de tu nuevo servidor de transmisión HLS!



Leave a Comment

Cómo instalar LiteCart Shopping Cart Platform en Ubuntu 16.04

Cómo instalar LiteCart Shopping Cart Platform en Ubuntu 16.04

LiteCart es una plataforma de carrito de compras gratuita y de código abierto escrita en PHP, jQuery y HTML 5. Es un software de comercio electrónico simple, liviano y fácil de usar.

Cómo instalar MODX Revolution en un CentOS 7 LAMP VPS

Cómo instalar MODX Revolution en un CentOS 7 LAMP VPS

¿Usando un sistema diferente? MODX Revolution es un sistema de gestión de contenido (CMS) de nivel empresarial rápido, flexible, escalable, gratuito y de código abierto escrito i

Cómo instalar Blacklistd en FreeBSD 11.1

Cómo instalar Blacklistd en FreeBSD 11.1

Introducción Cualquier servicio que esté conectado a Internet es un objetivo potencial para ataques de fuerza bruta o acceso injustificado. Hay herramientas como fail2ba

Configurar un servidor TeamTalk en Linux

Configurar un servidor TeamTalk en Linux

TeamTalk es un sistema de conferencia que permite a los usuarios tener conversaciones de audio / video de alta calidad, chat de texto, transferir archivos y compartir pantallas. Es yo

How to Install and Configure CyberPanel on Your CentOS 7 Server

How to Install and Configure CyberPanel on Your CentOS 7 Server

Using a Different System? Introduction CyberPanel is one of the first control panels on the market that is both open source and uses OpenLiteSpeed. What thi

Instalar Grafana en Ubuntu 16.04 LTS

Instalar Grafana en Ubuntu 16.04 LTS

¿Usando un sistema diferente? Introducción Grafana es un software de código abierto que transforma múltiples feeds de sistemas como Graphite, Telegraf, an

Install eSpeak on CentOS 7

Install eSpeak on CentOS 7

Using a Different System? ESpeak can generate text-to-speech (TTS) audio files. These can be useful for many reasons, such as creating your own Turin

Cómo instalar Thelia 2.3 en CentOS 7

Cómo instalar Thelia 2.3 en CentOS 7

¿Usando un sistema diferente? Thelia es una herramienta de código abierto para crear sitios web de comercio electrónico y administrar contenido en línea, escrito en PHP. Código fuente de Thelia i

How To Install Apache, MySQL and PHP (FAMP) Stack on FreeBSD 12.0

How To Install Apache, MySQL and PHP (FAMP) Stack on FreeBSD 12.0

Introduction A FAMP stack, which is comparable to a LAMP stack on Linux, is a collection of open-source software that is typically installed together t

Instalación de Fuel CMS en Ubuntu 16.04 LTS

Instalación de Fuel CMS en Ubuntu 16.04 LTS

¿Usando un sistema diferente? Fuel CMS es un sistema de gestión de contenido basado en CodeIgniter. Su código fuente está alojado en GitHub. Esta guía le mostrará cómo t

Cómo instalar Couch CMS 2.0 en un VPS LAMP Debian 9

Cómo instalar Couch CMS 2.0 en un VPS LAMP Debian 9

¿Usando un sistema diferente? Couch CMS es un sistema de gestión de contenido (CMS) simple y flexible, gratuito y de código abierto que permite a los diseñadores web diseñar

Monitoree sus dispositivos usando LibreNMS en CentOS 7

Monitoree sus dispositivos usando LibreNMS en CentOS 7

¿Usando un sistema diferente? LibreNMS es un completo sistema de monitoreo de red de código abierto. Utiliza SNMP para obtener los datos de diferentes dispositivos. Una variedad

Cómo implementar Ghost v0.11 LTS en Ubuntu 16.04

Cómo implementar Ghost v0.11 LTS en Ubuntu 16.04

¿Usando un sistema diferente? Ghost es una plataforma de blogs de código abierto que ha estado ganando popularidad entre los desarrolladores y usuarios comunes desde su 201

Cómo instalar Pip en Linux

Cómo instalar Pip en Linux

Pip es una herramienta para administrar paquetes de Python. El uso de un administrador de paquetes permite una gestión eficiente de su servidor. En este tutorial, explicaré cómo t

Cómo instalar Cacti 1.1 en CentOS 7

Cómo instalar Cacti 1.1 en CentOS 7

Cacti es una herramienta de gráficos y monitoreo de red de código abierto y libre escrita en PHP. Con la ayuda de RRDtool (herramienta de base de datos Round-Robin), Cacti se puede usar t

Cómo supervisar de forma segura los servidores remotos con Zabbix en CentOS 7

Cómo supervisar de forma segura los servidores remotos con Zabbix en CentOS 7

¿Usando un sistema diferente? Zabbix es un software gratuito y de código abierto listo para empresas que se utiliza para monitorear la disponibilidad de sistemas y componentes de red.

Cómo instalar YOURLS en CentOS 7

Cómo instalar YOURLS en CentOS 7

YOURLS (Your Own URL Shortener) es una aplicación de análisis de datos y acortamiento de URL de código abierto. En este artículo, cubriremos el proceso de instalación

How to Install Alfresco Community Edition on Ubuntu 16.04

How to Install Alfresco Community Edition on Ubuntu 16.04

Using a Different System? Alfresco Community Edition is an open source version of the Alfresco Content Services. It is written in Java and uses PostgreSQL t

Instalación de Docker en Ubuntu 14.04

Instalación de Docker en Ubuntu 14.04

¿Usando un sistema diferente? Docker es una aplicación que permite implementar programas que se ejecutan como contenedores. Fue escrito en el popular programa Go

Cómo instalar LimeSurvey en CentOS 7

Cómo instalar LimeSurvey en CentOS 7

LimeSurvey es una herramienta de encuestas en línea gratuita y de código abierto que se utiliza ampliamente para publicar encuestas en línea y para recopilar comentarios de encuestas. En este artículo, voy a

ZPanel y Sentora en CentOS 6 x64

ZPanel y Sentora en CentOS 6 x64

ZPanel, un panel de control de alojamiento web popular, se bifurcó en 2014 a un nuevo proyecto llamado Sentora. Aprende a instalar Sentora en tu servidor con este tutorial.

Cómo instalar Vtiger CRM Open Source Edition en CentOS 7

Cómo instalar Vtiger CRM Open Source Edition en CentOS 7

Aprende cómo instalar Vtiger CRM, una aplicación de gestión de relaciones con el cliente, en CentOS 7 para aumentar tus ventas y mejorar el servicio al cliente.

Cómo instalar el servidor Counter-Strike 1.6 en Linux

Cómo instalar el servidor Counter-Strike 1.6 en Linux

Esta guía completa le mostrará cómo configurar un servidor Counter-Strike 1.6 en Linux, optimizando el rendimiento y la seguridad para el mejor juego. Aprende los pasos más recientes aquí.

¿Puede la IA luchar con un número cada vez mayor de ataques de ransomware?

¿Puede la IA luchar con un número cada vez mayor de ataques de ransomware?

Los ataques de ransomware van en aumento, pero ¿puede la IA ayudar a lidiar con el último virus informático? ¿Es la IA la respuesta? Lea aquí, sepa que la IA es una bendición o una perdición

ReactOS: ¿Es este el futuro de Windows?

ReactOS: ¿Es este el futuro de Windows?

ReactOS, un sistema operativo de código abierto y gratuito, está aquí con la última versión. ¿Puede satisfacer las necesidades de los usuarios de Windows de hoy en día y acabar con Microsoft? Averigüemos más sobre este estilo antiguo, pero una experiencia de sistema operativo más nueva.

Manténgase conectado a través de la aplicación de escritorio WhatsApp 24 * 7

Manténgase conectado a través de la aplicación de escritorio WhatsApp 24 * 7

Whatsapp finalmente lanzó la aplicación de escritorio para usuarios de Mac y Windows. Ahora puede acceder a Whatsapp desde Windows o Mac fácilmente. Disponible para Windows 8+ y Mac OS 10.9+

¿Cómo puede la IA llevar la automatización de procesos al siguiente nivel?

¿Cómo puede la IA llevar la automatización de procesos al siguiente nivel?

Lea esto para saber cómo la Inteligencia Artificial se está volviendo popular entre las empresas de pequeña escala y cómo está aumentando las probabilidades de hacerlas crecer y dar ventaja a sus competidores.

La actualización complementaria de macOS Catalina 10.15.4 está causando más problemas que resolver

La actualización complementaria de macOS Catalina 10.15.4 está causando más problemas que resolver

Recientemente, Apple lanzó macOS Catalina 10.15.4, una actualización complementaria para solucionar problemas, pero parece que la actualización está causando más problemas que conducen al bloqueo de las máquinas Mac. Lee este artículo para obtener más información

13 Herramientas comerciales de extracción de datos de Big Data

13 Herramientas comerciales de extracción de datos de Big Data

13 Herramientas comerciales de extracción de datos de Big Data

¿Qué es un sistema de archivos de diario y cómo funciona?

¿Qué es un sistema de archivos de diario y cómo funciona?

Nuestra computadora almacena todos los datos de una manera organizada conocida como sistema de archivos de diario. Es un método eficiente que permite a la computadora buscar y mostrar archivos tan pronto como presiona buscar.