Teléfono y Whatsapp: 675 18 68 80

Wowza media live stream y listas smil II

Después de haber instalado Wowza en nuestro servidor, probaremos si se está ejecutando simplemente poniendo nuestra IP y añadiendo el puerto 1935 en el navegador de esta manera:

http://[ip del servidor]:1935

¿problemas?

Si la página no se puede cargar, el servidor no se está ejecutando, y es probable que Apache haya entrado en conflicto con Wowza, para ello habrá que finalizar el servicio apache2:

service apache2 stop

o bien:

sudo /etc/init.d/apache2 stop

Otra opción es mantener apache2 y Wowza dos ejecutándose en el puerto 80, para ello, echad un ojo a esta entrada.

Y ahora arrancamos Woza:

service WowzaMediaServer start

primer live stream

Ahora que ya está arrancado Wowza, vamos a proceder a crear nuestro primer streaming en directo, para ello necesitaremos emitir a nuestro servidor video y este lo retransmitirá de nuevo a nuestros clientes. Pero primero, la configuración.
Necesitamos saber que el directorio de la instalación del servidor es ‘/usr/local/WowzaMediaServer’. Si hacemos un listado, obtendremos los siguientes directorios:

cd /usr/local/WowzaMediaServer
ls
applications  bin  conf  content  documentation  examples  keys  lib  logs

Descripción:

  • applications: el directorio donde crearemos el nombre y los ficheros de configuracion de nuestras aplicaciones live, on demand, codificadores..etc.
  • bin: ejecutables binarios de Wowza.
  • conf: todos los ficheros de configuración generales.
  • content: lugar para almacenar archivos de video para reproducirlos on demand o listas SMIL.
  • documentation: pdfs con documentación.
  • examples: ejemplos de aplicaciones, incluye archivos flash y html.
  • keys:
  • lib: librerias y plugins.
  • logs: registros de error, de reproducción, etc.

Ahora vamos a crear nuestra primera aplicación en directo, para ello, instalamos la del ejemplo:

sudo ./examples/LiveVideoStreaming/install.sh

Nos habrá creado en la carpeta ‘applications’ dos carpetas: live y rtplive. Ambos dos son ejemplos para transmitir en vivo, solo se diferencian en el protocolo entrante (del programa que codifica y emite) que aceptan. También estarán ambas carpetas en el directorio ‘conf’. Si queremos probar cambios siempre que modifiquemos algo de la configuración del servidor, debemos de reiniciarlo:

sudo service WowzaMediaServer restart

Si no funciona, miramos el ejemplo de Wowza.

Ahora vamos a probar con el programa wirecast, si la emision en vivo funciona, nos descargamos Wirecast desde www.wirecast.com (previo registro) y despues de instalarlo, reproducimos un video (File -> Import Media) y hacemos click en el dibujo de la antena de emitir, elegimos el perfil de ‘Flash Low Bandwith’ y en la URL, ponemos ‘rtmp://laipdelservidor/live’ y en el campo stream ‘myStream’. Damos a aceptar y comenzará a emitir.

También podemos elegir retransmitir desde la linea de comandos (mejor rendimiento en PC’s viejos) haciendo uso de ffmpeg mediante:

 ffmpeg -i archivoejemplo.mp4 -re -acodec copy -vcodec copy -f flv rtmp://[ip del servidor]/live/myStream

o desde una webcam, con:

ffmpeg -r 25 -re -f video4linux2 -i /dev/video0 -pix_fmt yuv420p -r 25 -re -vcodec libx264 -f flv -y rtmp://[ip del servidor]/live/myStream

Para ver si está emitiendo, abrimos VLC y damos a Medio -> Abrir volcado de Red y ponemos la url anterior, pero añadiendo el stream: ‘rtmp://localhost/live/myStream’ y le damos a reproducir. Si todo ha ido bien, debería de verse el vídeo que estamos emitiendo en el VLC.

Aqui teneis un script en bash para hacer un bucle infinito, de tal manera que si se interrumple la emisión por pérdida de red o saturación del sistema, el script lo volverá a intentar:

#!/bin/bash
while true; do
        ffmpeg -r 25 -re -f video4linux2 -i /dev/video0 -pix_fmt yuv420p -r 25 -re -vcodec libx264 -f flv -y rtmp://[ip del servidor]/live/myStream
        sleep 2
