Está en la página 1de 13

Redes y Aplicaciones Internet / Sistemas de Internet 2022-23/2

Estudios de Informática, Multimedia y Telecomunicación

Redes y Aplicaciones Internet y Sistemas de Internet


Reto 4
Práctica 3. Experimenta con la reproducción en continuo

El objetivo principal de esta práctica es proporcionar una comprensión práctica de la transmisión


de contenidos de vídeo en streaming a través de Internet, utilizando el protocolo RTMP (Real-
Time Messaging Protocol) como base.

RTMP es un protocolo de mensajería en tiempo real que está presente en muchos de los
streamings de vídeo por Internet, tanto en tiempo real como almacenado. RTMP usa TCP como
protocolo de transporte y se utiliza con muchos tipos diferentes de medios, incluidos televisión en
vivo, vídeos y servicios de telefonía por Internet.

En esta práctica os presentamos el reto de configurar un servidor RTMP para emitir y recibir vídeo
almacenado o en tiempo real, utilizando diferentes herramientas y tecnologías. También

aprenderéis a transmitir flujos HLS y DASH compatibles con las plataformas más modernas.

Figura 1. Streaming con RTMP

La figura anterior os muestra el funcionamiento básico del protocolo. Primero, se codifica la señal
a enviar mediante codificadores de streaming que, a continuación, envían la señal codificada al
servidor usando el protocolo RTMP, desde el cual se distribuye al usuario directamente, a CDN o
a plataformas de vídeo online.

1
Redes y Aplicaciones Internet / Sistemas de Internet 2022-23/2

Esta práctica se desarrollará sobre un servidor Linux1 (Debian o Ubuntu), en el que instalaréis el
software necesario. Para ello podéis usar una máquina virtual (p.e. Virtualbox) o una instalación
en una máquina real. Al final del documento podéis encontrar algunos enlaces a distintos
tutoriales que explican cómo instalar VirtualBox, sus extensiones y cómo instalar Linux en
Virtualbox. Para el correcto funcionamiento de las máquinas virtuales puede que tengáis que
habilitar el PAE/NX en la configuración del VirtualBox, tal y como se muestra en la siguiente
pantalla:

VirtualBox os conecta por defecto a Internet a través de NAT utilizando el host anfitrión, pero os
interesará trabajar en modo puente para poder conectaros al servidor desde cualquier máquina
en nuestra red. Configurad en modo puente la red y comprobad que tenéis salida a Internet.

Calificación
Esta práctica consta de cuatro partes, que se han de realizar en orden secuencial (primero la
parte 1, después la parte 2…). La nota irá en función de las partes entregadas:

Parte 1: Instalación y configuración del servidor Nota máxima C-


Parte 2: Transmisión de streaming almacenado Nota máxima C+
Parte 3: Transmisión de streaming en directo Nota máxima B
Parte 4: Soporte para HLS y DASH Nota máxima A

Para obtener los niveles indicados de calificación es necesario realizar todos los ejercicios y
apartados de las partes indicadas. En caso de haber algún ejercicio o apartado no realizado o
incompleto, implicará no obtener la calificación correspondiente.

Esta práctica ha sido probada en un servidor Debian 11.6 y en un Ubuntu


1

2
Redes y Aplicaciones Internet / Sistemas de Internet 2022-23/2

Importante: para las capturas de pantalla que se piden, configurad el prompt del sistema
operativo de manera que muestre el día en el que estáis y vuestro nombre de usuario.

Nota: Entregad vuestras respuestas a los ejercicios, con las capturas de pantalla
correspondientes, en el registro de evaluación continua del aula de la asignatura.

Primera parte (nota máxima C-):


Instalación y configuración del servidor
En esta primera parte, instalaréis un servidor web de código abierto Nginx, en el que configuraréis
RTMP para poder transmitir vídeo almacenado o en tiempo real.

Pasos a seguir: instalación

Antes de empezar con la instalación del servidor web Nginx, actualizad vuestro sistema:

apt update
apt upgrade

La instalación del servidor web Nginx es estándar para cualquier sistema Ubuntu/Debian y tan
simple como teclear el siguiente comando en una consola de root:

