Nidal 2014 y streaming de vídeo a Youtube con Linux
martes, 6 de mayo de 2014Este año le estaba haciendo poco ó ningún caso a las cajas nido de la terraza y a sus webcams, entre otras cosas porque en años anteriores la crianza de los gorriones que las habitan suele ser un rotunda fracaso.
Pero no un fracaso extraordinario, sino un fracaso común y corriente.Y es que los gorriones normalmente ponen 5-6 huevos, nacen todos y van muriendo hasta quedar 1 ó 2 el día que toca salir del nido. De esos 1 ó 2, excepcionalmente, uno sobrevive al primer año. Si prestáis un poco de atención en estas fechas veréis que raramente a un hembra la siguen más de 1 ó 2 volantones, 3 con mucha suerte.
Eso, más o menos es lo normal (al menos es lo que yo llevo observando), lo anormal es que llegue el día en que van a echar a volar y haya en el nidal cinco polluelos (como ocurre actualmente en uno de los nidales de casa) y en un más que sorprendentemente buen estado de salud.
Así es que para celebrar el inminente acontecimiento he conectado la cámara al streaming de Youtube como os indico a continuación y de paso estreno la herramienta de Eventos en directo que apenas he tenido tiempo de probar.
Eventos en vivo
Desde hace un año (aprox. en España) Youtube ofrece la posibilidad de crear lo que ellos llaman Eventos en directo, es decir conectar y ver ( o insertar en tu página ) grabaciones que se están produciendo en ese instante, en tiempo real (o casi). Muy usado para eventos deportivos y conciertos pero también para la retransmisión de webcam y creación de vídeotutoriales (conectas la webcam y le explicas a alguien el método para hacer tal ó cual).
Existen ya varios servicios de este estilo que se han popularizado mucho en internet ( Ustream.tv o Justin.tv ) muy usados actualmente para la emisión en directo de manifestaciones o escraches e imposibilitando de esta manera el secuestro policial del material grabado ya que este se difunde públicamente en el mismo momento que se genera, vaya lo que viene siendo un canales de información en vivo y en directo de cualquiera acontecimiento público.
He probado los tres sitios comentados para la emisión de eventos en directo y creo que me voy a quedar con el de Youtube por varios motivos: Es el más popular, conocido y que llega a más gente. Dispone de soporte para gran número de navegadores y plataformas. Permite un control más personalizado de la publicidad que el canal inserta (normalmente) al inicio de la retransmisión.
Creación de eventos
Los tres sitios que he probado hasta ahora (Justin.tv, Ustream.tv y Youtube) son gratuitos. Todos insertan publicidad (normalmente al principio). Los dos primeros ofrecen la posibilidad de retirar la publicidad mediante pago del servicio. En Youtube en cambio podéis desactivar la inserción de publicidad en vuestros vídeos de forma gratuita (aunque creo que la cuenta tiene que reunir algunas condiciones previas para poder hacerlo).
Todos generan archivos de vídeo de lo emitido desde el canal que van quedando almacenados en el servidor. Todos disponen de aplicaciones/métodos para embeber los eventos en tu página web. Todos disponen de métodos de recepción del flujo de vídeo desde un terminal Linux y todos disponen de su propia aplicación web (normalmente desarrollada en Flash Macromedia) que nos permite hacer lo mismo consumiendo muchos más recursos de nuestro ordenador y obligándonos a mantener abierta la ventana del navegador mientras dure la retransmisión.
Para crear un evento en vivo en Youtube, dirígete a la página de Eventos en vivo y logéate si no lo estás. La cuenta de Youtube desde la cual quieras retransmitir debe estar confirmada (normalmente mediante SMS a tu móvil) antes de poder crear el evento, si la ya tienes confirmada llegarás a una página como esta:
Pulsa crear evento para entrar en la página de configuración. Marca la casilla de abajo «Acepto los términos…» y (IMPORTANTE) la casilla de abajo a la derecha » TIPO > Personalizar (más opciones de codificación) «.
Observa la hora de inicio del evento. Youtube permite el inicio de eventos en fracciones de 30 min. (9:00, 9:30, 10:00, … ). El inicio de tu evento debería ser posterior al momento en que empieces a enviar datos, es decir: cuando el evento empiece tu ya deberías llevar 3-4 minutos enviando flujo de vídeo. De esta manera se genera una caché que evita que la retransmisión sufra demasiados «parones».
Pulsa Crear Evento.
Entrareis en la página de configuración avanzada del evento donde debéis especificar la calidad de la «ingestión» (creo que «inyección» habría resultado menos digestivo). Para una retransmisión casera standar os aconsejo usar la Ingestión básica > 300kbs – 700Kbps (240px).
Si queréis o necesitáis eventos con muy buena calidad podéis aumentarla gradualmente hasta los HD1080, claro, siempre y cuando vuestra conexión de subida lo permita.
En el desplegable Selecciona tu codificador selecciona Otros codificadores para que la página os muestre las URLs de ingestión. No compartas esta URL.
Copia el contenido de URL del servidor principal y añádele detrás Nombre de la emisión para componer una URL aprox. como
rtmp://a.rtmp.youtube.com/live2/cuaderno-de-cam-XXXX-xxxx-XXXX-xx
Esa es la dirección donde tienes que inyectar el flujo de vídeo con ffmpeg
Después de guardar los cambios puedes cambiar arriba a «Sala de control en directo» desde donde la página te informa de si se está recibiendo o no el flujo de vídeo en condiciones ó los errores que hubiera (útil para depuración).
Configuración de FFMPEG
Una vez tenemos el espacio de emisión reservado en Youtube procedemos a rellenarlo con el video de nuestra webcam. Para ello con ffmpeg y usando la URL ofrecida por Youtube ( rtmp://xxxxx ) procedemos a codificar la imagen original al formato FLV, vídeo codec libx264 y audio codec MP3. La orden que estoy usando para emitir la señal del nidal de gorriones es:ffmpeg -loglevel fatal -f alsa -i default -ac 2 -f video4linux2 -i /dev/video7 -vcodec libx264 -f flv -r 15 -q 3 -b:v 320k -s 320x240 -acodec libmp3lame -ar 44100 -ab 128k -threads 0 -bufsize 64k -force_key_frames 0:00:01 "rtmp://a.rtmp.youtube.com/live2/cuaderno-de-cam-xxxx_xxxx_xxxx_xxxx"
En las primeras pruebas deberías quitar la opción -loglevel fatal para depurar y buscar posibles errores. Youtube es bastante pelmazo con la calidad del audio y aunque el sonido del nidal no es ninguna maravilla emite errores si le reduzco la calidad por debajo de 128k, 64k o similar.
Todos estos sistemas de streaming de vídeo también suelen dar muchos problemas si tratáis de emitir un vídeo SIN audio. Si por cualquier motivo no queréis insertar sonido os aconsejaría no anularlo sino emitir una pista vacía, por ejemplo cambiando –i default de ALSA por -i /dev/zero, de lo contrario vais a tener problemas casi seguro.
Una vez empecéis a enviar el flujo de vídeo la página de control de la emisión en Youtube os debería mostrar un mensaje del estado de emisión OPTIMO ó en su defecto información relevante sobre el origen del fallo. Si todo va como debería, desde dicha página podéis dar al PLAY para empezar la retransmisión (siempre y cuando la hora de inicio se haya cumplido) y para compartir la URL del evento.
Respetando los parámetros de configuración deberíais poder hacer la emisión con cualquier otro programa que permita retransmitir vídeo a un servidor RTMP, he preferido FFMPEG porque es mucho más liviano y lo conozco algo mejor pero igualmente VLC podría seros más cómodo.
NotaEn el tiempo en que escribía el apunte parte de los polluelos del nidal han echado a volar. Ahora solo quedan 2. Pero como se puede rebobinar y ver las grabaciones de hace 4 horas podéis que no miento y había 5 polluelos. ;)
OSuKaRu
#1/ 03 de June/2014 a 20:08:57
Otros comentarios de «OSuKaRu»
Estoy intentando transmitir mi escritorio con tu metodo. Solo cambié el "-f" poniendo "x11grab"
El caso es que , no me funciona. Me dice:
Option channels not found.
¿Ayuda, porfavor? :<
Trebol-a
#2/ 03 de June/2014 a 21:41:18
Otros comentarios de «Trebol-a»
Hola Osukaru,
tienes que cambiar algunas cosas más, con X11grab indicas que grabe usando el formato del escritorio, pero tienes que indicar QUE AREA debe grabar (-i) y sobre todo aumentar más la resolución sino con un captura de escritorio de 320 no se va a entender nada.
Ese error es probable que resulta de cambiar el formato del audio en lugar del video (observa que la linea tienen 2 -f)
No lo he probado pero algo así debería funcionar:
ffmpeg -f alsa -i default -ac 2 -video_size 1280x720 -f x11grab -i :0.0+10,10 -framerate 15 -vcodec libx264 -f flv -r 15 -q 3 -b:v 1200k -s 1280x720 -acodec libmp3lame -ar 44100 -ab 128k -threads 0 -bufsize 64k -force_key_frames 0:00:00.000 "rtmp://tu-url-youtube"
Pepe Barrascout Ortiz
#3/ 04 de June/2014 a 18:19:51
Otros comentarios de «Pepe Barrascout Ortiz»
Hola, gracias por el tutorial, bastante bien explicado. Intenté hacer la transmisión, pero al principio me aparece este error:
Unknown input format: 'alsa'
Entonces le quité lo relacionado al alsa y ahora el error es:
Unable to find a suitable output format for 'video4linux2'
¿Me podrías dar alguna idea de que error debo corregir?
Saludos.
Trebol-a
#4/ 04 de June/2014 a 18:40:53
Otros comentarios de «Trebol-a»
Hola Pepe,
todo el contenido del artículo está dirigido a Gnu/Linux, supongo que el error de "Unknown input format: 'alsa'" viene porqué estás tratando de hacerlo en Windows donde deberías cambiarlo por algún formato equivalente, algún directshow o similar, pero no te puedo ayudar más.
Pepe Barrascout Ortiz
#5/ 04 de June/2014 a 18:44:33
Otros comentarios de «Pepe Barrascout Ortiz»
Hola Trebol-A, se me olvidó decirte que estoy en Kubuntu 14.04 actualizados todos los repositorios y con 4.13.0
La última vez que usé Windows fue cuando solo existía XP :)
Trebol-a
#6/ 04 de June/2014 a 19:01:14
Otros comentarios de «Trebol-a»
Estupendo! eso es una decisión saludable!! :)
Haz en una consola ffmpeg -formats y asegurate que en la lista de formatos admitidos están ALSA y Video4linux2. En dicha lista debe salir :
...
D video4linux2,v4l2 Video4Linux2 device grab
...
DE alsa ALSA audio output
Puede ser que la compilación de Ffmpeg que estás usando no soporte alguno de los dos... seria raro, pero no muy raro.
Pepe Barrascout Ortiz
#7/ 04 de June/2014 a 20:35:53
Otros comentarios de «Pepe Barrascout Ortiz»
Gracias, logré levantar el ffmpeg, sucedía que precisamente no tenía esos formatos, no había dado cuenta pero tenía una versión antigua, pero actualizando ffmpeg se solucionó.
Ahora el problema, es que empieza a enviar la señal a Youtube y luego me aparece el mensaje:
Usa una frecuencia de fotogramas clave de dos segundos como máximo. Los fotogramas clave no se envían con la frecuencia suficiente, y esto puede producir almacenamiento en búfer. Frecuencia actual de fotogramas clave: 8.3 segundos. Los tamaños de los grupos de imágenes pueden ser incorrectos si tienes errores de transferencia.
Ahora fueron 8.3 segundos, pero ese número cambia cada vez que lo pruebo, no estoy seguro que sea por la velocidad de la señal de internet, porque ya he hecho transmisiones pero usando la opción de Hangout y no ha habido problema.
¿En cual parte de la secuencia de comandos debería de modificar para mejorar esto?
Saludos.
Trebol-a
#8/ 04 de June/2014 a 21:11:54
Otros comentarios de «Trebol-a»
Una versión antigua o demasiado moderna, en muchas aplicaciones nuevas ALSA ha desaparecido de la compilación...
La frecuencia de los keyframes olvidé ponerlo en el apunte, la puedes ajustar con -force_key_frames 0:00:00.000, ponlo al final de orden, después de bufsize,en mi caso suelo usar -force_key_frames 0:00:01 (un keyframe cada segundo) y youtube no vuelve a decir nada.
Pobrecito hablador
#9/ 07 de June/2014 a 18:40:12
Otros comentarios de «Pobrecito hablador»
Hola, estoy utilizando una webcam C270 de Logitech y el programa avconv en lugar de ffmpeg. He puesto lo de -force_key_frames pero youtube me sigue diciendo que la frecuencia de fotogramas clave es insuficiente. He probado de 50 formas cambiando varias opciones pero siempre dice lo mismo. Sabes que puede ser ?.
Gracias por el articulo. Es el unico que he encontrado que detalla como se hace esto.
Trebol-a
#10/ 07 de June/2014 a 18:54:34
Otros comentarios de «Trebol-a»
Hola, no conocía AVCONV (todos los días se aprende algo) pero viendo la documentación (http://libav.org/avconv.html) creo que la orden que tienes que usar no es force_key_frames que es una opción de ffmpeg sino segment_time 2 para forzar a que genere un segmento cada 2 segundos al principio del cual se inserta la keyframe.
Saludos.
Robotijin
#11/ 30 de October/2014 a 13:14:12
Otros comentarios de «Robotijin»
Estoy intentando lo mismo que vosotros pero me sale lo de que la frecuencia de fotogramas clave es insuficiente. ¿Cómo lo habéis resuelto? Lo hago de la misma manera que se explica aquí. Gracias.
Un saludo
Trebol-a
#12/ 30 de October/2014 a 17:36:07
Otros comentarios de «Trebol-a»
Hola Robotijín,
asegurate que en la orden ffmpeg aparece -force_key_frames 0:00:01, eso debería eliminar el error de insuficientes keyframes.
Saludos.
22 de December, 2024 @ 21:35