Projet

Général

Profil

StreamingVideo » Historique » Version 31

Laurent GUERBY, 03/06/2014 09:06

1 1 Laurent GUERBY
{{>toc}}
2 1 Laurent GUERBY
3 1 Laurent GUERBY
h1. StreamingVideo
4 1 Laurent GUERBY
5 5 Laurent GUERBY
h2. THSF2013
6 7 Laurent GUERBY
7 12 P.G Bareges
h3. objectif 1 : stream des conference
8 9 P.G Bareges
9 12 P.G Bareges
Montage et acquisition de flux multiple en temps reel en sortie : mosaique 2 camera  + un bandeau + bande son
10 9 P.G Bareges
<pre>
11 9 P.G Bareges
-cam   
12 9 P.G Bareges
-cam    -->  traitements -> hdmi/dvi out (1024x768 ?) 
13 1 Laurent GUERBY
-audio                   -> - - udp - - - encoder -> dump disque
14 1 Laurent GUERBY
                                                  -> vers icecast
15 1 Laurent GUERBY
16 9 P.G Bareges
</pre>
17 9 P.G Bareges
18 30 Thierry Boudet
Voir aussi [[GStreamer]] et [[StreamingAudio]]
19 14 Laurent GUERBY
20 15 P.G Bareges
Finalement solution dvswitch + icecast + 2 dazzle DVC100:  
21 15 P.G Bareges
<pre>
22 15 P.G Bareges
23 15 P.G Bareges
pg@a:~/stream$ cat alsa.sh #enregistre l'audio via alsa 
24 15 P.G Bareges
#!/bin/sh
25 15 P.G Bareges
dvsource-alsa -h 127.0.0.1 -p 12345 hw:0,0
26 15 P.G Bareges
27 15 P.G Bareges
28 15 P.G Bareges
pg@a:~/stream$ cat run.sh #lance les 2 sources video
29 15 P.G Bareges
#!/bin/sh
30 15 P.G Bareges
TITLE=$1
31 15 P.G Bareges
32 15 P.G Bareges
pkill -9 ffmpeg$
33 15 P.G Bareges
sleep 2
34 15 P.G Bareges
35 15 P.G Bareges
ffmpeg -f video4linux2 -s 640x480 \
36 15 P.G Bareges
-vf "movie=/root/re.png [watermark];movie=/root/images/$TITLE.png[watermark2]; [in][watermark] overlay=10:10 [tmp]; [tmp][watermark2] overlay=0:450" \
37 15 P.G Bareges
-i /dev/video0 -target pal-dv -  | \
38 15 P.G Bareges
dvsource-file /dev/stdin -h 127.0.0.1 -p 12345 &
39 15 P.G Bareges
ffmpeg -f video4linux2 -s 640x480  -i /dev/video1  \
40 15 P.G Bareges
-target pal-dv - | dvsource-file /dev/stdin -h 127.0.0.1 -p 12345 &
41 15 P.G Bareges
42 15 P.G Bareges
pg@a:~/stream$ cat wait.sh # a lancer entre les conferences
43 15 P.G Bareges
#!/bin/sh
44 15 P.G Bareges
TITLE=$1
45 15 P.G Bareges
46 15 P.G Bareges
pkill -9 ffmpeg$
47 15 P.G Bareges
sleep 2
48 15 P.G Bareges
ffmpeg -f video4linux2 -s 640x480 \
49 15 P.G Bareges
-vf "movie=/root/images/Wait.png [watermark]; [in][watermark] overlay=0:0" \
50 15 P.G Bareges
-i /dev/video0 -target pal-dv - 2>/dev/null | \
51 15 P.G Bareges
dvsource-file /dev/stdin -h 127.0.0.1 -p 12345 &
52 15 P.G Bareges
53 15 P.G Bareges
pg@a:~/stream$ cat sendicecast.sh
54 15 P.G Bareges
#!/bin/sh
55 15 P.G Bareges
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
56 15 P.G Bareges
57 15 P.G Bareges
</pre>
58 15 P.G Bareges
59 15 P.G Bareges
60 11 P.G Bareges
h3. objectif 2 : plusieurs cameras et plateau TV
61 1 Laurent GUERBY
62 11 P.G Bareges
https://pad.tetalab.org/p/regie
63 12 P.G Bareges
64 7 Laurent GUERBY
65 30 Thierry Boudet
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. 
66 12 P.G Bareges
67 9 P.G Bareges
68 9 P.G Bareges
http://www.openframeworks.cc/
69 9 P.G Bareges
https://github.com/angeloseme/ofxRemoteCamera/blob/master/src/ofxRemoteCameraClient.cpp
70 9 P.G Bareges
http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-udpsrc.html
71 9 P.G Bareges
http://en.wikipedia.org/wiki/GLSL
72 9 P.G Bareges
http://freeframe.sourceforge.net/
73 1 Laurent GUERBY
74 15 P.G Bareges
http://dvswitch.alioth.debian.org/
75 15 P.G Bareges
http://www.icecast.org/
76 9 P.G Bareges
77 8 Laurent GUERBY
h2. Flotube
78 8 Laurent GUERBY
79 8 Laurent GUERBY
Discussion : http://lists.tetalab.org/pipermail/tetaneutral/2013-February/001526.html
80 8 Laurent GUERBY
81 8 Laurent GUERBY
Prototype : http://flomoto.no-ip.org/flotube/
82 8 Laurent GUERBY
83 8 Laurent GUERBY
P2P streaming : http://torrentfreak.com/open-source-giant-vlc-mulls-bittorrent-support-130211/
84 8 Laurent GUERBY
85 1 Laurent GUERBY
h2. Solution N7
86 1 Laurent GUERBY
87 1 Laurent GUERBY
<pre>
88 1 Laurent GUERBY
From: 	Antoine Lubineau
89 1 Laurent GUERBY
To: 	technique@lists.tetaneutral.net
90 30 Thierry Boudet
Subject: 	[technique] Streaming vidéo net7
91 1 Laurent GUERBY
Date: 	Sat, 07 Apr 2012 01:15:55 +0200
92 1 Laurent GUERBY
93 1 Laurent GUERBY
94 1 Laurent GUERBY
Bonsoir,
95 1 Laurent GUERBY
96 1 Laurent GUERBY
Ce mail est un peu dans la suite du mail sur sur la Novela [0]. Comme on 
97 30 Thierry Boudet
fait du streaming vidéo à net7 (club info de l’ENSEEIHT [1]) depuis 
98 30 Thierry Boudet
assez longtemps, ça peut être pas mal d’échanger là-dessus.
99 1 Laurent GUERBY
100 30 Thierry Boudet
— Contexte : plusieurs fois dans l’année, il y a des shows organisés par 
101 30 Thierry Boudet
le club vidéo de l’école et on les diffuse en direct sur Internet. La 
102 30 Thierry Boudet
configuration actuelle tourne depuis environ un an (c’était une 
103 30 Thierry Boudet
acquisition vidéo analogique avant), et on a eu 75 spectateurs 
104 30 Thierry Boudet
simultanés pendant la dernière édition.
105 1 Laurent GUERBY
106 30 Thierry Boudet
— Schéma de principe :
107 1 Laurent GUERBY
108 30 Thierry Boudet
   vidéo ––––