apt install nginx -y

Ahora iniciaréis Nginx y habilitaréis el servicio para que se arranque con el inicio del sistema (si
al arrancar da problemas, podéis comprobar que no tenéis otro servidor web, por ejemplo,
apache2, ejecutándose en el puerto 80):

service nginx start


systemctl enable nginx

Nginx incluye un módulo para transmitir RTMP desde una URL con una configuración mínima. El
módulo Nginx RTMP no se incluye automáticamente con Nginx, pero podéis instalarlo como un
paquete adicional:

apt install libnginx-mod-rtmp -y

Para configurar el servidor RTMP, tenéis que editar el fichero principal de Nginx, usando el
siguiente comando, por ejemplo:

nano /etc/nginx/nginx.conf

Al final del fichero, añadid las siguientes directrices:

3
Redes y Aplicaciones Internet / Sistemas de Internet 2022-23/2

rtmp {
server {
listen 1935;
chunk_size 4096;
allow publish all;

application live {
live on;
record off;
}
}
}

Comprobad que la configuración es correcta, mediante el comando:

nginx -t

Reiniciad el servicio:

service nginx restart

Si tenéis instalado un firewall, habilitad el puerto de RTMP:

sudo ufw allow 1935/tcp

Ejercicio 1

a) Explicad todos los parámetros de configuración de RTMP que habéis añadido en el fichero
de configuración anterior nginx.conf.

b) Añadid tres parámetros de configuración más relacionados con el protocolo RTMP y


explicad por qué creéis interesante tenerlos en cuenta. Mostrad una captura de pantalla
del fichero nginx.conf dónde aparezcan.

c) Para verificar que nginx está funcionando correctamente teclead la siguiente orden en
consola y mostrad el resultado mediante una captura de pantalla:

service nginx status

d) ¿En qué dirección IP se está ejecutando el servidor RTMP? Comprobadlo con el comando
ifconfig o con cualquier otra herramienta similar, mostrándolo mediante una captura de
pantalla.

e) ¿En qué puerto se está ejecutando el servidor RTMP? ¿En qué estado está? Comprobadlo
con el comando netstat o con cualquier otra herramienta similar, mostrándolo mediante
una captura de pantalla.

4
Redes y Aplicaciones Internet / Sistemas de Internet 2022-23/2

f) En cualquier navegador web, introducid la siguiente URL


http://<ip_de_tu_servidor>. Mostrad mediante una captura de pantalla que el
servidor web está correctamente configurado.

Segunda Parte (nota máxima C+): Transmisión de vídeo almacenado


En esta segunda parte de la práctica, enviaréis al servidor RTMP un vídeo de ejemplo para su
posterior difusión a la red. Si no tenéis un archivo de vídeo en vuestro ordenador, podéis
descargar uno usando el comando yt-dlp, una herramienta de línea de comandos para
descargar vídeos de plataformas como YouTube. Para usarla también necesitaréis instalar el
gestor de paquetes snap en vuestro servidor:

apt install snapd


snap install core
snap install yt-dlp

Cerrad la sesión, volved a entrar y descargad algún vídeo (con un short es suficiente) con el
comando yt-dlp:

yt-dlp <url del vídeo> -f mp4

Comprobad que tenéis el vídeo descargado en vuestro directorio actual. Si os da errores de


acceso denegado, aseguraros que tenéis permisos para poder escribir en la carpeta o cambiadlos
mediante el comando chmod.

Pasos a seguir: Envío de vídeo almacenado al servidor

Hay varias formas de enviar el vídeo al servidor RTMP. Una opción es usar el comando ffmpeg,
una herramienta muy popular de línea de comandos. Instaladla y enviad el vídeo al servidor RTMP
ejecutando el siguiente comando:

apt install ffmpeg

ffmpeg -re -i "<nombre del fichero descargado>" -c:v copy -c:a aac -ar 44100
-ac 1 -f flv –flvflags no_duration_filesize rtmp://localhost/live/stream

Si os rechaza la conexión, probad a reiniciar el servicio:

service nginx restart

Ejercicio 2

