まこと の ブログ

MaKoTo no burogu — Journal de bord…

Aller au contenu | Aller au menu | Aller à la recherche

Le live streaming avec du vieux matos et GNU/Linux

Depuis quelques temps déjà, j'avais l'envie de streamer des trucs.

  • Avec la RaspiCam on peut déjà faire des trucs rigolos, mais je voulais aller plus loin, en proposant des activités multi-caméra, par exemple, pour la réalisation d'une maquette :

Caméra 1, en plan large sur le plan de travail. (RaspiCam)
Caméra 2, en plan rapproché sous un autre angle. (Caméra DV)
Caméra 3, en macro prés des mains. (WebCam)

À la recherche d'un outil, je suis évidemment d'abord tombé sur OBS, mais il n'est malheureusement pas encore dispo pour GNU/Linux. Puis j'ai trouvé et testé l'excellent WebCamStudio qui permet de constituer un écran multi-caméra depuis plusieurs type de sources vidéo (USB, DV, IP…) et de le streamer directement sur un flux IP.
Mais ce soft étant très gourmand en ressources, mon pauvre AMD Athlon64 X2 Dual Core 5600+ ne fait pas le poids, j'ai rapidement dû faire le deuil de cette idée…

Cependant une autre solution viendrait à voir le jour, on en reparle plus bas avec SimpleScreenRecorder.

  • Plus tard, l'idée refit surface, cette fois-ci, pour streamer du jeu vidéo sur Twitch, depuis une console de jeu authentique.

Donc il faudrait une vieille carte de capture PAL/NTSC pour afficher une image du jeu lisible pour le spectateur, et une ou plusieurs autres caméras pour filmer le dispositif.
Seulement problème, mon PC et la console+TV ne sont pas dans la même pièce, et il m'est impossible de déplacer l'un ou l'autre.

Tu me diras, bah utilise un ordi portable pour streamer !

Oui, mais non en fait, puisqu'il faut pouvoir y brancher des sources vidéo dont il ne dispose pas.

Il faudrait alors utiliser un ordinateur de capture dédié, mais je n'en ai pas de suffisamment puissant pour supporter toutes ces vidéos… Alors que faire ?

dsc00387.jpg

Diviser le travail !


J'entrepris alors d'effectuer quelques tests, sur un vieux Pentium 4 sous Lubuntu 14.04 et une méthode commença alors doucement à se mettre en place.

  • En plus d'un flux audio (microphone), cet ordi de capture est capable de streamer un seul flux vidéo sur mon réseau local.

- Soit la vidéo de la console depuis la carte de capture PCI PAL/NTSC.
- Soit une caméra DV depuis la carte PCI DV.

dsc00392.jpg dsc00395.jpg

  • Ce flux serait alors lut par l'ordi de stream (évoqué en début de billet), cette fois non pas avec WebCamStudio, mais avec SimpleScreenRecorder, outil bien plus léger et performant.
  • D'autres flux locaux (RaspiCam) pourraient être lut par le PC de stream, permettant alors le multi-caméra.

Concrètement donc ?

DiagrammeCaptureTwitch01.png Deux set-up de diffusions sont possibles :

  • Le premier avec la console branchée à la TV et aussi sur la carte de capture (à l'aide d'un câble péritel maison, on en reparle dans un prochain billet) + un micro + la RaspiCam.

Le spectateur voit deux sources : le jeu capturé et un plan large du joueur devant sa TV.
Il entend le son du jeu capturé et le joueur parler dans son micro cravate.
Le joueur utilise un casque relié à la TV pour écouter le jeu et éviter de pourrir le son du spectateur.

  • Le second, avec la caméra DV qui filme l'écran de la borne + un micro + la RaspiCam.

Le spectateur voit deux sources : le jeu filmé et un plan large du joueur devant sa borne.
Il entend le son du jeu relié à la caméra et le joueur parler dans son micro cravate.
Le joueur utilise un casque relié à la borne pour écouter le jeu et éviter de pourrir le son du spectateur.



Ordi de Capture : La capture vidéo sur le stream local.

dsc00400.jpg

J'utilise pour ce faire une bonne vieille carte Maxi TV PCI 2 à base de chip Bt848, qui fonctionne parfaitement sous Linux.

  • Pour déclarer la carte à chaque démarrage, il suffit de créer un fichier qu'on nommera comme on veut :
sudo nano /etc/modprobe.d/tv

Contenant ces arguments :

options bttv card=8 tuner=3

Ou à la demande, de lancer la commande suivante :

sudo rmmod bttv && sudo modprobe bttv card=8 tuner=3

Le périphérique /dev/video0 vient d'être créé, pour plus de détails, la commande dmesg | grep tv devrait renvoyer quelque chose comme ça :