109 30 Thierry Boudet
             \__   machine  __[réseau ]_ serveur __[Internet]__ client
110 30 Thierry Boudet
             /   d’encodage   [interne]  Icecast                  web
111 30 Thierry Boudet
   audio ————
112 1 Laurent GUERBY
113 30 Thierry Boudet
— Machine d’encodage : une carte d’acquisition BlackMagic Design 
114 30 Thierry Boudet
Intensity Pro [2], parce que pas chère et dispose de drivers, d’un SDK 
115 30 Thierry Boudet
et d’utilitaires pour Linux. On utilise l’entrée HDMI pour la vidéo, et 
116 30 Thierry Boudet
une entrée audio analogique.
117 30 Thierry Boudet
Le processeur est un Core i7-2600K (un peu sous-exploité), et la machine 
118 1 Laurent GUERBY
tourne sous Arch Linux [3].
119 1 Laurent GUERBY
120 30 Thierry Boudet
Le script qui tourne sur cette machine est sensiblement le suivant :
121 1 Laurent GUERBY
122 1 Laurent GUERBY
bmdcapture -m${INPUT} -F nut -f pipe:1 | ffmpeg -i - -threads 6 \
123 1 Laurent GUERBY
   -f matroska -preset ultrafast -q 0 -vcodec libx264 -acodec pcm_s16le \
124 1 Laurent GUERBY
   -y $DUMPFILE &
