Projet

Général

Profil

StreamingVideo » Historique » Version 8

Laurent GUERBY, 12/02/2013 09:56

1 1 Laurent GUERBY
{{>toc}}
2 1 Laurent GUERBY
3 1 Laurent GUERBY
h1. StreamingVideo
4 1 Laurent GUERBY
5 5 Laurent GUERBY
h2. Liens
6 5 Laurent GUERBY
7 5 Laurent GUERBY
http://blog.sesse.net/blog/tech/TG/2012-05-12-22-03_tcp_optimization_for_video_streaming
8 5 Laurent GUERBY
9 7 Laurent GUERBY
h2. THSF2013
10 7 Laurent GUERBY
11 7 Laurent GUERBY
https://pad.tetalab.org/p/regie
12 7 Laurent GUERBY
13 8 Laurent GUERBY
h2. Flotube
14 8 Laurent GUERBY
15 8 Laurent GUERBY
Discussion : http://lists.tetalab.org/pipermail/tetaneutral/2013-February/001526.html
16 8 Laurent GUERBY
17 8 Laurent GUERBY
Prototype : http://flomoto.no-ip.org/flotube/
18 8 Laurent GUERBY
19 8 Laurent GUERBY
P2P streaming : http://torrentfreak.com/open-source-giant-vlc-mulls-bittorrent-support-130211/
20 8 Laurent GUERBY
21 1 Laurent GUERBY
h2. Solution N7
22 1 Laurent GUERBY
23 1 Laurent GUERBY
<pre>
24 1 Laurent GUERBY
From: 	Antoine Lubineau
25 1 Laurent GUERBY
To: 	technique@lists.tetaneutral.net
26 1 Laurent GUERBY
Subject: 	[technique] Streaming vidéo net7
27 1 Laurent GUERBY
Date: 	Sat, 07 Apr 2012 01:15:55 +0200
28 1 Laurent GUERBY
29 1 Laurent GUERBY
30 1 Laurent GUERBY
Bonsoir,
31 1 Laurent GUERBY
32 1 Laurent GUERBY
Ce mail est un peu dans la suite du mail sur sur la Novela [0]. Comme on 
33 1 Laurent GUERBY
fait du streaming vidéo à net7 (club info de l’ENSEEIHT [1]) depuis 
34 1 Laurent GUERBY
assez longtemps, ça peut être pas mal d’échanger là-dessus.
35 1 Laurent GUERBY
36 1 Laurent GUERBY
— Contexte : plusieurs fois dans l’année, il y a des shows organisés par 
37 1 Laurent GUERBY
le club vidéo de l’école et on les diffuse en direct sur Internet. La 
38 1 Laurent GUERBY
configuration actuelle tourne depuis environ un an (c’était une 
39 1 Laurent GUERBY
acquisition vidéo analogique avant), et on a eu 75 spectateurs 
40 1 Laurent GUERBY
simultanés pendant la dernière édition.
41 1 Laurent GUERBY
42 1 Laurent GUERBY
— Schéma de principe :
43 1 Laurent GUERBY
44 1 Laurent GUERBY
   vidéo ––––
45 1 Laurent GUERBY
             \__   machine  __[réseau ]_ serveur __[Internet]__ client
46 1 Laurent GUERBY
             /   d’encodage   [interne]  Icecast                  web
47 1 Laurent GUERBY
   audio ————
48 1 Laurent GUERBY
49 1 Laurent GUERBY
— Machine d’encodage : une carte d’acquisition BlackMagic Design 
50 1 Laurent GUERBY
Intensity Pro [2], parce que pas chère et dispose de drivers, d’un SDK 
51 1 Laurent GUERBY
et d’utilitaires pour Linux. On utilise l’entrée HDMI pour la vidéo, et 
52 1 Laurent GUERBY
une entrée audio analogique.
53 1 Laurent GUERBY
Le processeur est un Core i7-2600K (un peu sous-exploité), et la machine 
54 1 Laurent GUERBY
tourne sous Arch Linux [3].
55 1 Laurent GUERBY
56 1 Laurent GUERBY
Le script qui tourne sur cette machine est sensiblement le suivant :
57 1 Laurent GUERBY
58 1 Laurent GUERBY
bmdcapture -m${INPUT} -F nut -f pipe:1 | ffmpeg -i - -threads 6 \
59 1 Laurent GUERBY
   -f matroska -preset ultrafast -q 0 -vcodec libx264 -acodec pcm_s16le \
