Projet

Général

Profil

StreamingVideo » Historique » Version 4

« Précédent - Version 4/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

  1. Quelle est la latence entre une image et sa retransmission aux différentes étapes ? Est-ce qu'elle vient du "sleep 10" ?
  2. 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}
                }", 
            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'@'$SERVER':'$PORT'/live_sd.ogg
                }" 
        }'

# 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