[  122.982766] bttv: driver version 0.9.19 loaded
[  122.982775] bttv: using 8 buffers with 2080k (520 pages) each for capture
[  122.986592] bttv: Bt8xx card found (0)
[  122.986619] bttv: 0: Bt848 (rev 18) at 0000:05:04.0, irq: 16, latency: 66, mmio: 0xf8a00000
[  122.986642] bttv: 0: using: Lifeview FlyVideo II (Bt848) LR26 / MAXI TV Video PCI2 LR26 [card=8,insmod option]
[  122.991044] bttv: 0: FlyVideo Radio=no RemoteControl=no Tuner=2 gpio=0x10ffff
[  122.991051] bttv: 0: FlyVideo  LR90=no tda9821/tda9820=no capture_only=no
[  122.991055] bttv: 0: tuner type=3
[  123.115150] bttv: 0: audio absent, no audio device found!

alsamixer.png

  • La sortie audio de la console devra être amplifiée avant d'être connectée dans l'entrée line in de la carte son de l'ordi.

Il faut donc s'assurer que la capture est correctement en place, ici avec : alsamixer.

  • Ensuite c'est VLC qui fait le travail :

On ouvre un périphérique de capture, et on indique les noms des périphériques vidéo et audio, ainsi que le standard, ici PAL pour une Super Nintendo.
Dans les options avancées, il faut sélectionner l'entrée vidéo, ici la 1 correspond à l'entrée composite (0=Tuner, 2=S-Vidéo), et spécifier la taille de l'image 720x576 pour du PAL. vlc01.png vlc02.png
Si on clique Lire, on devrait obtenir l'image de la console de jeu. vlc03.png

  • Pour streamer, il faut cliquer Diffuser, et suivre l'assistant :

vlc04.png Cocher Afficher localement, cliquer Ajouter une destination HTTP, activer le profil de transcodage MPEG-2+MPGA (TS) (le moins gourmand en ressources CPU),
et enfin lancer le stream.


vlc05.png vlc06.png vlc07.png vlc08.png

Ordi de Capture : La caméra DV sur le stream local.

dsc00388.jpg

  • Le packet dvgrab est requis pour permettre la capture de la caméra par le cordon DV.
sudo apt-get install dvgrab

Pour valider le fonctionnement, on peut afficher la vidéo de la caméra en local :

dgrab --format raw -  | vlc - --no-sub-autodetect-file :demux=rawdv
  • Le stream se fait en une seule ligne de commande, qui demande à VLC de transcoder le flux DV capturé par dvgrab en mp4v+mp3 et de le transporter sur HTTP:
dvgrab --format raw -  | cvlc - --no-sub-autodetect-file :demux=rawdv --sout '#transcode{vcodec=mp4v,vb=600,acodec=mp3,ab=128}:duplicate{dst=standard{access=http,mux=ts,dst=:8080}}'



Ordi de Capture : Le microphone sur le stream local

  • Le micro est vraiment compliqué à streamer, et c'est après de nombreux tests que j'ai enfin obtenu une solution viable, en utilisant une carte son USB (la carte son intégrée à la Carte Mère hw:0 étant occupée à streamer le son de la vidéo) :
avconv -f alsa -ac 1 -i hw:1,0 -acodec mp2 -b 64k -f rtp rtp://192.168.0.6:1234



Ordi de Streaming : Récupérer les flux vidéo/audio et microphone.

  • On ouvre un flux réseau avec VLC et on entre l'adresse IP et le port utilisé par l'ordi de capture

http://adresseip:port, puis on clique Lire… et surtout on oublie pas d'activer le désentrelacement ! (menu Vidéo -> Désentrelacer -> Oui)
Éventuellement aussi, forcer l'aspect ration en 4:3.
vlc09.png

Cette opération doit permettre de récupérer la vidéo et le son de jeu joué par la console, ou la vidéo et le son issu de la caméra DV.

  • Cette simple commande va permettre d'écouter le micro directement :
avplay -i rtp://@:1234 sur le client



Ordi de Streaming : Streamer sur Twitch.

  • À ce stade, on peut tout à fait utiliser OBS depuis un ordi Windows®, ou un ordi Ubuntu si tant est qu'il soit stable, et oublier tout le reste de l'article.

Car il existe maintenant un PPA pour OBS, j'ai testé un peu, l'interface est simplifiée et les fonctionnalités sont là, mais c'est pas très stable…

  • Sinon, SimpleScreenRecorder est facile à utiliser et léger pour la machine de streaming, ce qui laisse alors toute la puissance de calcul nécessaire pour compresser les images et les envoyer au serveur de stream Twitch.
  • Passé le premier écran, on peut tout de suite créer un profil Twitch qui sera rappelé à chaque fois qu'on en aura besoin.