60 1 Laurent GUERBY
   -y $DUMPFILE &
61 1 Laurent GUERBY
62 1 Laurent GUERBY
sleep 10
63 1 Laurent GUERBY
64 1 Laurent GUERBY
cvlc $DUMPFILE --sout "#transcode{fps=24,vcodec=theo,vb=800, \
65 1 Laurent GUERBY
   width=720,height=405,threads=2,acodec=vorb,ab=128, \
66 1 Laurent GUERBY
   channels=2, deinterlace}: \
67 1 Laurent GUERBY
   duplicate{dst=std{access=file,mux=ogg,dst=$OGVFILE}, \
68 1 Laurent GUERBY
             dst=std{access=shout,mux=ogg, \
69 1 Laurent GUERBY
                     dst=$LOGIN:$PASSWD@$SERVER:$PORT/live_hd.ogg}}" &
70 1 Laurent GUERBY
71 1 Laurent GUERBY
cvlc $DUMPFILE --sout "#transcode{fps=24,vcodec=theo,vb=600, \
72 1 Laurent GUERBY
   width=320,height=180,threads=2,acodec=vorb,ab=128, \
73 1 Laurent GUERBY
   channels=2,deinterlace}: \
74 1 Laurent GUERBY
   std{access=shout,mux=ogg, \
75 1 Laurent GUERBY
       dst=$LOGIN:$PASSWD@$SERVER:$PORT/live_sd.ogg}"
76 1 Laurent GUERBY
77 1 Laurent GUERBY
Pour ceux qui ne sont pas familiers de ffmpeg et VLC : on fait 
78 1 Laurent GUERBY
l’acquisition avec bmdcapture [4], qu’on passe directement à ffmpeg, qui 
79 1 Laurent GUERBY
lui enregistre un fichier peu compressé sur lequel on pourra 
80 1 Laurent GUERBY
retravailler /a posteriori/.
81 1 Laurent GUERBY
On lance ensuite deux instances de VLC : chacune va lire le MKV produit 
82 1 Laurent GUERBY
par ffmpeg. La première réencode (transcode) le flux en 720 × 405, 
83 1 Laurent GUERBY
l’enregistre (access=file) et l’envoie au serveur de streaming 
84 1 Laurent GUERBY
(access=shout), la seconde ne fait que réencoder en 320 × 180 et 
85 1 Laurent GUERBY
l’envoyer au serveur de streaming.
86 1 Laurent GUERBY
87 1 Laurent GUERBY
(À noter que depuis sa version 2, VLC a un module decklink qui permet 
88 1 Laurent GUERBY
d’acquérir depuis cette carte. On pourrait donc potentiellement tout 
89 1 Laurent GUERBY
faire avec VLC, mais on a encore des soucis de stabilité.)
90 1 Laurent GUERBY
91 1 Laurent GUERBY
— Serveur de streaming : un serveur Icecast 2 configuré pour prendre les 
92 1 Laurent GUERBY
deux sources en entrée.
93 1 Laurent GUERBY
94 1 Laurent GUERBY
— Interface web : on utilise Video.js [5], avec un repli sur Cortado [6] 
95 1 Laurent GUERBY
quand le navigateur n’est pas coopératif.
96 1 Laurent GUERBY
97 1 Laurent GUERBY
Je pense que j’ai fait le tour de l’installation. Si vous avez des 
98 1 Laurent GUERBY
remarques, des questions, des suggestions… allez-y ! ;)
99 1 Laurent GUERBY
100 1 Laurent GUERBY
Antoine
101 1 Laurent GUERBY
</pre>
102 1 Laurent GUERBY
103 1 Laurent GUERBY
[0] http://lists.tetalab.org/pipermail/tetaneutral/2012-March/000865.html
104 1 Laurent GUERBY
[1] http://net7.bde.enseeiht.fr/
105 1 Laurent GUERBY
[2] http://www.blackmagic-design.com/products/intensity/models/
106 1 Laurent GUERBY
[3] http://www.archlinux.org/
107 1 Laurent GUERBY
[4] https://github.com/lu-zero/decklink-ffmpeg
108 1 Laurent GUERBY
[5] http://videojs.com/
109 1 Laurent GUERBY
[6] http://www.flumotion.net/cortado/
110 2 Laurent GUERBY
111 2 Laurent GUERBY
h2. Questions N7
112 2 Laurent GUERBY
113 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" ?
114 2 Laurent GUERBY
# Autre ?
115 3 Mehdi Abaakouk
116 3 Mehdi Abaakouk
h2. Version N7 modifié par sileht 
117 3 Mehdi Abaakouk
118 4 Mehdi Abaakouk
<pre>
119 3 Mehdi Abaakouk
SOUT='#duplicate{
120 3 Mehdi Abaakouk
            dst="transcode{
