Taller de Streaming

Licencia de Creative Commons
Taller de Streaming by Communia is licensed under a Creative Commons Reconocimiento 4.0 Internacional License.

Aixecar un streaming a Internet de forma assequible per a tothom, sense masses costos, ni la necessitat de grans infraestructures, és possible. Amb l' Streaming podem connectar el carrer o qualsevol espai físic amb la xarxa i interactuar al moment amb la nostra comunitat.

Aquest taller fa un repàs als principals conceptes i recursos de la xarxa disponibles per a realitzar un streaming amb èxit i de manera solvent.
També inclou senzilles receptes adaptades a les situacions més habituals que requereixen d'un bon streamer.

Aquest taller és una extensió del curs: RCM: Kit de herramientas básicas para triunfar en la red també desenvolupat per Communia.

Capítol 1: Conceptes bàsics per un streaming

Streaming: El flux o corrent de dades és la tècnica associada directament a la reproducció de la informació audiovisual en temps real. La paraula "streaming" fa referència a una corrent continua sense interrupció. . Més a http://es.wikipedia.org/wiki/Streaming

Buffering: En informàtica, una memòria intermèdia o memòria intermitja, també comunament coneguda pel terme anglès buffer, és un espai de memòria RAM o en disc utilitzada per emmagatzemar dades de forma temporal. Quant el client comença a rebre el flux, va construint una memòria intermèdia per emmagatzemar les dades del flux, quan aquesta memòria comença a omplir-se el client comença a reproduir l'arxiu mentre continua transferint-se. Si en algun moment la velocitat de la connexió disminuís, la transferència de dades es veuria afectada, però la mateixa memòria intermèdia permetria continuar amb la reproducció de l'arxiu. Tot i així, si la connexió s'aturés durant més temps, la memòria es buidaria interrompent la reproducció de l'arxiu i el procés s'hauria de recomençar

Resolució: La resolució de pantalla es el número de píxels que poden ser mostrats en el vídeo per exemple 320x240, 854x480... definint així l'ample i l'altura en píxels s'obté també la relació 4:3, 16:9... Algunes resolucions s'agrupen per estàndards per exemple QVGA, WVGA ... veure http://upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Vector_Video_Standards2.svg/960px-Vector_Video_Standards2.svg.png

FPS El fotograma per segon (FPS) és una unitat de mesura que indica la velocitat a la qual un reproductor d'imatges genera diferents fotogrames. En informàtica, aquests fotogrames es troben construïts per un nombre determinat de píxels. Els FPS són inversament proporcionals al nombre de píxels de cada fotograma, ja que es necessita més temps de processament per a cada fotograma a mesura que n'augmenta el nombre de píxels.

Per veure'n més podeu dirigir-vos a glossari complet (en anglès)

Capítol 2: Xarxa

Protocols

UDP y RTSP són protocols molt utilitzats en tecnologies "streaming" ja que permeten velocitats més altes en l'entrega de dades que la que s'obté por TCP i HTTP, ja que es el flux de paquets és continuo a diferencia de TCP i HTTP en que es requereix confirmació i es re-envien els paquets perduts fins a rebre la totalitat mentre que UDP continua enviant dades al marge dels errors. Tot i així les tecnologies que utilitzarem seran sobre Http ja que majoritàriament ens interessa una visualització a través del navegador sense plugins (a excepció del popular Flash)

Ampla de banda

Ethernet vs wifi: Sempre que puguem ens interessa poder realitzar un streaming per cablejat per evitar pèrdua de paquets. Si utilitzem wifi ens arrisquem a tenir un enllaç inestable, amb pèrdua de paquets i trencar el streaming. Si realitzem un stremaing a través de wifi convencional ens hem d'assegurar tenir una cobertura estable a menys de -60 dBm (intentar obtenir sincronitzacions estables 11MG o superiors tant en Tx com en Rx). En qualsevol cas ens hem d'assegurar d'arribar amb latències baixes i sense interrupcions a la porta d'enllaç a internet.