a) Explicad qué significan todas las opciones del comando anterior ffmpeg.

5
Redes y Aplicaciones Internet / Sistemas de Internet 2022-23/2

b) Explicad por qué en la URL a la que estamos enviando el vídeo aparecen las palabras
live y stream.

c) ¿A cuántos frames por segundo se está transmitiendo el vídeo?

d) Conectaos con VLC o cualquier otro reproductor a la URL


rtmp://<ip_de_tu_servidor>/live/stream mientras el vídeo se esté subiendo
con el programa de streaming ffmpeg. Pegad una captura de pantalla donde se vea que
el vídeo se está reproduciendo.

e) La emisión terminará cuando el vídeo pare. ¿Qué habría que hacer para reproducirlo en
bucle?

f) ¿Cuál es el bitrate medio al que se ha transmitido?

Tercera Parte (nota máxima B)


Transmisión de vídeo en directo con OBS
En el apartado anterior, habéis transmitido una fuente de vídeo estática desde la línea de
comandos. En esta parte, vais a transmitir vídeo en tiempo real desde vuestro PC a través del
servidor RTMP. Para ello usaremos el software de código abierto Open Broadcaster Software
(OBS), muy popular para la transmisión de streaming en vivo. Podéis descargarlo e instalarlo
para vuestro sistema operativo desde https://obsproject.com/es/download.

Pasos a seguir: Creación de vídeo en directo

Una de las opciones para crear vídeo en tiempo real es transmitir vuestro propio escritorio. Para
ello, configurad primero vuestras credenciales de servicio de transmisión en el menú Ajustes
de OBS. Navegad hasta la opción Emisión->Personalizado e introducid las siguientes
opciones, configurando la IP la de vuestro servidor en el campo Servidor, y vuestro usuario de la
UOC como Clave de retransmisión.

La transmisión estará disponible en

rtmp://<ip_de_tu_servidor>/live/<usuario_uoc>

6
Redes y Aplicaciones Internet / Sistemas de Internet 2022-23/2

Si os da el siguiente error “failed to initialize video. Your GPU may not be


supported, or your graphics drivers may need to be updated.”, lo podéis
solucionar poniendo en la línea de comandos LIBGL_ALWAYS_SOFTWARE=1 obs.

No necesitáis habilitar autenticación, pero sí tenéis que configurar la dirección IP de transmisión


de vídeo, cambiando la línea allow publish all en el fichero de configuración de Nginx
/etc/nginx/nginx.conf:

...
allow publish 127.0.0.1;
allow publish <ip_de_tu_servidor>;
deny publish all;
...

Comprobad que el test de configuración es satisfactorio y reiniciad Nginx para que se apliquen
los cambios:

nginx –t
service nginx restart

En este momento ya estáis en disposición de crear vídeo en tiempo real para transmitirlo a través
del servidor RTMP. Para ello, el programa OBS se basa en escenas y fuentes para crear el diseño
de nuestro streaming.

Con el programa OBS abierto, fijaos en las ventanas de la parte inferior. Las escenas son las
diferentes composiciones de nuestro vídeo. Podéis usar los controles o hacer clic derecho en el
panel escenas para añadir, borrar o reordenar. De manera similar, haciendo clic derecho sobre
una escena existente podéis renombrarla, duplicarla, copiar sus propiedades o mostrarla de
manera independiente.

Cada escena puede tener distintas fuentes que son las que compondrán nuestra pantalla. Una
fuente es cualquier elemento que queramos visualizar o escuchar en nuestra escena: cámaras
de vídeo, ventanas de aplicaciones, juegos, pantallas, dispositivos de audio, imágenes, texto,
páginas web... Una vez creada la escena, podéis usar los controles o hacer clic derecho en el
panel fuentes para gestionarlas.

Podemos crear una escena con una única fuente, por ejemplo, nuestra cámara web; otra escena
con un juego, un conjunto de diapositivas y una grabación de audio explicativa. OBS usa una
visualización por capas, así que podéis dimensionar los distintos elementos como creáis
conveniente.