121 3 Mehdi Abaakouk
                    vcodec=h264,venc=x264{ultrafast},acodec=s16l,threads=6
122 3 Mehdi Abaakouk
                }:std{
123 3 Mehdi Abaakouk
                    access=file,mux=mkv,dst='$MKVFILE'
124 3 Mehdi Abaakouk
                }", 
125 3 Mehdi Abaakouk
            dst="transcode{
126 3 Mehdi Abaakouk
                    fps=24,vcodec=theo,vb=800,width=720,height=405,threads=2,acodec=vorb,ab=128,channels=2,deinterlace
127 3 Mehdi Abaakouk
                }:duplicate{
128 3 Mehdi Abaakouk
                    dst=std{access=file,mux=ogg,dst='$OGVFILE'},
129 3 Mehdi Abaakouk
                    dst=std{access=shout,mux=ogg,dst='$LOGIN':'$PASSWD'@'$SERVER':'$PORT'/live_hd.ogg}
130 3 Mehdi Abaakouk
                }", 
131 3 Mehdi Abaakouk
            dst="transcode{
132 3 Mehdi Abaakouk
                    fps=24,vcodec=theo,vb=600,width=320,height=180,threads=2,acodec=vorb,ab=128,channels=2,deinterlace
133 3 Mehdi Abaakouk
                }:std{
134 3 Mehdi Abaakouk
                    access=shout,mux=ogg,dst='$LOGIN':'$PASSWD'@'$SERVER':'$PORT'/live_sd.ogg
135 3 Mehdi Abaakouk
                }" 
136 3 Mehdi Abaakouk
        }'
137 3 Mehdi Abaakouk
138 3 Mehdi Abaakouk
# Remove space
139 3 Mehdi Abaakouk
SOUT=$(echo $SOUT | sed 's/ //g' )
140 3 Mehdi Abaakouk
141 1 Laurent GUERBY
bmdcapture -m${INPUT} -F nut -f pipe:1 | cvlc - --sout "$SOUT" "$@"
142 4 Mehdi Abaakouk
</pre>
143 3 Mehdi Abaakouk
144 3 Mehdi Abaakouk
NB:
145 3 Mehdi Abaakouk
146 3 Mehdi Abaakouk
Sous debian ou ubuntu:
147 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)
148 3 Mehdi Abaakouk
pour que vlc puisse utilise libavcodec (ie:ffmpeg) correctement, il faut bien installer les dépots medibuntu ou debian multimedia
149 6 Élie Bouttier
150 6 Élie Bouttier
h2. Nouvelle version de l’N7, basé sur les modifications de sileht, et objectif futur
151 6 Élie Bouttier
152 6 Élie Bouttier
h3. Nouvelle version
153 6 Élie Bouttier
154 6 Élie Bouttier
À venir …
155 6 Élie Bouttier
156 6 Élie Bouttier
h3. Objectifs futurs
157 6 Élie Bouttier
158 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) :
159 6 Élie Bouttier
* VP80 + vorbis (voir opus) dans du webm, pour les navigateurs html5;
160 6 Élie Bouttier
* h264 + mp3 dans du mp4, lu en flash pour les navigateurs non html5.
161 6 Élie Bouttier
Il faudra alors utiliser la dernière version de icecast, celle dans les dépots de squeeze ne supportant pas le webm.
162 6 Élie Bouttier
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 :)