Projet

Général

Profil

StreamingVideo » Historique » Version 15

P.G Bareges, 29/05/2013 11:20

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 14 Laurent GUERBY
Voir aussi [[GStreamer]]
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 12 P.G Bareges
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 1 Laurent GUERBY
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 1 Laurent GUERBY
fait du streaming vidéo à net7 (club info de l’ENSEEIHT [1]) depuis 
98 1 Laurent GUERBY
assez longtemps, ça peut être pas mal d’échanger là-dessus.
99 1 Laurent GUERBY
100 1 Laurent GUERBY
— Contexte : plusieurs fois dans l’année, il y a des shows organisés par 
101 1 Laurent GUERBY
le club vidéo de l’école et on les diffuse en direct sur Internet. La 
102 1 Laurent GUERBY
configuration actuelle tourne depuis environ un an (c’était une 
103 1 Laurent GUERBY
acquisition vidéo analogique avant), et on a eu 75 spectateurs 
104 1 Laurent GUERBY
simultanés pendant la dernière édition.
105 1 Laurent GUERBY
106 1 Laurent GUERBY
— Schéma de principe :
107 1 Laurent GUERBY
108 1 Laurent GUERBY
   vidéo ––––
109 1 Laurent GUERBY
             \__   machine  __[réseau ]_ serveur __[Internet]__ client
110 1 Laurent GUERBY
             /   d’encodage   [interne]  Icecast                  web
111 1 Laurent GUERBY
   audio ————
112 1 Laurent GUERBY
113 1 Laurent GUERBY
— Machine d’encodage : une carte d’acquisition BlackMagic Design 
114 1 Laurent GUERBY
Intensity Pro [2], parce que pas chère et dispose de drivers, d’un SDK 
115 1 Laurent GUERBY
et d’utilitaires pour Linux. On utilise l’entrée HDMI pour la vidéo, et 
116 1 Laurent GUERBY
une entrée audio analogique.
117 1 Laurent GUERBY
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 1 Laurent GUERBY
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 1 Laurent GUERBY
Pour ceux qui ne sont pas familiers de ffmpeg et VLC : on fait 
142 1 Laurent GUERBY
l’acquisition avec bmdcapture [4], qu’on passe directement à ffmpeg, qui 
143 1 Laurent GUERBY
lui enregistre un fichier peu compressé sur lequel on pourra 
144 1 Laurent GUERBY
retravailler /a posteriori/.
145 1 Laurent GUERBY
On lance ensuite deux instances de VLC : chacune va lire le MKV produit 
146 1 Laurent GUERBY
par ffmpeg. La première réencode (transcode) le flux en 720 × 405, 
147 1 Laurent GUERBY
l’enregistre (access=file) et l’envoie au serveur de streaming 
148 1 Laurent GUERBY
(access=shout), la seconde ne fait que réencoder en 320 × 180 et 
149 1 Laurent GUERBY
l’envoyer au serveur de streaming.
150 1 Laurent GUERBY
151 1 Laurent GUERBY
(À noter que depuis sa version 2, VLC a un module decklink qui permet 
152 1 Laurent GUERBY
d’acquérir depuis cette carte. On pourrait donc potentiellement tout 
153 1 Laurent GUERBY
faire avec VLC, mais on a encore des soucis de stabilité.)
154 1 Laurent GUERBY
155 1 Laurent GUERBY
— Serveur de streaming : un serveur Icecast 2 configuré pour prendre les 
156 1 Laurent GUERBY
deux sources en entrée.
157 1 Laurent GUERBY
158 1 Laurent GUERBY
— Interface web : on utilise Video.js [5], avec un repli sur Cortado [6] 
159 1 Laurent GUERBY
quand le navigateur n’est pas coopératif.
160 1 Laurent GUERBY
161 1 Laurent GUERBY
Je pense que j’ai fait le tour de l’installation. Si vous avez des 
162 1 Laurent GUERBY
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 2 Laurent GUERBY
# 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 3 Mehdi Abaakouk
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 3 Mehdi Abaakouk
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 3 Mehdi Abaakouk
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 6 Élie Bouttier
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 6 Élie Bouttier
À venir …
219 6 Élie Bouttier
220 6 Élie Bouttier
h3. Objectifs futurs
221 6 Élie Bouttier
222 6 Élie Bouttier
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 1 Laurent GUERBY
Il faudra alors utiliser la dernière version de icecast, celle dans les dépots de squeeze ne supportant pas le webm.
226 1 Laurent GUERBY
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 6 Élie Bouttier
229 6 Élie Bouttier
 
230 11 P.G Bareges
231 11 P.G Bareges
h2. Liens
232 11 P.G Bareges
233 11 P.G Bareges
http://blog.sesse.net/blog/tech/TG/2012-05-12-22-03_tcp_optimization_for_video_streaming
234 13 Laurent GUERBY
235 13 Laurent GUERBY
How To Stream Live Audio from your Mic in Real Time http://ubuntuforums.org/showthread.php?t=1544946