Cómo hacer streams de video?
(usando software y codecs libres!)

Esta breve e informal “documentacion” proviene de anotaciones personales, cut and paste del intento y error. En vista de que no aparecia nada similar en google me di a la tarea de poner un poco las cosas en orden en un solo lugar, afortunadamente en el canal de #altred aparecio mas gente que exploro aun más y mejor el tema. No dude en dejar preguntas o comentarios para asi poder mejorarlo. ikks de slec ya lo ha hecho, la ha mejorado y esta en su wiki aca:
http://www.slec.net/HacerStreamDeVideoConSoftwareyCodecsLibres
Usaremos freej de www.dyne.org que se encargara de controlar tanto la webcam con sus efectos y creacion de titulos como el stream de video que enviaremos al servidor de icecast encargado de distribuirlo.
Esperamos partir de equipos que ya tienen resuelta la configuración de video. Es decir que ya tienen un kernel configurado para video4linux (v4l - /dev/videoX) definido. Si ud. debe empezar de cero, configurando su webcam le recomendamos el siguiente enlace:
1.Cómo saber si la webcam a mano funciona bajo linux?:Usb Devices
Allí podran descubrir que driver corresponde a su dispositivo de video y será cuestion de buscar via google, sourceforge.net o en los foros de la distro de gnu/linux que usan las maneras de instalar los modulos correspondientes. El comando dmesg es tu amigo, conecta y desconecta la webcam, lee el dmesg y sabras como la reconoce el sistema. Buena suerte!
Confiando que la configuración del driver de la webcam haya ido por buen camino (hay tantas distros que seria muy extenso describir el proceso aca) pasamos a:
2. comprobar via lsmod que el modulo que soporta nuestra camara esta cargado, podemos invocarlo via: modprobe pwc pwc obedece en mi caso al driver de la webcam que uso, una philips. Para la cual obtuve los modulos aca: www.saillard.org/linux/pwc/
Es importante tener claro que freej es una herramienta para mezclar video en tiempo real y que se puede jugar con video sin hacer necesariamente un stream (emisión en tiempo real a traves de internet) para hacer el stream necesitamos de un servidor de internet que se encarge de distribuir la señal. El servidor puede estar instalado dentro de nuestra maquina y servir directamente a clientes que se conectan a ella (freej usara un http://localhost:8000/mistream.ogg tus colegas lo veran en http://mi.direccion.ip:8000/mistream.ogg); tambien podemos emitir usando como (target) blanco un servidor remoto. En cualquiera de ambos casos el servidor debera tener instalado un software llamado icecast y la versión que acá recomendamos es una parchada para poder emitir video, asi que no intente descargar las que estan en los diferentes repositorios de software libre ya que pocas de ellas soportan Theora/video. Tendras que compilarlo manualmente.
El icecast a utilizar se encuentra aca: http://mediacast1.com/~karl/ version icecast-2.3-kh3a en funcionamiento.
(nota:No intente ningun truco usando otro, ya que este esta parchado y los que estan en debian u otros repositorios no funcinan bien -hoy martes 4 de julio del 2006 se que en Ubuntu 6 la version de icecast si soporta el layer de video aka theora-, de todas formas ajustese al “howto”, asi no paresca escrito por un “profesional” esta probado, despues de que logre poner en marcha sus streams de video, ahi si dese a la tarea de experimentar y ayudar a corregir cosas)
Dicho server es capaz de soportar el codec de video theora que es basicamente la capa de video de vorbis (que es la de audio). Esto hace parte del proyecto ogg, si como en metallica.ogg que todos bien conocemos :P, la version libtheora-1.0alpha5 esta aprobada √.
Es necesario entonces asegurarse que todas las librerias y dependecias esten en el lugar para poder usar theora/ogg video (lib ogg, vorbis, theora, etc. de la distro que usen). icecast2 soporta theora el codec de video libre si las librerias estan en su lugar indicado en el momento de su compilacion. Teniendo todo en su lugar se debe entonces editar:
/etc/icecast2/icecast.xml
Alli se definen cosas como las claves de acceso al servidor de streams, el puerto de conexion y el mount point o lugar donde estara el stream y su nombre. Es muy importante que las rutas a donde icecast guardara los logs sean directorios donde el usuario tenga permisos para escribir (icecast no se puede correr como root) ahora si, procedemos a lanzar icecast:
icecast -c /etc/icecast2/icecast.xml
se puede comprobar que todo funciona bien cambiando en la parte de configuración de icecast.xml el password y el nombre de usuario, con el siguiente link puedes confirmar que el server esta esperando ser usado asi:
http://localhost:8000/admin/listmounts
o tambien asi:
ps aux | grep ice
Si se cuenta con un mplayer configurado para ejecutar archivos ogg, podria comprobar que el stream fluye bien, simplemente asi:
mplayer http://localhost:8000/communa.ogg
3.Es necesario para hacer “emisiones” al internet contar con un servidor icecast, luego de tenerlo en su lugar (ya sea local o remoto) y configurado con los mount points y passwords podemos pasar a usarlo (para quienes quieren usar sus propios servidores para emitir el stream aca esta la documentacion: icecast2_config_file)
4. Si todo lo anterior esta listo podemos pasar a lanzar freej, yo uso el siguiente comando:
freej /dev/video0 -s 160×120 -T 6 -V 3 -i http://www.botanica.org:8002/communa.ogg -p dont
Hay que asegurarse que el device video0 si corresponda al lugar donde monta el dispositivo (webcam) puede ser que este en video1 dependiendo de las cosas que se tengan conectadas o si se usa una tarjeta de video, etc. el flag -s en freej obecede al tamaño (size) para este caso decidimos usar 160×120 ya que es una prueba y ademas sabemos que quienes veran el stream estan de tras de modems y no tienen ancho de banda suficiente para bajar un stream de mayor tamaño. la -T en freej obedece al codec (compresion/decompresion de video) theora que es ogg video, la calidad escogida es 6, baja tambien debido a las restricciones de ancho de banda, pero se puede experimentar con numeros mayores la por defecto es 16. la -V obedece al bitrate lastimosamente no esta bien documentada por parte de sus desarrolladores asi que se debe jugar con el valor y comparar con mplayer como esta llegando la señal al otro lado, mplayer nos dira el bit rate exacto. la -i determina el lugar donde esta el servidor en caso de que queramos salir con la señal, es ahi donde se pone en juego lo que antes configuramos en el icecast. por ultimo la -p obecede al password en en servidor que recibe sl stream y debe encargarse de su distribución.
Si se quiere tener la posibilidad de sobre imponer texto al video, es necesario instalar libfreetype6, en debian:
apt-get install libfreetype6-dev
La versión de FreeJ que trae Debian en la versión estable es longeva y por lo tanto es mejor obtener las fuentes y compilar localmente, requerirá instalar varias librerías de desarrollo -dev como la previamente mencionada para completar la compilación exitósamente, No se preocupe, no es dificil pero si bastante gratificante. La versión actual de FreeJ es la 0.8.1. Si usted compiló theora como en la sección anterior, descárguelo y adelante.
Nota: Kysucix, developer de FreeJ acaba de agregar la opción que permite determinar el número de cuadros por segundo a lo que emitiremos -f <#fps>, si Ud. se siente con ganas de tener la versión más fresca del codigo hagalo via subversion en:
svn co svn://code.dyne.org/rastasoft
Para un stream de solo video (sin audio) se puede agregar el flag -a.
Ahora el ultimo y mas importante paso, para iniciar el stream desde freej usar la siguiente combinacion de teclas:
ctrl+w
y empezara el stream!!
Podra comprobar su señal de salida tal como se explico al final del paso #2.
No olvide dejar dudas, comentarios y errores expresados en los comentarios ahi abajo intentaremos responder y dar una mano si es posible. si tiene una mejor palabra para reemplazar streams, no dude en decirnosla tambien.
February 28th, 2006 at 9:51 am
Hola,
Hace mucho tiempo que busco un programa para Linux para grabar vídeos con mi webcam a un fichero local pero sin ningún resultado. Ahora con lo del streaming que comentas veo la posibilidad pero tal vez sepas de una opción de freej u otro programa para hacerlo directamente.
En caso de que la opción pasara por usar el streaming con icecast, ¿podrías extender la explicación de la configuración de icecast? ¿el punto de montaje hace referencia al fichero mediante el que accedes al streaming? ¿debe estar situado en algún lugar espacialmente? ¿debe estar creado o se crea automágicamente por freej o icecast?
Gracias por la ayuda.
February 28th, 2006 at 4:21 pm
hola, oye freej teh graba por defecto el fichero en .ogg video no tienes que configurar nada ni decirle a freej que lo haga ya que como me respondio alguno vez uno de sus developers “si ya lo estas encodeando generando un temporal, pues ahi lo estas grabando”
freej te guardara cada sesion que inicies con ctrtl-w como freej-1.ogg y asi sucesivamente. solo busca en tu discoduro ahi estaran los archivos.
/btk