Fibra/ADSl vs 2G/3G/4G: No és suficient estar ben connectats a un xarxa LAN amb una porta a Internet ni a una xarxa de telefonia mòbil, cal comprovar l'ampla de banda de cada xarxa cap a Internet. Alguns serveis com Bambuser http://bambuser.com/node/216441 recomanen una pujada de 100kbps. Podem comprovar amb qualsevol "speed test" com aquest http://www.speedtest.net si complim amb el requisits. La xarxa de telefonia mòbil cal tenir en compte en quina tecnologia hi estem connectats, per exemple amb una connexió de 2G amb prou feines podrem enviar un sms, mms, fitxer de text, alguna foto etc, necessitarem connexions estables com a mínim 3G.

Qualitat: Molts serveis de streaming (sobretot en contes gratuïtes) ens limitaran la qualitat en que podem enviar un vídeo encodejat per nosaltres. Tot i que algunes plataformes com Giss.tv ens permeten enviar altes resolucions al servidor, hem de ser conscients que la alta qualitat en el vídeo te un preu, no podrem enviar vídeos encodejats en altes resolucions si volem ser accessibles a qualsevol persona (no tothom pot disposar de connexions a banda ampla a Internet, o competeix la seva connexió amb altres usos... etc)

Capítol 3: Códecs, formats i plugins de vídeo

No tots els tipus de vídeo son aptes per a ser reproduïts en flux de dades, els códecs i les tecnologies de visualització més populars són:

Códecs

MPEG-4 (.mp4 .m4a .m4p .m4v .3gp .3g2:): És un format estàndard de Contenidor multimèdia, comunament utilitzat per emmagatzemar corrents d’Àudio digital i Vídeo digital, especialment aquells definits per MPEG-LA, es basa directament en el format contenidor de QuickTime d'Apple, MPEG-4 Part 14 és essencialment idèntic al format MOV. Per el vídeo utilitza H.264/MPEG-4 Part 10 or AVC i per el àudio Advanced Audio Coding (ACC). Aquest format és possible reproduir-lo directament en html5 amb navegadors com: IE, Safari i Chrome sense necessitat de plugins.

Theora (.ogg .ogv): Theora és un códec de vídeo lliure desenvolupat per la fundació Xiph.org com a part del projecte Ogg. Està basat en el códec VP3, el codi del qual la companyia On2 Technologies va donar-los-hi sota una llicència BSD. La fundació l'ha refinat i ha ampliat donant-li el mateix abast futur que el códec d'àudio Vorbis.

WebM (.webm): És un format de contenidor multimèdia dissenyat per a proporcionar un format de compressió de vídeo lliure i d'alta qualitat per utilitzar amb vídeo HTML5. El desenvolupament del projecte està patrocinat per Google. WebM inclou: VP8, Vorbis com a códec d'àudio.

Tecnologies de visualització:

Flash Video (.flv): Flash Vídeo és un format contenidor propietari de "Adobe Systems Incorporated" utilitzat per transmetre vídeo per Internet utilitzant el plugin "Adobe Flash Player". Tot i que alguns li auguren poc futur, ara mateix és el format més popular a Internet per a la distribució de vídeo en streaming (sobretot sota demanada). Utilitza el códec H.264.

HTML5: HTML5 <vídeo> és un element introduït a l'especificació HTML5 para el tractament i reproducció de vídeos a la web. HTML5 Vídeo es concebut pels seus creadors la nova forma estàndard per mostrar vídeo en línia, però la seva implementació s'ha vist obstaculitzada per la falta d'acord en quant a quins són els formats de vídeo que han de ser compatibles amb l'element <vídeo>.

La guerra del vídeo

Actors:

MPEG-LA: MPEG LA es una organització d'empreses que tenen una col·lecció de patents de software que, segons diuen, son essencials per l'aplicació de formats de vídeo MPEG, inclòs el H.264. MPEG LA no està relacionat amb el grup d'estendards MPEG. Algunes d'aquestes empreses són: Apple Inc, DAEWOO, France Télécom, Fujitsu Limited, Hitachi, Ltd., Koninklijke Philips Electronics N.V., LG Electronics Inc., Microsoft Corporation, Mitsubishi Electric Corporation, Panasonic Corporation, Samsung Electronics Co., Sharp Corporation, Siemens AG, Sony Corporation, Ericsson, Toshiba Corporation...