done

También podemos añadir el profile baseline a nuestro stream en ffmpeg para que sea mas compatible con iOS y Android:

-profile:v baseline

pero hay que tener en cuenta que emitirá mas Kbps que sin ello.

proteger el streaming

Vamos a proceder a proteger la emisión del streaming, para que nadie, conociendo nuestra IP pueda emitir su contenido. Para ello, existen varios plugins en Wowza:

ModuleRTMPAuthenticate

Nota: para que funcione, hay que añadir en /lib los ficheros wms-plugin-collection.jar y wms-plugin-security.jar que se pueden descargar desde aquí y aquí.

La autentificación mendiante Flash sería de la siguiente forma:

... rtmp://usuario:contrasenya@[ip del servidor]/live/myStream

Editamos el fichero Application.xml de nuestra aplicacion live y en la parte <Modules> le añadimos:

<Module>
	<Name>ModuleRTMPAuthenticate</Name>
	<Description>ModuleRTMPAuthenticate</Description>
	<Class>com.wowza.wms.plugin.security.ModuleRTMPAuthenticate</Class>
</Module>

Si queremos un mismo usuario y contraseña para todas las aplicaciones, el fichero publish.password debera de estar en /conf , después añadimos el siguiente bloque en <Properties>

<Property>
	<Name>rtmpEncoderAuthenticateFile</Name>
	<Value>${com.wowza.wms.context.VHostConfigHome}/conf/publish.password</Value>
</Property>

por el contrario, si queremos una autentificacion por cada tipo de aplicacion, copiaremos el fichero publish.password en /conf/live y después añadimos el siguiente bloque en <Properties>

<Property>
	<Name>rtmpEncoderAuthenticateFile</Name>
	<Value>${com.wowza.wms.context.VHostConfigHome}/conf/${com.wowza.wms.context.Application}/publish.password</Value>
</Property>

El fichero publish.password es un fichero en texto plano con el siguiente formato: [usuario] [espacio] [contraseña]

Este metodo de autentificacion se usa para programas como Wirecast3 o Adobe Flash Media Live Encoder y al conectarnos, nos solicitará mediante una nueva pantalla el usuario y contraseña. No sirve para FFMPEG.

ModuleSecureURLParams

Nota: para que funcione, hay que añadir en /lib los ficheros wms-plugin-collection.jar y wms-plugin-security.jar que se pueden descargar desde aquí y aquí.

La autentificación mediante ffmpeg sería de la siguiente forma:

... rtmp://[ip del servidor]/live?doPublish=12345/myStream

Editamos el fichero Application.xml de nuestra aplicacion live y en la parte <Modules> le añadimos:

<Module>
	<Name>ModuleSecureURLParams</Name>
	<Description>ModuleSecureURLParams</Description>
	<Class>com.wowza.wms.plugin.security.ModuleSecureURLParams</Class>
</Module>

después añadimos el siguiente bloque en <Properties>

<Property>
	<Name>secureurlparams.publish</Name>
	<Value>12345.doPublish</Value>
</Property>

donde 12345 es la contraseña que pondremos para poder emitir y doPublish es la cadena de conexión.
Nota: para que funcione, hay que añadir en /lib los ficheros wms-plugin-collection.jar y wms-plugin-security.jar.
Este metodo de autentificacion se para linea de comandos en FFMPEG.

¿problemas?
En Lubuntu 12.04 LTS funcionan los comandos anteriores sin problemas, pero si usais otra versión de ffmpeg y no encuentra la librería libx264, hay que compilarlo con dicho soporte de la siguiente manera, también puedes echar un ojo al post sobre cómo compilarlo en raspberry Pi.

listas de reproducción SMIL

SMIL es un tipo de fichero XML usado para programar la emision de contenido en Wowza. Admite ficheros de video flv y mp4 de diferente bitrate y también emisiones live para cuando llega el momento programado, interrumpir los ficheros y conectar ‘en directo’ con la emision live.
Para reproducir una lista SMIL, hace falte tener una aplicación live instalada, como es nuestro caso.
En el directorio /content es donde se almacena tanto la lista de reproduccion como los ficheros de video de la lista. No pueden estar fuera de este directorio.En nuestro caso, tenemos esto en la carpeta /content:

