StreamingVideo » Historique » Version 3
« Précédent -
Version 3/32
(diff) -
Suivant » -
Version actuelle
Mehdi Abaakouk, 07/04/2012 11:55
StreamingVideo¶
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}
'$SERVER':'$PORT'/live_sd.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'
}"
}'
- 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