125 1 Laurent GUERBY
126 1 Laurent GUERBY
sleep 10
127 1 Laurent GUERBY
128 1 Laurent GUERBY
cvlc $DUMPFILE --sout "#transcode{fps=24,vcodec=theo,vb=800, \
129 1 Laurent GUERBY
   width=720,height=405,threads=2,acodec=vorb,ab=128, \
130 1 Laurent GUERBY
   channels=2, deinterlace}: \
131 1 Laurent GUERBY
   duplicate{dst=std{access=file,mux=ogg,dst=$OGVFILE}, \
132 1 Laurent GUERBY
             dst=std{access=shout,mux=ogg, \
133 1 Laurent GUERBY
                     dst=$LOGIN:$PASSWD@$SERVER:$PORT/live_hd.ogg}}" &
134 1 Laurent GUERBY
135 1 Laurent GUERBY
cvlc $DUMPFILE --sout "#transcode{fps=24,vcodec=theo,vb=600, \
136 1 Laurent GUERBY
   width=320,height=180,threads=2,acodec=vorb,ab=128, \
137 1 Laurent GUERBY
   channels=2,deinterlace}: \
138 1 Laurent GUERBY
   std{access=shout,mux=ogg, \
139 1 Laurent GUERBY
       dst=$LOGIN:$PASSWD@$SERVER:$PORT/live_sd.ogg}"
140 1 Laurent GUERBY
141 30 Thierry Boudet
Pour ceux qui ne sont pas familiers de ffmpeg et VLC : on fait 
142 30 Thierry Boudet
l’acquisition avec bmdcapture [4], qu’on passe directement à ffmpeg, qui 
143 30 Thierry Boudet
lui enregistre un fichier peu compressé sur lequel on pourra 
144 1 Laurent GUERBY
retravailler /a posteriori/.
145 30 Thierry Boudet
On lance ensuite deux instances de VLC : chacune va lire le MKV produit 
146 30 Thierry Boudet
par ffmpeg. La première réencode (transcode) le flux en 720 × 405, 
147 30 Thierry Boudet
l’enregistre (access=file) et l’envoie au serveur de streaming 
148 30 Thierry Boudet
(access=shout), la seconde ne fait que réencoder en 320 × 180 et 
149 30 Thierry Boudet
l’envoyer au serveur de streaming.
150 1 Laurent GUERBY
151 30 Thierry Boudet
(À noter que depuis sa version 2, VLC a un module decklink qui permet 
152 30 Thierry Boudet
d’acquérir depuis cette carte. On pourrait donc potentiellement tout 
153 30 Thierry Boudet
faire avec VLC, mais on a encore des soucis de stabilité.)
154 1 Laurent GUERBY
155 30 Thierry Boudet
— Serveur de streaming : un serveur Icecast 2 configuré pour prendre les 
156 30 Thierry Boudet
deux sources en entrée.
157 1 Laurent GUERBY
158 30 Thierry Boudet
— Interface web : on utilise Video.js [5], avec un repli sur Cortado [6] 
159 30 Thierry Boudet
quand le navigateur n’est pas coopératif.
160 1 Laurent GUERBY
161 30 Thierry Boudet
Je pense que j’ai fait le tour de l’installation. Si vous avez des 
162 30 Thierry Boudet
remarques, des questions, des suggestions… allez-y ! ;)
163 1 Laurent GUERBY
164 1 Laurent GUERBY
Antoine
165 1 Laurent GUERBY
</pre>
166 1 Laurent GUERBY
167 1 Laurent GUERBY
[0] http://lists.tetalab.org/pipermail/tetaneutral/2012-March/000865.html
168 1 Laurent GUERBY
[1] http://net7.bde.enseeiht.fr/
169 1 Laurent GUERBY
[2] http://www.blackmagic-design.com/products/intensity/models/
170 1 Laurent GUERBY
[3] http://www.archlinux.org/
171 1 Laurent GUERBY
[4] https://github.com/lu-zero/decklink-ffmpeg
172 1 Laurent GUERBY
[5] http://videojs.com/
173 1 Laurent GUERBY
[6] http://www.flumotion.net/cortado/
174 2 Laurent GUERBY
175 2 Laurent GUERBY
h2. Questions N7
176 2 Laurent GUERBY
177 30 Thierry Boudet
# Quelle est la latence entre une image et sa retransmission aux différentes étapes ? Est-ce qu'elle vient du "sleep 10" ?
178 2 Laurent GUERBY
# Autre ?
179 3 Mehdi Abaakouk
180 30 Thierry Boudet
h2. Version N7 modifié par sileht 
181 3 Mehdi Abaakouk
182 4 Mehdi Abaakouk
<pre>
183 3 Mehdi Abaakouk
SOUT='#duplicate{
184 3 Mehdi Abaakouk
            dst="transcode{