Fundació Mozilla: Fundació en pro d'una "comunitat global dedicada a construir productes i tecnologies lliures, de codi obert, que millorin l'experiència en línia de la gent a tot arreu [...] treballem per a assegurar-nos que la xarxa segueix sent un recurs públic, compartit i obert. Creiem que els estàndards oberts activen i atorguen capacitat d'elecció i innovació, i que tothom i de tot arreu té dret a l'experiència en línia més segura, ràpida i millor possible." Responsables del conegut navegador Firefox que sempre ha apostat per Ogg Theora, més tard per webm, i sembla que pròximament tindrà suport per h.264. No pertany a la MPEG-LA

Google: Coneguda companyia que no pertany a la MPEG-LA, va comprar el còdec VP8 i el va alliberar de patents sota el projecte WebM

FSF: Free Software Foundation, fundació que pressiona per alliberar patents entre altres coses

W3C: El World Wide Web Consortium (W3C) és un consorci internacional que treballa per a desenvolupar i promocionar estàndards per al World Wide Web. El dirigeix Tim Berners-Lee, creador del WWW i autor de les especificacions de l'Uniform Resource Locator, l'HTTP i l'HTML, que són les seves principals tecnologies d'aquesta xarxa.

Fets:

MPEG-LA te les patents del h.264 i es reserva alguns drets com fer pagar a softwars que utilitzin el seu còdec. http://www.muylinux.com/2010/03/02/y-seguimos-dandole-vueltas-al-h-264

W3C implementa l'element <video> a les especificacions del estàndard de HTML5 però no especifica quins códecs seran estàndard.

Flash: La companyia Adobe perd força en l'hegemonia de la utilització de la tecnologia flash per l'animació a la web amb discrepàncies amb altres grans companyies com Apple.

Firefox, Opera i alguns navegadors que no formen part de la MPEG-la i respectuosos amb els estàndards de la web adopten códecs lliures per implementar el vídeo html5.

Google: mitjançant la compra de l'empresa On2 compra el còdec VP8 i el re-formula en el projecte WebM per fer un códec lliure de patents i més modern que Theora.

El moviment del software lliure i en pro de la web oberta llança varies campanyes per demanar un estàndard obert per el video. per exemple http://www.fsf.org/blogs/community/google-free-on2-vp8-for-youtube

MPEG-LA fa gratis el seu còdec fins el 2015 per usuaris finals, frenant així experiments de youtube o vimeo amb video html5 http://my.opera.com/haavard/blog/2010/02/04/h264-trickery

Continguts: La gran galeria de vídeos de la xarxa (youtube) utilitza encara ara per defecte Flash amb h.264.

Firefox es rendeix? anuncia que donarà suport al còdec h.264 en la versió mòbil "We lost one battle, but the war goes on" http://hacks.mozilla.org/2012/03/video-mobile-and-the-open-web

La guerra del vídeo ha acabat?? http://www.nomaspatanes.com/2012/04/video-html5-la-guerra-ha-terminado-y.html

Capítol 4: Servidors i Clients

Servidor

Plataformes obertes:

Software lliure: Icecast http://www.icecast.org

Freeware: Shoucast http://www.shoutcast.com

Serveis

Bambuser http://www.bambuser.com

Ustream http://www.ustream.tv

Giss.tv http://www.giss.tv

Justin.tv http://es.justin.tv

Stickam http://stickam.com

Feedocast http://www.freedocast.com

Livestream http://www.livestream.com

Make.tv http://make.tv

Clients

Software de pujada

FME (Flash Media Live Encoder per a windows i Mac) http://www.adobe.com/products/flash-media-encoder.html

Clients mòbil de cada servei (android iOS)

Clients web flash

TSS (GNU/Linux) http://gollum.artefacte.org/tss/

FFmpeg - gstreameer (GNU/Linux)

Realització:

WebCamStudio (GNU/Linux) http://es.ws4gl.org/ veure vídeo de WebcamStudio + Ustream aquí: http://www.youtube.com/watch?feature=player_embedded&v=QoXtcaWwsP0#!

Hardware

Capturadora de vídeo

Webcams (video4linux)

Handicam DV 1394

Audio mescladora vs micro

Recepta 1: Bambuser desde smartphone amb Android