Vamos a poner estos conceptos en práctica. Añadid una escena simple en OBS y una fuente de
entrada de tipo captura de pantalla:

7
Redes y Aplicaciones Internet / Sistemas de Internet 2022-23/2

En la parte inferior derecha, pulsad en Iniciar transmisión para enviar vuestra señal al
servidor RTMP.

Ejercicio 3

a) Para comprobar que se está transmitiendo el streaming en tiempo real, conectaos con VLC o
similar a la URL rtmp://<ip_de_tu_servidor>/live/<usuario_uoc>. Mostradlo
mediante una captura de pantalla.
b) Realiza acciones de usuario sobre la pantalla donde estáis ejecutando OBS y fijaos en el
streaming que estáis visualizando con VLC o similar. ¿Qué es lo que estáis retransmitiendo?

c) Pensad un vídeo a reproducir que contenga como mínimo tres escenas con varias fuentes.
Explicad vuestra idea y mostrad mediante capturas de pantalla la configuración de OBS y la
reproducción del streaming con VLC.

d) Abrid el programa Wireshark como root antes de empezar la retransmisión del streaming en
vivo. Pegad una captura de pantalla donde se vea el tráfico RTMP que se ha generado.
Podéis filtrar por protocolo RTMPT para ver solo esta interacción. Explicad razonadamente,
paquete a paquete, la primera fase de establecimiento de la conexión (handshake) con la
negociación de parámetros (hasta los paquetes audio/video data).

e) Parad la reproducción del streaming en VLC y OBS. ¿Qué paquetes se generan en


Wireshark? Explicad brevemente la interacción que observéis, ejemplificándolo con alguna
captura de pantalla.

El próximo paso es habilitar la página de estadísticas de RTMP. Para ello vais a crear un host
virtual en Nginx:

nano /etc/nginx/sites-available/rtmp

8
Redes y Aplicaciones Internet / Sistemas de Internet 2022-23/2

Y añadid el siguiente contenido:

server {
listen 8080;
server_name localhost;

# rtmp stat
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /var/www/html/rtmp;
}

# rtmp control
location /control {
rtmp_control all;
}
}

Cread el directorio /var/www/html/rtmp y descomprimid el fichero stat.xsl.gz con los


siguientes comandos:

mkdir /var/www/html/rtmp
gunzip -c /usr/share/doc/libnginx-mod-rtmp/examples/stat.xsl.gz >
/var/www/html/rtmp/stat.xsl

Por último, si tenéis instalado un firewall, para acceder a la página de estadísticas hay que abrir
otro puerto en vuestro firewall. En el fichero de configuración de Nginx podéis ver que el puerto
donde se está ejecutando es el 8080, por lo que tenéis que agregar una regla de acceso. Sin
embargo, para que nadie más pueda acceder a la página de estadísticas debéis abrirlo solo para
vuestra propia dirección IP:

ufw allow from <ip_de_tu_PC> to any port http-alt

A continuación, activad esta nueva configuración:

ln -s /etc/nginx/sites-available/rtmp /etc/nginx/sites-enabled/rtmp

Comprobad que el test de configuración es satisfactorio y reiniciad Nginx:

nginx –t
service nginx restart

9
Redes y Aplicaciones Internet / Sistemas de Internet 2022-23/2

10
Redes y Aplicaciones Internet / Sistemas de Internet 2022-23/2

Ejercicio 4

Mostrad una captura de pantalla con el acceso de vuestro navegador a la página de estadísticas
de RTMP: http://<ip_servidor>:8080/stat y actualizadla mientras transmitís vídeo
almacenado con VLC conectado. Observad cómo cambian las estadísticas de transmisión. En
caso negativo, reiniciad el VLC para verlas. Responded a las siguientes preguntas:

a) En relación con la transmisión de audio, indicad:


1. ¿Cuál es el códec que se está usando?
2. ¿Cuál es el bitrate?
3. ¿Cuál es la frecuencia?
4. ¿Y el canal?
b) En relación con la transmisión de vídeo, indicad:
1. ¿Cuál es el códec que se está usando?
2. ¿Cuál es el bitrate?
3. ¿A qué resolución se está transmitiendo?
4. ¿A cuántos frames por segundo?

