Grg:Streaming de audio y video con dvswitch Icecast2 y diversos medios

Objetivos
Mediante esta guia, conseguiremos realizar un streaming a giss.tv usando al menos una computadora con al menos un puerto firewire y una camara DV (con puerto firewire) y obviamente un cable firewire que tenga en cada extremo las conexiones de la computadora y la camara (ojo que hay varios tipos de conectores firewire).

firewire device (dv cam or twinpact)
dvsource-dvgrab - collects parameters from command line and config files, connects stdout to dvswitch, shells out to dvgrab which sends dv stream to stdout, thus dvswitch.

The use running dvsource-dvgrab will need read/write permission on the /dev/raw1394 node. This can be done by putting both in the video group:

KERNEL=="raw1394", GROUP="video"
 * 1) /etc/udev/rules.d/91-permissions.rules
 * 2) ieee1394 devices

y luego:

$ sudo adduser $USUARIO video

Stream de un archivo DV
dvsource-file - connects to dvswitch, reads from a file, sends to dvswitch.

Command to send a stream to http://giss.tv
dvsink-command -- ffmpeg2theora - -f dv -F 25:5 -v 1 -a 5 -c 1 -H 11025 -o - | oggfwd giss.tv 8000 $CARLFKPW /CarlFK.ogg dvsink-command -- ffmpeg2theora - -f dv -F 25:5 --speedlevel 0 -v 4 -a 0 -c 1 -H 9600 -o - | oggfwd giss.tv 8000 $PASSWORD /gulbac.ogg

Notas

 * CPU frequency scaling should be disabled on the host running the mixer because it seems to make the mixer's timing irregular, leading to dropped and duplicated frames.
 * A DV stream has a fixed bandwidth of about 36 Mbit/s and it is doubtful that current wireless networks can reliably provide this bandwidth.We recommend use of a 100 or 1000 Mbit/s switched Ethernet network between the hosts running the dvswitch system.
 * Todas las fuentes DV deben ser del mismo sistema (PAL o NTSC) y formtato (formato DV crudo o RAW) y además tienen que tener stream de audio y todos deben ser de igual frecuencia.

Instrucciones para Picure in picture:

 * 1) Select the primary video source by pressing its number key or clicking the 'A' button under its thumbnail
 * 2) Select the secondary video source by pressing Alt and its number key or clicking the 'B' button under its thumbnail
 * 3) Press P
 * 4) Drag to mark the area the secondary video source should overlay in the main display, using mouse button 1 (normally left). You can also extend the selection using mouse button 2 (normally middle). You can also cancel selection by pressing Escape.
 * 5) Press Return/Enter To cancel the effect, press Escape.

Hacer un stream DV de la pantalla del disertante y conectarlo a la PC con dvswitch
xrandr xrandr --output SALIDA --mode 800x600 aptitude install dvsource ffmpeg ffmpeg -f x11grab -s 800x600 -r 25 -i :0.0 -f s16le -i /dev/zero -ac 2 -ar 48000 -target pal-dv -b 28800 -y - |dvsource-file 192.168.1.101 -p 9000 /dev/stdin & ffmpeg -f x11grab -s 800x600 -r 25 -i :0.0 -f oss -i /dev/dsp -ac 2 -ar 48000 -target pal-dv -b 28800 -y - |dvsource-file -h 192.168.1.101 -p 9000 /dev/stdin & ssh-keygen ssh-copy-id root@TALKER_HOST
 * 1) ejecutar lo siguiente en la notebook del disertante una vez que ya vemos la imagen en el proyector
 * 1) ver cual es la salida que esta conectada al proyector (SALIDA)
 * 1) cambiamos la resolucion de video a 800x600 para que salga mejor en el streaming
 * 1) Instalamos software necesario
 * 1) encodeamos con ffmpeg lo que sale en la pantalla, el sonido es necesario enviarlo para que no haya errores en dvswitch (causa del flickering cuando usamos PiP)
 * 1) con esta linea ademas del stream de video, tambien nos traera a dvswitch el stream de sonido que esta reproduciendo la pc del disertante
 * 1) generamos la llave rsa para entrar sin pass (luego triple enter) - esto es para que funcione el script y podamos reinicializar este source en particular si se desconecta
 * 1) luego copiamos la llave en la maquina remota, en: ~.ssh/authorized_keys

Script para simplificar las cosas (usado en SFD2010 MDQ)
VENUE_NAME=ADUM EVENT=SFD2010 MIXER_HOST=192.168.1.101 MIXER_PORT=9000 TALKER_HOST=192.168.1.102 TALKER_USER=gulbac ICECAST_ADDR=giss.tv ICECAST_PORT=8000 ICECAST_PASS=hackme ICECAST_MOUNTPOINT="/gulbac.ogg" VIDEO_STREAM_WIDTH=320 VIDEO_STREAM_HEIGHT=240 VIDEO_STREAM_KBPS=230 VIDEO_STREAM_WEBCAM="/dev/video0" AUDIO_STREAM_HZ=32000 AUDIO_STREAM_KBPS=64 VIDEO_SYSTEM=pal AUDIO_INPUT_PCM=default AUDIO_INPUT_HZ=48000 AUDIO_INPUT_KBPS=64 AUDIO_INPUT_DEV="/dev/dsp" VIDEO_INPUT_KBPS=28800 VIDEO_INPUT_RES="800x600" VIDEO_INPUT_FPS=25 FILE_BASE="/video" DV_FILE_BASE="/home/comtom"
 * 1) archivo config
 * 1) ntsc|pal