streamschedule.smil.
enlace.mp4
/videos
/videos/video1.flv
/videos/video2.flv

y este es nuestro fichero streamschedule.smil (se tiene que llamar asi, sino no funciona):

<smil>
	<head>
	</head>
	<body>
		<stream name="stream1"></stream>
 
		<playlist name="pl1" playOnStream="stream1" repeat="true" scheduled="2009-04-04 13:30:00">
			<video src="mp4:enlace.mp4" start="0" length="-1"/>
			<video src="flv:videos/video1.flv" start="0" length="-1"/>
			<video src="mp4:enlace.mp4" start="0" length="-1"/>
			<video src="flv:videos/video2.flv" start="0" length="-1"/>
		</playlist>
		<playlist name="pl2" playOnStream="stream1" repeat="false" scheduled="2013-04-05 18:15:00">
			<video src="myStream" start="-2" length="-1"/>
		</playlist>
	</body>
</smil>

Explicación: hemos creado un único stream “stream1″, que es el stream que emitira las listas de reproducción. A continuación hay dos listas (pl1 y pl2) que tienen varios atributos:
playOnStream: indica en que stream se va a emitir esta lista de reproducción, en nuestro caso, como solo tenemos “stream1″, pues “stream1″.
repeat: es un booleano (true o false) si esta a true se repetira infinitamente siempre que le toque reproducirse.
scheduled: esta es la fecha de programacion de esta lista de reproducción, si la fecha ya ha pasado, se reproducirá (y si el atributo repeat esta a true, pues se repetirá indefinidamente). Sin embargo puede ocurrir que esta lista de reproducción (pl1), sea interrumpida porque hay otra lista programada para emitir en “stream1″, como es el caso de “pl2″ cuya fecha aun no ha llegado.Cuando llegue la fecha scheduled de “pl2″, comenzará a reproducirse y cuando acabe, volverá a “pl1″, ya que contunuaba reproduciendose indefinidamente en background.

Recomiendo leer la guia de Wowza sobre listas SMIL para más información.

Pero para que la lista SMIL funcione, hay que añadir en el fichero Server.xml situado en /conf dentro de la etiqueta <ServerListeners> :

<ServerListener>
    <BaseClass>com.wowza.wms.plugin.collection.serverlistener.ServerListenerStreamPublisher</BaseClass>
</ServerListener>

por último, añadir esta linea en <Properties> del Server.xml:

<Property>
<Name>PublishToApplication</Name>
<Value>live</Value>
</Property>

donde “live” es la aplicacion del tipo live a la que se enviara el stream desde el SMIL. Ej: rtmp://[ip del servidor]/live/stream1 -> se emitira en stream1 por la configuración del SMIL.
Nota: para que funcione, hay que añadir en /lib el fichero wms-plugin-collection.jar.

de RTMP a RTSP

Al emitir en formato RTMP, Wowza lo vuelve a retransmitir en RTMP, pero si necesitamos usar el protocolo RTSP (dispositivos móviles como Android), lo unico que tenemos que hacer es cambiar la cadena de conexión RTMP por:

rtsp://[ip del servidor]:1935/live/myStream

Ahora bien, algunos dspositivos buscan el puerto 554 para rtmp y para que wowza haga uso de el, dimplemente hay que añadirselo en el fichero /conf/VHost.xml

<Port>1935,554</Port>

Y ya podremos usar la cadena de conexión sin necesidad de añadirle el puerto, la propia aplicacion lo buscara.

rtsp://[ip del servidor]/live/myStream

previsualizar nuestros streams

