Projet

Général

Profil

StreamingVideo » Historique » Version 32

Laurent GUERBY, 24/12/2016 09:36

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