source /video/config dvswitch -h $MIXER_HOST -p $MIXER_PORT & sleep 2 dvsource-file -h $MIXER_HOST -p $MIXER_PORT -l $FILE_BASE/intro.dv & sleep 1 dvsource-file -h $MIXER_HOST -p $MIXER_PORT -l $FILE_BASE/chivos.dv & sleep 1 dvsink-command -h $MIXER_HOST -p $MIXER_PORT -- ffmpeg2theora -o - -f dv - -V $VIDEO_STREAM_KBPS -x $VIDEO_STREAM_WIDTH -y $VIDEO_STREAM_HEIGHT --aspect 4:3 --deinterlace -A $AUDIO_STREAM_KBPS -c 1 -H $AUDIO_STREAM_HZ --artist "'gulBAC video team'" --date "'$(date +%Y-%m-%d)'" --location "'$VENUE_NAME'" --organization "'gulBAC'" --copyright "'gulBAC video team'" |oggfwd $ICECAST_ADDR $ICECAST_PORT $ICECAST_PASS $ICECAST_MOUNTPOINT
 * 1) !/bin/sh
 * 1) ejecutamos dvswitch y aguantamos a que termine de iniciarse dvswitch (asi conectan los dvsource)
 * 1) cargamos el sonido de la consola (en el puerto MIC)
 * 2) dvsource-alsa -h $MIXER_HOST -p $MIXER_PORT -r $AUDIO_INPUT_HZ -s $VIDEO_SYSTEM $AUDIO_INPUT_PCM & sleep 1
 * 1) Camara
 * 2) dvsource-firewire -h $MIXER_HOST -p $MIXER_PORT -c 0 & sleep 1
 * 1) Webcam
 * 2) dvsource-v4l2-dv -h $MIXER_HOST -p $MIXER_PORT $VIDEO_STREAM_WEBCAM & sleep 1
 * 1) cargamos el video de intro
 * 1) cargamos el video de YA VOLVEMOS..
 * 2) dvsource-file -h $MIXER_HOST -p $MIXER_PORT -l ya-volvemos.dv & sleep 1
 * 1) cargamos el video con los sponsors
 * 1) cargamos la pantalla del disertante
 * 2) ssh root@$TALKER_HOST su - c "'export DISPLAY=:0; ffmpeg -f x11grab -s $VIDEO_INPUT_RES -r $VIDEO_INPUT_FPS -i :0.0 -ar $AUDIO_INPUT_HZ -target pal-dv -b $VIDEO_INPUT_KBPS -y - |dvsource- file -h $MIXER_HOST -p $MIXER_PORT /dev/stdin'" $TALKER_USER & sleep 1
 * 1) con sonido (dummy, es solo para evitar el error)
 * 2) ffmpeg -f x11grab -s $VIDEO_INPUT_RES -r $VIDEO_INPUT_FPS -i :0.0 -f s16le -i /dev/zero -ac 2 -ar $AUDIO_INPUT_HZ -target pal-dv -b $VIDEO_INPUT_KBPS -y - |dvsource-file $MIXER_HOST -p $MIXER_PORT /dev/stdin & sleep 1
 * 1) con salida de sonido real
 * 2) ffmpeg -f x11grab -s $VIDEO_INPUT_RES -r $VIDEO_INPUT_FPS -i :0.0 -f oss -i $AUDIO_INPUT_DEV -ac 2 -ar $AUDIO_INPUT_HZ -target pal-dv -b $VIDEO_INPUT_KBPS -y - |dvsource-file $MIXER_HOST -p $MIXER_PORT /dev/stdin & sleep 1
 * 1) linea de pruebas
 * 2) ffmpeg -f x11grab -s 800x600 -r 25 -i :0.0 -f oss -i /dev/dsp -ac 2 -ar 48000 -target pal-dv -b 28800 -y - |dvsource-file -h 192.168.1.101 -p 9000 /dev/stdin & sleep 1
 * 1) guardamos los videos en /video/SFD10/
 * 2) dvsink-files -h $MIXER_HOST -p $MIXER_PORT $FILE_BASE/$EVENT/%H:%M:%S.dv &
 * 1) monitoreo del stream localmente (solo para chequear q esta todo OK) COMENTAR PARA USAR MENOS CPU!!!
 * 2) dvsink-command -h $MIXER_HOST -p $MIXER_PORT -- ffmpeg2theora - -f dv -F $VIDEO_INPUT_FPS:5 --speedlevel 0 -v 4 -a 0 -c 1 -H $AUDIO_STREAM_HZ -o -|mplayer -
 * 1) mandamos el streaming al servidor icecast

Notas

 * La camara no debe entrar en modo stand-by, sino al volver se perderá la conexion y hay que reiniciar DVSwitch. Para mantenerla prendida, dejarle una cinta y seguir grabando todo. Luego en la PC se graba a un archivo (o no) segun corresponda.

= Utilizando scripts de los paquetes de Debconf videoteam = dvswitch & sleep 1 xterm -e dvsource-firewire & dc-start-source firewire:patty/1 & dc-start-source firewire:patty/0 & sleep 1 dvsource-file -l /home/dvswitch/loop-debconf8.dv & dvsource-file -l /home/dvswitch/sponsors_loop.dv & xterm -e "dc-start-sink file:barney" & xterm -e "dc-start-sink icecast:daffy" & icewm-session
 * 1) setup dvswitch
 * 1) last command

Notas
dc-start-source inicializa un stream en dvswitch, dvswitch debe estar ejecutandose. dc-start-source firewire:hostname/id_puerto_firewire

dc-start-sink tipo_de_stream:hostname
 * dc-start-sink envia la salida de dvswitch como stream o a un archivo