Resum Recepta
Corba aprenentatge | Molt baixa
Movilitat | Molt alta
Realització | No
Dificultat | Fàcil
Calitat transimissió | Baixa
Hardware | Telefon smartphone

Ingredients:

Telèfon intel·ligent amb sistema operatiu Android

Aplicació de Bambuser per a Android [1]

Connexió a Internet per 3G i/o Wifi

Pas a pas

Instal·lar software: Obrim l'aplicació "Play Store" de google, busquem Bambuser i seleccionem descarregar/instal·lar

crear compte: Per anar ràpid obrim el navegador https://bambuser.com/signup i omplim el formulari per demanar una conta a Bambuser (això també ho podem fer directament des de l'aplicació Android però potser és més incomode)

Configurar:

Càmera: podem triar la càmera en el cas que el nostre mòbil disposi de mes d'un càmera

Vídeo resolution i video quality: podem triar varies resolucions i determinar un perfil per a connexions baixes, es especialment interessant utilitzar resolucions molt baixes si anem en connexions precàries (telefonia mòbil, wifi),.

store unset data: interessant opció en que el mòbil guarda algunes dades que potser no han pogut ser enviades i les envia més tard per el vídeo que queda guardat en arxiu

title of brodcast: configurar e titulo del vídeo

archive bordcast: permetre guardar copia en el servidor de Bambuser del vídeo

brodcast in private: fer el vídeo privat

brodcast location: adjuntar dades de geolocalizació

authorization mode: configurem si l'aplicació ha de guardar el usuari i contrasenya

username i password: configurem l'accés a la nostra compte

Recepta 2: webcam i client web Flash

Resum Recepta
Corba aprenentatge | Normal
Movilitat | Mitja
Realització | No
Dificultat | Fàcil
Calitat transimissió | Baixa
Hardware | ordinador, webcam

Ingredients:

Portàtil o ordinador d'escriptori

Navegador web amb flash plugin instal·lat

Webcam

Connexió intenet per ethernet o wifi

Pas a pas

crear compte: Per anar ràpid obrim el navegador http://www.ustream.tv/login-signup i omplim el formulari per demanar una conta a Ustream.

Seguir la guia que proporcionen Ustream http://www.ustream.tv/get-started

Signup

Connectar webcam USB

Crear un canal

Permetre que la web de Ustream pugi manipular a través del plugin de Flash la webcam i el micròfon

Assegurar-se que la càmera i el micròfon estiguin llistats i seleccionats

modificar paràmetres de qualitat si es considera precís

Començar broadcast

Recepta 3: giss.tv amb handicam

Resum Recepta
Corba aprenentatge | Alta
Movilitat | Baixa
Realització | No
Dificultat | Fàcil
Calitat transimissió | Normal
Hardware | Ordinador, Handicam, Capturadora de video

Ingredients:

Càmera Handicam

Tss - Theora Streaming Studio [2] o Qice

Ordinador portàtil o d'escriptori

Capturadora de vídeo

Pas a pas

Instal·lar software Tss o Quice

Crear mountpoint a giss.tv

configurar client de giss.tv

Recepta 4: multisources

Resum Recepta
Corba aprenentatge | Alta
Movilitat | Baixa
Realització | No
Dificultat | Alta
Calitat transimissió | Normal
Hardware | Ordinador, Handicam, Capturadora de video

Ingredients:

Camera Handicam

Capturadora de video

Ordinador

Pas a pas

Per a realitzar streams a varies fonts a la vegada nosaltres utilitzem gstreamer i ffmpeg directament des del intèrpret de comandaments en bash, això ens permet tenir major control del video i poder enviar fonts de stream a varies fonts, així com no dependre del plugin de flash.

Pas 1 creació de dispositius video

Creem els dispositius virtuals a partir de un dispositiu de video existent(en aquest cas video1):

Script :

   sudo rmmod v4l2loopback
sudo modprobe v4l2loopback devices=4
echo "Duplicant dev video1 a /dev/video2 /dev/video3 /dev/video4 /dev/video5"
gst-launch v4l2src device=/dev/video1 ! \
tee name="vdev1" ! queue !  ffmpegcolorspace ! v4l2loopback device="/dev/video2" vdev1. ! \
tee name="vdev2" ! queue !  ffmpegcolorspace ! v4l2loopback device="/dev/video3" vdev2. ! \
tee name="vdev3" ! queue !  ffmpegcolorspace ! v4l2loopback device="/dev/video4" vdev3. ! \
queue !  ffmpegcolorspace ! v4l2loopback device="/dev/video5"