On y indique la taille de l'écran de l'ordi de streaming à capturer, la fréquence d'image par secondes, le re-taillage de la vidéo en plus petit, puis qu'on souhaite enregistrer l'audio qui passe par les haut-parleurs (Record system speakers).
En effet, c'est celui-là même qu'on entend sur l'ordi de streaming (micro et audio de la vidéo depuis VLC), qu'on veut faire entendre à l'autre bout du stream.
Pour moi, les Backend Alsa ou PulseAudio ont été incapables de me restituer le son, et j'ai donc dû utiliser Jack.
ssr01.png ssr02.png

  • Il faut installer le démon jack et autant de plugin que de logiciel utilisé pour l'audio.

Voici donc pour installer l'interface jack et le plugin VLC :

sudo apt-get install qjackctl vlc-plugin-jack pulseaudio-module-jack

Attention, à ne pas oublier, qu'il faut démarrer Jack avant de lancer les logiciels (VLC, )
Il faudra aussi que chaque logiciel soit configuré pour utiliser Jack (VLC menu Outils -> Préférences -> Audio -> Module de sortie : Sortie audio Jack, Relancer VLC)
Des composants Jack vont apparaître à chaque logiciels lancés (et mis en lecture), et devraient être connectés automatiquement avec la sortie, comme ceci :
jack.png

  • Revenons sur SSR avec l'écran suivant sur lequel on va renseigner dans Save as, l'adresse du serveur de stream Twitch le plus proche de chez soit, récupérable à cette adresse : http://bashtech.net/twitch/ingest.php

Au bout de cette adresse, on copie/colle la clé de stream fournie par Twitch (Tableau de bord -> Clé de flux -> Afficher la clé'').

  • Pour l'encodage, indiquer le container flv et le coder vidéo libx264.

Le bit rate est à adapter au débit sortant de votre connexion internet (pour un upload de 2Mio, un bit rate de 2048 sera le maximum).
Dans le champ Custom Options, écrire la ligne suivante :

preset=fast,tune=zerolatency,minrate=2048,maxrate=2048,bufsize=2048,keyint=60

Les valeurs de minrate, maxrate et bufsize doivent être égales au bit rate. Pour plus d'info, consulter cette page.

  • Le dernier écran propose un preview très pratique, surtout pour vérifier que le son passe bien.

Reste alors à cliquer Start recording et le Stream Twitch commence !
ssr03.png ssr04.png

Ordi de Streaming : Construire un fond d'écran.

fondtwitch.png

  • Étant donné qu'on va streamer le bureau de l'ordi de streaming, on peut utiliser une image comme celle-ci, très basique, et l'afficher plein pot à l'aide d'une visionneuse d'image.

On viendra ensuite y placer les vidéos par dessus.



Ordi de Streaming : Placer les fenêtres sur le fond d'écran.

  • Les fenêtres ont des rebords et barres de menu qu'on voudrait bien masquer, chose possible avec le soft devilspie2
sudo apt-get install devilspie2

On a besoin de connaître le nom de l'application dont on va faire disparaître l'habillage de fenêtre (attention il peut être diffèrent du nom de la commande), dans un terminal, on utilise donc la commande devilspie2 en mode débug.

devilspie2 -d

Puis on lance l'application choisie, ici VLC.
Dans le terminal, le nom complet va alors s'afficher :

Application name : Lecteur multimédia VLC

C'est ce nom là qu'on va utiliser pour éditer le script lua qui se trouve dans les dossier cachés du home : ~/.config/devilspie2/vlc.lua

-- debug_print command does only print anything to stdout
-- if devilspie2 is run using the --debug option
debug_print("Window Name: " .. get_window_name());
debug_print("Application name: " .. get_application_name())
 
-- I want my Xfce4-terminal to the right on the second screen of my two-monitor
-- setup. (Strings are case sensitive, please note this when creating rule
-- scripts.)
if (get_window_name()=="Lecteur multimédia VLC") then
    -- Pour retailler et placer la fenêtre sur le bureau : x,y, xsize, ysize
    set_window_geometry(1600,300,900,700);
    -- Pour retirer la décoration de fenêtre et donc ne conserver que la vidéo
    undecorate_window();
end
  • Avant de streamer, il suffira de lancer dans un terminal :
devilspie2

Ainsi, au démarrage de VLC, la fenêtre sans aucune décoration, va se placer pile au bon endroit sur notre fond d'écran.

Conclusion :

Ouf ! ça marche, mais c'est un poil compliqué non ?
Pas tant que ça, au vu des contraintes de départ et si on fait abstraction de la partie stream avec SimpleScreenRecorder, qui pour le coup est vraiment lourde si on souhaite faire quelque chose de sympatosh.
Vivement qu'Open Broadcaster Software s'améliore pour GNU/Linux… En attendant, et au vu du service qu'il rend en comparaison de ma méthode, on peut donner des sous aux développeurs d'OBS, ce soft le mérite…

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

Fil des commentaires de ce billet