Cuarta Parte (nota máxima A): Soporte para HLS y DASH


En esta parte aprenderéis cómo enviar un stream por HTTP. Hay dos protocolos que podéis usar
para ello: HLS de Apple y MPEG DASH. El módulo Nginx-RTMP es compatible con ambos
estándares.

Pasos a seguir: Transmisión de vídeo almacenado

Para agregar compatibilidad con HLS y DASH modificad el bloque rtmp en el archivo de
configuración /etc/nginx/nginx.conf y añadid el siguiente contenido dentro de
application live y debajo de record off:

...
hls on;
hls_path /var/www/html/stream/hls;
hls_fragment 3;
hls_playlist_length 60;

dash on;
dash_path /var/www/html/stream/dash;

Abrid el archivo /etc/nginx/sites-available/rtmp y añadid otro servidor al final del archivo,


así como el tipo de datos de aplicación soportado:

...
server {
listen 8088;

11
Redes y Aplicaciones Internet / Sistemas de Internet 2022-23/2

location / {
add_header Access-Control-Allow-Origin *;
root /var/www/html/stream;
}

types {
application/dash+xml mpd;
}

Si tenéis instalado un firewall, habilitad el nuevo puerto 8088:

ufw allow 8088/tcp

Y cread una carpeta stream en el DocumentRoot de Nginx para poder servir los archivos HLS
y DASH:

mkdir /var/www/html/stream

Comprobad que el test de configuración es satisfactorio y reiniciad Nginx:

nginx –t
service nginx restart

Usad el comando ffmpeg, para enviar vídeos de prueba al servidor RTMP ejecutando el siguiente
comando:

ffmpeg -re -i "<nombre del fichero descargado>" -c:v copy -c:a aac -ar 44100
-ac 1 -f flv –flvflags no_duration_filesize rtmp://localhost/live/stream

Si os rechaza la conexión, probad a reiniciar el servicio:

service nginx restart

Ejercicio 5

a) Explicad todos los parámetros de configuración de RTMP que habéis añadido en los dos
ficheros de configuración anteriores.

b) Comprobad con el comando netstat o con cualquier otra herramienta similar los servicios
que se han configurado, mostrándolo mediante una captura de pantalla.

c) Conectaos con VLC a http://<ip_servidor>:8088/hls/stream.m3u8 y


comprobad que podéis ver el stream HLS por HTTP. Pegad una captura de pantalla.

12
Redes y Aplicaciones Internet / Sistemas de Internet 2022-23/2

d) Abrid el Wireshark y comprobad cómo se transmite el streaming HLS. Podéis filtrar por
puerto para visualizar los paquetes que nos interesan. Analizad la interacción que se da,
desde el inicio de la reproducción hasta su paro. Podéis pegar capturas de pantalla y
explicarlas. ¿En qué campo vemos que el streaming es HLS?

e) Conectaos con VLC a http://<ip_servidor>:8088/dash/stream.mpd y


comprobad que podéis ver el stream DASH por HTTP. Pegad una captura de pantalla

f) Abrid el Wireshark y comprobad cómo se transmite el streaming DASH. Podéis filtrar por
puerto para visualizar los paquetes que nos interesan. Analizad la interacción que se da,
desde el inicio de la reproducción hasta su paro. Podéis pegar capturas de pantalla y
explicarlas. ¿En qué campo vemos que el streaming es DASH?

g) ¿Hay diferencias entre HLS y DASH? Comentadlas.

Referencias

• Página del proyecto OBS:


https://obsproject.com/es/download
• Página web del proyecto Videolan:
http://www.videolan.org
• Documentación sobre VirtualBox:
https://www.virtualbox.org/wiki/End-user_documentation
• Cómo instalar VirtualBox:
https://www.wikihow.com/Install-VirtualBox
• Cómo instalar VirtualBox Extension Pack:
https://www.youtube.com/watch?v=mwKmxxRbvws
• Cómo instalar Linux en Windows con VirtualBox:
https://itsfoss.com/install-linux-in-virtualbox/

13

También podría gustarte