185 3 Mehdi Abaakouk
                    vcodec=h264,venc=x264{ultrafast},acodec=s16l,threads=6
186 3 Mehdi Abaakouk
                }:std{
187 3 Mehdi Abaakouk
                    access=file,mux=mkv,dst='$MKVFILE'
188 3 Mehdi Abaakouk
                }", 
189 3 Mehdi Abaakouk
            dst="transcode{
190 3 Mehdi Abaakouk
                    fps=24,vcodec=theo,vb=800,width=720,height=405,threads=2,acodec=vorb,ab=128,channels=2,deinterlace
191 3 Mehdi Abaakouk
                }:duplicate{
192 3 Mehdi Abaakouk
                    dst=std{access=file,mux=ogg,dst='$OGVFILE'},
193 3 Mehdi Abaakouk
                    dst=std{access=shout,mux=ogg,dst='$LOGIN':'$PASSWD'@'$SERVER':'$PORT'/live_hd.ogg}
194 3 Mehdi Abaakouk
                }", 
195 3 Mehdi Abaakouk
            dst="transcode{
196 3 Mehdi Abaakouk
                    fps=24,vcodec=theo,vb=600,width=320,height=180,threads=2,acodec=vorb,ab=128,channels=2,deinterlace
197 3 Mehdi Abaakouk
                }:std{
198 3 Mehdi Abaakouk
                    access=shout,mux=ogg,dst='$LOGIN':'$PASSWD'@'$SERVER':'$PORT'/live_sd.ogg
199 3 Mehdi Abaakouk
                }" 
200 3 Mehdi Abaakouk
        }'
201 3 Mehdi Abaakouk
202 3 Mehdi Abaakouk
# Remove space
203 3 Mehdi Abaakouk
SOUT=$(echo $SOUT | sed 's/ //g' )
204 3 Mehdi Abaakouk
205 1 Laurent GUERBY
bmdcapture -m${INPUT} -F nut -f pipe:1 | cvlc - --sout "$SOUT" "$@"
206 4 Mehdi Abaakouk
</pre>
207 3 Mehdi Abaakouk
208 3 Mehdi Abaakouk
NB:
209 3 Mehdi Abaakouk
210 3 Mehdi Abaakouk
Sous debian ou ubuntu:
211 30 Thierry Boudet
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)
212 30 Thierry Boudet
pour que vlc puisse utilise libavcodec (ie:ffmpeg) correctement, il faut bien installer les dépots medibuntu ou debian multimedia
213 6 Élie Bouttier
214 30 Thierry Boudet
h2. Nouvelle version de l’N7, basé sur les modifications de sileht, et objectif futur
215 6 Élie Bouttier
216 6 Élie Bouttier
h3. Nouvelle version
217 6 Élie Bouttier
218 30 Thierry Boudet
À venir …
219 6 Élie Bouttier
220 6 Élie Bouttier
h3. Objectifs futurs
221 6 Élie Bouttier
222 30 Thierry Boudet
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) :
223 6 Élie Bouttier
* VP80 + vorbis (voir opus) dans du webm, pour les navigateurs html5;
224 1 Laurent GUERBY
* h264 + mp3 dans du mp4, lu en flash pour les navigateurs non html5.
225 30 Thierry Boudet
Il faudra alors utiliser la dernière version de icecast, celle dans les dépots de squeeze ne supportant pas le webm.
226 30 Thierry Boudet
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 :)
227 1 Laurent GUERBY
228 11 P.G Bareges
h2. Liens
229 11 P.G Bareges
230 1 Laurent GUERBY
http://blog.sesse.net/blog/tech/TG/2012-05-12-22-03_tcp_optimization_for_video_streaming
231 1 Laurent GUERBY
232 1 Laurent GUERBY
How To Stream Live Audio from your Mic in Real Time http://ubuntuforums.org/showthread.php?t=1544946
233 31 Laurent GUERBY
234 31 Laurent GUERBY
https://github.com/Yoric/Mozilla-Student-Projects/issues/78#issuecomment-44874421
235 31 Laurent GUERBY
WebRTC to icecast/shoutcast/(mubble?) gateway