Para visualizar nuestros streams tenemos dos opciones:

  • VLC: “Archivo-> Abrir volcado de red…
  • Internet: Vamos es esta página, pegamos la URL del streamy pulsamos sobre reproducir.

  • Jose

    Que puertos necesito abrir para que mi señal salga fuera de mi conexión local?

    Gracias.

    • http://www.alvarolara.com walo

      Hola Jose, en este manual, yo estoy utilizando un servidor dedicado con una IP pública. Si usas una IP privada, es posible que necesites servicios como http://www.noip.com/ que permiten encapsular IP privadas en públicas, pero no lo he probado.

      Suerte.

  • Carlos Hidalgo

    Antes que todo muchas gracias por el Tutorial, bien explicado. Hasta ahora he logrado hecharlo andar con la webcam de mi lap. Te comento lo siguiente:

    Tengo instalado y corriendo wowza en Ubuntu 12.10, sin embargo, me he encontrado con estos problemas:

    1.- Las transmisión por ffmpeg no se escucha y no he logrado hacer que se escuche.
    2.- En mi red local todos pueden ver mi video live, pero como hago para mandar el video de una maquina “x” de mi lan hacia mi server para que lo transmitan. Y como hago para ver al mismo tiempo los videos de ambas máquinas?
    3.- El otro problema es en cuanto al formato, como puedo hacerle para que transmita en vivo en formato mp4 en vez de flv, ya que el mp4 lo puedo consumir en varios dispositivos móviles y no es necesario tener el flash player instalado como es el caso de iOS?

    Posiblemente, sean preguntas triviales(por no decir tontas) pero para mi que es mi primer experiencia en esto, se me hace complicado.

    Te reitero mi agradecimiento y apoyo.

    Saludos…

  • http://www.alvarolara.com walo

    Hola Carlos,

    1-¿La transmisión de la webcam mediante ffmpeg? ¿has probado a emitir un fichero de vídeo?. Si no te emite audio es debido a los parámetros de ffmpeg sin dudas, ya que Wowza digiere lo que le envíes (correctamente enviado).

    2-Se supone que Wowza ha de estar en un servidor remoto con IP pública, para que todo el mundo se pueda conectar a él.

    3-En realidad, Wowza transmite en mp4 (y vale para Android, iOS, flash player…etc), el parámetro flv de ffmpeg es sólo para indicarle que emita mediante rtmp. Prueba a enviar un mp4.

    Un saludo.

    • Carlos Hidalgo

      Interesante mi estimado Walo, pero:

      1.- Se le tiene que agregar algún parámetro a ffMpeg para que se escuche el audio?

      2.- Si, pero como sería el link para conectarse?

      3.- no logro hacer que el streaming sea en MP4, le incluí el -profile:v baseline y nada.

      Creo que el problema lo tengo en los parámetros del ffmpeg, pero créeme que por mas que he buscado y hecho prueba no logro dar con la solución de estos problemas.

      Saludos.

  • Carlos Hidalgo

    Se me olvido comentarte que el código que estoy utilizando para ver el video stream es:

    ffmpeg -r 25 -re -f video4linux2 -i /dev/video0 -pix_fmt yuv420p -r 25 -re -vcodec libx264 -f flv -y -profile:v baseline rtmp://localhost/live/myStream

    • http://www.alvarolara.com walo

      1-Vale, no te entendía bien. Efectivamente el comando que pones (el que tengo yo puesto yo más arriba), sirve para emitir vídeo pero no audio desde una webcam. Si quieres emitir también audio, tendrás que probar parámetros de ffmpeg.
      En este otro comando, que emite un fichero mp4 (audio y video), puedes tener una pista:
      ffmpeg -i archivoejemplo.mp4 -re -acodec copy -vcodec copy -f flv rtmp://[ip del servidor]/live/myStream

      prueba a ponerle -acodec copy al parámetro de la webcam. Por otra si emites desde Windows, puedes probar otros programas con interfaz gráfica para emitir como Wirecast o Adobe Media Live Encoder.

      2-para conectarte y ver el streaming, abres VLC y das a archivo -> abrir volcado de red y pegas: rtmp://IP:1935/live/myStream suponiendo que estés emitiendo a la aplicación live e instancia myStream

      3-Para ver si tu streaming es en mp4, cuando recibas stream en VLC ve al menu herramientas -> información del codec. sino prueba a enviar un sólo fichero mp4 con el comando que te he puesto más arriba.

      4-Prueba con los programas para windows que te he dicho.

      A mi me costó mas de 4 meses dar con todo este post, todo es probar y probar…

  • Carlos

    Hola, sino es molestia , una consulta. Logro emitir correctamente, y ver la prueba desde mi máquina. El problema que tengo es que nadie más logra verlo desde otras máquinas. Supongo que debo estar haciendo algo mal. Si me puedes ayudar, muchas gracias.

    • walo

      Supongo que lo estás haciendo desde un PC dentro de casa. Necesitas un servidor con IP pública para que la gente se pueda conectar a él. Yo te puedo ofrecer servidores.

  • Israel

    Hola, interesante la información pero soy muy nuevo en esto. Compre la licencia de Wowza y ya esta instalada y corriendo en mi server =) , lo que necesito es crear rtmp:// para que mi emisión de audio pueda escucharse en un Player AAC:
    ¿es posible crear esa aplicación desde ip:8086/streammanager?
    Ya tengo mi radio creada y funcionando
    http://ip:puerto , pero como te comento necesito el rtmp://ip:puerto/aplicacion , pero no he logrado entender como generarlo ¿me puedes echar una mano por favor? =)
    Gracias de ante mano, Saludos!

    • walo

      Hola Israel, el puerto se pude cambiar si es lo que buscas, pero no desde el streammanager sino modificando ficheros de configuración de wowza. Para generar la instancia de la aplicación, solo lo generas a la hora de emitir y a la hora de reproducir. Si no me has entendido, contacta por email o teléfono.

      Un saludo.

      • Israel

        Que tal, Gracias ya he logrado crear el rtmp creando ficheros vía SFTP y funciona! =)
        Como te comentaba lo que necesito es hacer que transmita en el Player AAC , el audio funciona perfecto pero parece que algo anda mal, no muestra animación del player, tampoco la imagen del mp3 que esta sonando.
        Me dicen que es error de de Woza ó configuración tal vez =(
        Te envío algunos archivos a tu correo.
        Gracias por tu apoyo!

  • PabloLobarede

    Estimado una consulta:
    Como puedo cambiar el puerto :1935 del Wowza Media Server? Quiero cambiarlo por ejem: 1213….. Donde tengo que dirigirme para realizar esto?
    Uso Debian Server 6…

    Saludos!!

    • walo
      • Pablo

        Exelente estimado muchas gracias! Ahora otra preguntita jeje. Como puedo crear un MULTIBITRATE de streaming en vivo? osea que pueda transmitir a 2 calidades: 360Kb y a 150kb… Como puedo lograr hacerlo? Solo lo necesito para Streaming en Vivo. PORFAVOR me es urgente te lo agradeceria muchisimo!!
        Saludos y Gracias! Nuevamente! :D

        • walo

          Pues ahí aún no he llegado. No he tenido tiempo, por lo que de momento no te puedo ayudar… Un saludo.

  • redamiga

    Saludos, he estado siguiendo su tutorial y me he interesado en la reproducción por medio de Smil, pero me he encontrado con un error al iniciar wowza, espero puedas darme luz al respecto,mucha gracias:

    Error starting: java.lang.reflect.InvcationtargetException

    java.lang.reflect.InvocationtargetException

    at sun.reflect.NativeMethodAccessorimpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorimpl.invoke0(Unkown Source)
    at sun.reflect.DelegatingMethodAccessorimpl.invoke0(Unkown Source)
    at java.lang.reflect.Method.invoke0(Unkown Source)
    at com.wonza.wms.bootstrap.bootstrap.start(Bootstrap.java:249)
    at com.wonza.wms.bootstrap.bootstrap.main(Bootstrap.java:48)
    Caused by: java.lang.NoSuchMethodError: com.wonza.util.StringUtils.isEmpty(Ljava/lang/String;)Z
    at com.wonza.wms.pluging.collection.serverlistener.ServerListenerStreamPublisher.inServerInit(ServerListenerStreamPublisher.java:19)
    at com.wonza.wms.server.Server.notifyServerInit(Unknown Source)
    … 6 more

  • Yajaira

    Gracias por el tutorial, pero una pregunta, tendras otro tutorial para publicar video en vivo(rtpm) en Facebook? si lo tienes te lo agradeceria bastante :D

    • walo

      Hola Yajaira. En este tutorial he explicado cómo emitir vídeo en directo. Supongo que para integrarlo con FB, lo único que tienes que hacer es poner el link a la página donde esta el reproductor que está reproduciendo el stream.

  • walo

    Con esos datos no puedo ayudar…