- Table of contents
- StreamingVideo
StreamingVideo¶
Liens¶
THSF2013¶
objectif 1 : stream des conference¶
Montage et acquisition de flux multiple en temps reel en sortie : mosaique 2 camera + un bandeau + bande son
-cam -cam --> traitements -> hdmi/dvi out (1024x768 ?) -audio -> - - udp - - - encoder -> dump disque -> vers icecast
Voir aussi GStreamer et StreamingAudio
Finalement solution dvswitch + icecast + 2 dazzle DVC100:
pg@a:~/stream$ cat alsa.sh #enregistre l'audio via alsa #!/bin/sh dvsource-alsa -h 127.0.0.1 -p 12345 hw:0,0 pg@a:~/stream$ cat run.sh #lance les 2 sources video #!/bin/sh TITLE=$1 pkill -9 ffmpeg$ sleep 2 ffmpeg -f video4linux2 -s 640x480 \ -vf "movie=/root/re.png [watermark];movie=/root/images/$TITLE.png[watermark2]; [in][watermark] overlay=10:10 [tmp]; [tmp][watermark2] overlay=0:450" \ -i /dev/video0 -target pal-dv - | \ dvsource-file /dev/stdin -h 127.0.0.1 -p 12345 & ffmpeg -f video4linux2 -s 640x480 -i /dev/video1 \ -target pal-dv - | dvsource-file /dev/stdin -h 127.0.0.1 -p 12345 & pg@a:~/stream$ cat wait.sh # a lancer entre les conferences #!/bin/sh TITLE=$1 pkill -9 ffmpeg$ sleep 2 ffmpeg -f video4linux2 -s 640x480 \ -vf "movie=/root/images/Wait.png [watermark]; [in][watermark] overlay=0:0" \ -i /dev/video0 -target pal-dv - 2>/dev/null | \ dvsource-file /dev/stdin -h 127.0.0.1 -p 12345 & pg@a:~/stream$ cat sendicecast.sh #!/bin/sh dvsink-command -h 127.0.0.1 -p 12345 -- ffmpeg2theora -i - -f dv -p pro -c 2 -H 48000 -o - | oggfwd 151.216.9.81 8000 uberpassword /live.ogg
objectif 2 : plusieurs cameras et plateau TV¶
https://pad.tetalab.org/p/regie
dans les 2 cas l'idée est de pouvoir traiter l'image en amont avec openframeworks/processing/glsl/ffgl et intégrer ca dans un "workflow" user friendly.
http://www.openframeworks.cc/
https://github.com/angeloseme/ofxRemoteCamera/blob/master/src/ofxRemoteCameraClient.cpp
http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-udpsrc.html
http://en.wikipedia.org/wiki/GLSL
http://freeframe.sourceforge.net/
http://dvswitch.alioth.debian.org/
http://www.icecast.org/
Flotube¶
Discussion : http://lists.tetalab.org/pipermail/tetaneutral/2013-February/001526.html
Prototype : http://flomoto.no-ip.org/flotube/
P2P streaming : http://torrentfreak.com/open-source-giant-vlc-mulls-bittorrent-support-130211/
Solution N7¶
From: Antoine Lubineau To: technique@lists.tetaneutral.net Subject: [technique] Streaming vidéo net7 Date: Sat, 07 Apr 2012 01:15:55 +0200 Bonsoir, Ce mail est un peu dans la suite du mail sur sur la Novela [0]. Comme on fait du streaming vidéo à net7 (club info de l’ENSEEIHT [1]) depuis assez longtemps, ça peut être pas mal d’échanger là-dessus. — Contexte : plusieurs fois dans l’année, il y a des shows organisés par le club vidéo de l’école et on les diffuse en direct sur Internet. La configuration actuelle tourne depuis environ un an (c’était une acquisition vidéo analogique avant), et on a eu 75 spectateurs simultanés pendant la dernière édition. — Schéma de principe : vidéo –––– \__ machine __[réseau ]_ serveur __[Internet]__ client / d’encodage [interne] Icecast web audio ———— — Machine d’encodage : une carte d’acquisition BlackMagic Design Intensity Pro [2], parce que pas chère et dispose de drivers, d’un SDK et d’utilitaires pour Linux. On utilise l’entrée HDMI pour la vidéo, et une entrée audio analogique. Le processeur est un Core i7-2600K (un peu sous-exploité), et la machine tourne sous Arch Linux [3]. Le script qui tourne sur cette machine est sensiblement le suivant : bmdcapture -m${INPUT} -F nut -f pipe:1 | ffmpeg -i - -threads 6 \ -f matroska -preset ultrafast -q 0 -vcodec libx264 -acodec pcm_s16le \ -y $DUMPFILE & sleep 10 cvlc $DUMPFILE --sout "#transcode{fps=24,vcodec=theo,vb=800, \ width=720,height=405,threads=2,acodec=vorb,ab=128, \ channels=2, deinterlace}: \ duplicate{dst=std{access=file,mux=ogg,dst=$OGVFILE}, \ dst=std{access=shout,mux=ogg, \ dst=$LOGIN:$PASSWD@$SERVER:$PORT/live_hd.ogg}}" & cvlc $DUMPFILE --sout "#transcode{fps=24,vcodec=theo,vb=600, \ width=320,height=180,threads=2,acodec=vorb,ab=128, \ channels=2,deinterlace}: \ std{access=shout,mux=ogg, \ dst=$LOGIN:$PASSWD@$SERVER:$PORT/live_sd.ogg}" Pour ceux qui ne sont pas familiers de ffmpeg et VLC : on fait l’acquisition avec bmdcapture [4], qu’on passe directement à ffmpeg, qui lui enregistre un fichier peu compressé sur lequel on pourra retravailler /a posteriori/. On lance ensuite deux instances de VLC : chacune va lire le MKV produit par ffmpeg. La première réencode (transcode) le flux en 720 × 405, l’enregistre (access=file) et l’envoie au serveur de streaming (access=shout), la seconde ne fait que réencoder en 320 × 180 et l’envoyer au serveur de streaming. (À noter que depuis sa version 2, VLC a un module decklink qui permet d’acquérir depuis cette carte. On pourrait donc potentiellement tout faire avec VLC, mais on a encore des soucis de stabilité.) — Serveur de streaming : un serveur Icecast 2 configuré pour prendre les deux sources en entrée. — Interface web : on utilise Video.js [5], avec un repli sur Cortado [6] quand le navigateur n’est pas coopératif. Je pense que j’ai fait le tour de l’installation. Si vous avez des remarques, des questions, des suggestions… allez-y ! ;) Antoine
[0] http://lists.tetalab.org/pipermail/tetaneutral/2012-March/000865.html
[1] http://net7.bde.enseeiht.fr/
[2] http://www.blackmagic-design.com/products/intensity/models/
[3] http://www.archlinux.org/
[4] https://github.com/lu-zero/decklink-ffmpeg
[5] http://videojs.com/
[6] http://www.flumotion.net/cortado/
Questions N7¶
- Quelle est la latence entre une image et sa retransmission aux différentes étapes ? Est-ce qu'elle vient du "sleep 10" ?
- Autre ?
Version N7 modifié par sileht¶
SOUT='#duplicate{ dst="transcode{ vcodec=h264,venc=x264{ultrafast},acodec=s16l,threads=6 }:std{ access=file,mux=mkv,dst='$MKVFILE' }", dst="transcode{ fps=24,vcodec=theo,vb=800,width=720,height=405,threads=2,acodec=vorb,ab=128,channels=2,deinterlace }:duplicate{ dst=std{access=file,mux=ogg,dst='$OGVFILE'}, dst=std{access=shout,mux=ogg,dst='$LOGIN':'$PASSWD'@'$SERVER':'$PORT'/live_hd.ogg} }", dst="transcode{ fps=24,vcodec=theo,vb=600,width=320,height=180,threads=2,acodec=vorb,ab=128,channels=2,deinterlace }:std{ access=shout,mux=ogg,dst='$LOGIN':'$PASSWD'@'$SERVER':'$PORT'/live_sd.ogg }" }' # Remove space SOUT=$(echo $SOUT | sed 's/ //g' ) bmdcapture -m${INPUT} -F nut -f pipe:1 | cvlc - --sout "$SOUT" "$@"
NB:
Sous debian ou ubuntu:
Par défaut, vlc n'est pas autorisé à charger cette bibliothèque (y'a un problème de license dans certain cas, c'est pour ca que c'est pas intégrer par défaut)
pour que vlc puisse utilise libavcodec (ie:ffmpeg) correctement, il faut bien installer les dépots medibuntu ou debian multimedia
Nouvelle version de l’N7, basé sur les modifications de sileht, et objectif futur¶
Nouvelle version¶
À venir …
Objectifs futurs¶
Toujours utiliser video.js pour la lecture, mais changer le format de diffusion. Nous voudrions proposer au lieu de du theora + vorbis dans du ogg (le theora étant plutôt moche, surtout dès qu’il y a du mouvement), deux formats au choix (video.js s’occupant du choix suivant les possibilitées du navigateur) :- VP80 + vorbis (voir opus) dans du webm, pour les navigateurs html5;
- h264 + mp3 dans du mp4, lu en flash pour les navigateurs non html5.
Il faudra alors utiliser la dernière version de icecast, celle dans les dépots de squeeze ne supportant pas le webm.
L’utilisation de ces formats nous a été conseillé par JB. Kampf (Président de videolan) alors on espère avoir de bon résultat :)
Liens¶
http://blog.sesse.net/blog/tech/TG/2012-05-12-22-03_tcp_optimization_for_video_streaming
How To Stream Live Audio from your Mic in Real Time http://ubuntuforums.org/showthread.php?t=1544946
https://github.com/Yoric/Mozilla-Student-Projects/issues/78#issuecomment-44874421
WebRTC to icecast/shoutcast/(mubble?) gateway