Pas 2 nom de tarjeta d'audio

Hem de saber també el nom de la tarjeta d'audio d'on volem capturar amb

   pacmd list-cards | grep name

i agafem l'entrada que volguem. Si no detecta la tarjeta usb fem un

   killall pulseaudio

i tornem a veure si la detecta amb

   pacmd list-cards | grep name

En cas que no detecti bé l'entrada usb cal fer:

   pactl load-module module-alsa-source device="hw:1,0"
   #(subsituint hw:1,0 pel dispo que toqui es pot mirar: cat /proc/asound/cards ).

Script stream-audio-sources.sh:

   #!/bin/bash
echo "=============================================="
echo  "pots triar entre aquestes entrades : \033[1m \n"
LANG=C pactl list | grep -A2 'Source #' | grep 'Name: ' | cut -d" " -f2
echo  '\033[0m'
echo "=============================================="
echo "falta usb?? (y/n) (sortira de nou la llista de tarjetes)"
read usb
if [ $usb == "y" ]
    then
	pactl load-module module-alsa-source device="hw:1,0"
fi

Hem de tenir en compte amb quin dispositiu volem treballar, sempre fem ús dels virtuals (loops) per video i pulseaudio per audio (per bloquejar els dispositius)

a més...

Pels propers scripts s'han de substituir elements com v4l2src device="_____" o pulsesrc device="_____" així com contrassenyes, usuaris i mountpoints o ips que fem servir, (a seguit podem veure alguns scripts en format "____exemple")

Monitoratge

Video:

   gst-launch v4l2src device=/dev/video2 ! autovideosink

Audio:

   gst-launch pulsesrc  device="alsa_input.hw_1_0" ! autoaudiosink
(aqui hem de saber el nom del dispositiu que ens dóna LANG=C pactl list | grep -A2 'Source #' | grep 'Name: ' | cut -d" " -f2

Per Giss

Script emetent a giss:

   #usage:
#	app.sh "/dev/videoX" "audiodevicepulsename"
#example:
#	app.sh "/dev/video3" "alsa_input.usb-Burr-Brown_from_TI_USB_Audio_CODEC-00-CODEC.analog-stereo"
videodev="$1"
audiodev="$2"
echo "emetent a giss.tv"
gst-launch v4l2src device=$videodev ! queue ! ffmpegcolorspace ! ffdeinterlace ! videorate     ! video/x-raw-yuv,framerate=25/2  !  videoscale add-borders=TRUE ! video/x-raw-yuv,width=640,height=360 \
! theoraenc quality=16 ! queue \! oggmux name=mux pulsesrc device="$2" ! audio/x-raw-int,rate=44100,channels=1,depth=16 ! queue ! audioconvert ! vorbisenc ! queue ! mux. mux. \
! queue ! shout2send ip=____giss.tv port=____8000 password=____hackme mount=____mountpoint.ogg

Script per baixa qualitat(només audio):

   #usage:
#	app.sh
gst-launch pulsesrc device="____alsa_input.usb-Burr-Brown_from_TI_USB_Audio_CODEC-00-CODEC.analog-stereo" ! audio/x-raw-int,rate=22050,channels=1,depth=8 ! queue ! audioconvert ! vorbisenc quality=0.01 ! queue ! oggmux ! queue ! shout2send ip=____hack.org  port=____8000 password=____hackme mount=____mountpoint.ogg

PER BAMBUSER (gstreamer+ffmpeg) (Lamentablement aquesta opció només és possible amb usuaris de pagament de la plataforma)

Hem de saber La url de la api de bambuser. Això ho podem saber al panell de control de bambuser http://bambuser.com/encoder/fme/profile

   <output>
			<rtmp>
					<url>rtmp://0000.fme.bambuser.com/b-fme</url>
					<backup_url></backup_url>
					<stream>socunafrasemoltllargasende</stream>
			</rtmp>
	</output>

Si ajuntem la url/stream tenim la direcció on podrem enviar l'streamin en aquest cas seria:

   rtmp://0000.fme.bambuser.com/b-fme/socunafrasemoltllargasende

Creem la tuberia:(si no existeix)

   mkfifo outbambuserfif

Primer gstreamer:(cal instalar ' sudo apt-get install gst-entrans ' per lstamp):

   #usage:
#	app.sh
gst-launch v4l2src device=_____/dev/video4   ! stamp sync-margin=1 sync-interval=1     ! videorate     ! video/x-raw-yuv,width=320,height=240,framerate=20/1     ! ffmpegcolorspace     ! x264enc bitrate=368 subme=4 b-pyramid=true weightb=true     ! queue2     ! flvmux name=mux  pulsesrc device="____alsa_input.usb-Burr-Brown_from_TI_USB_Audio_CODEC-00-CODEC.analog-stereo"  ! audio/x-raw-int,rate=22050,channels=2,depth=16     ! audiorate     ! queue2 max-size-buffers=600 max-size-bytes=0 max-size-time=0     ! audioconvert     ! lamemp3enc target=1 bitrate=40 mono=true encoding-engine-quality=1 target=bitrate     ! mux. mux.     ! queue2     ! filesink location=outbambuserfif sync=false

Si tenim problemes de mides li posem un plugin de videoscale:

   gst-launch v4l2src device=_____/dev/video4   ! stamp sync-margin=1 sync-interval=1     ! videorate     ! video/x-raw-yuv,framerate=20/1     ! videoscale ! video/x-raw-yuv,width=320,height=240 ! ffmpegcolorspace     ! x264enc bitrate=368 subme=4 b-pyramid=true weightb=true     ! queue2     ! flvmux name=mux   pulsesrc device="_____alsa_input.usb-Burr-Brown_from_TI_USB_Audio_CODEC-00-CODEC.analog-stereo" ! audio/x-raw-int,rate=22050,channels=2,depth=16     ! audiorate     ! queue2 max-size-buffers=600 max-size-bytes=0 max-size-time=0     ! audioconvert     ! lamemp3enc target=1 bitrate=40 mono=true encoding-engine-quality=1 target=bitrate     ! mux. mux.     ! queue2     ! filesink location=outbambuserfif sync=false

Després ffmpeg:(cal instalar ' sudo apt-get install ffmpeg ')

   #usage:
#	app.sh
ffmpeg -y -re -i outbambuserfif -s 320x240  -vcodec flv -b 152k -g 150 -cmp 2 -subcmp 2 -mbd 2 -f flv ______rtmp://0000.fme.bambuser.com/b-fme/socunafrasemoltllargasende

I ja podem anar a bambuser dashboard.

Script per bambuser:

#usage:
#app.sh
if [ ! -e outbambuserfif ] ;
then
	mkfifo outbambuserfif
	echo "creant tuberia a `pwd`/outbambuserfif ok" ;
fi
echo "tirant gstreamer , tira  'ffmpeg -y -re -i outbambuserfif -s 320x240  -vcodec flv -b 152k -g 150 -cmp 2 -subcmp 2 -mbd 2 -f flv ____rtmp://0000.fme.bambuser.com/b-fme/socunafrasemoltllargasende' a una altra consola  (has de tirar a dins del mateix directori per la fifo)"
gst-launch v4l2src device=_____/dev/video4  ! ffdeinterlace ! stamp sync-margin=1 sync-interval=1     ! videorate     ! video/x-raw-yuv,framerate=20/1     ! videoscale \
! video/x-raw-yuv,width=320,height=240 ! ffmpegcolorspace   ! x264enc bitrate=368 subme=4 b-pyramid=true weightb=true     ! queue2  \
! flvmux name=mux   pulsesrc  device="____alsa_input.hw_1_0" ! audio/x-raw-int,rate=22050,channels=2,depth=16     ! audiorate     \
! queue2 max-size-buffers=600 max-size-bytes=0 max-size-time=0     \
! audioconvert     ! lamemp3enc target=1 bitrate=40 mono=true encoding-engine-quality=1 target=bitrate     ! mux. mux.     ! queue2 \
! filesink location=outbambuserfif sync=false