Streaming video sous FreeBSD [HOWTO]

FIXME (à compléter)

Intro

Suite à cette news, je me suis dit que ca serait sympa de streamer le flux de ma webcam sur le net (quelle originalité! j'en suis ému).

N'ayant jamais streamé de flux vidéo, je me suis dit que cette expérience pouvait intéresser des lutins qui s'acharnent en ce moment sur la VoIP.

Voici le plan d'action :

FLUX VIDEO => mencoder => fmpeg2theora => ezstream => icecast2 => DIFFUSION          

La différence a l'air moindre mais elle est majeure : le flux initial brut (exemple avec une webcam) est compressé en temps réel ce qui autorise une sortie vidéo potable avec un débit moindre (ie. streamer sur internet).

Bref, vous l'aurez compris, si vous cherchez à lire votre divx favori dans votre lit ou jardin, ce n'est pas ici qu'il faut aller, mais plutôt ou encore . En fin de compte sur des medias plus adaptés en bande passante (Ethernet, Wireless, whatever), le but ici étant de restreindre le flux sur une bande passante d'upload minime.

Hélas, il vous faudra une configuration assez musclée pour traiter le signal en temps réel. Du côté client, un soft gérant le cache sera très apprécié.

Plan

      1. Prérequis
      2. Paramétrage IceCast2
      3. Paramétrage ffmpeg2theora
      4. Paramétrage ezstream
      5. Tests

1. Prérequis

Un OS du bien est nécessaire.. la configuration de test est un Duron 1300Mhz / 256MB RAM sous FreeBSD 6.0R. Adaptez le tip selon votre OS (et faites nous part des remarques).

L'exemple utilise une webcam (Logitech QuickCam Pro 4000 USB) comme source vidéo. Mais il est bien plus simple d'utiliser un fichier MPEG par exemple.

2. Paramétrage IceCast2

IceCast2 est un serveur de streaming multimédia. Il est particulièrement efficace avec du flux ogg / theora Vorbis, ce qui a captivé tout mon intéret. L'utilisation de Theora en tant que codec est motivée par :

  • Codec libre !
  • Adapté pour le streaming MPEG4

Un petit tour dans les ports nous permet de nous mettre en jambes :

cd /usr/ports/audio/icecast2
make install clean

Créons un répertoire où mettre tout notre fourbis :

$mkdir ~/streaming
cp /usr/local/share/icecast/doc/icecast_minimal.xml.dist ~/streaming/icecast.xml

N'oubliez pas de changer les passwords par défaut.

3. Paramétrage ffmpeg2theora

ffmpeg2theora va nous permettre d'encoder un flux (celui de la webcam en l'occurence) en theora vorbis. Le problème est qu'il n'est pas dans les ports, et qu'il va falloir le patcher légèrement pour le faire fonctionner correctement.

ffmpeg2theora a besoin d'un ffmpeg récent, allons donc le chercher :

cd /usr/ports/multimedia/ffmpeg-devel/
make -DWITH_OPTIMIZED_CFLAGS install clean

Passons maintenant à ffmpeg2theora :

cd ~/streaming
fetch http://www.v2v.cc/~j/ffmpeg2theora/ffmpeg2theora-0.16.tar.bz2
tar xvzf ffmpeg2theora-0.16.tar.bz2
cd ffmpeg2theora-0.16

Il va nous falloir appliquer ces deux petits diff que j'ai préparé pour vous :

--- ffmpeg2theora-0.16/configure        Mon Feb  6 23:44:37 2006
+++ ffmpeg2theora-0.16.patched/configure        Thu Apr 13 17:15:16 2006
@@ -18867,6 +18867,7 @@
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
   pkg_cv_FFMPEG_LIBS=`$PKG_CONFIG --libs "libavformat libavcodec" 2>/dev/null`
+  pkg_cv_FFMPEG_LIBS+="-lpthread"
 else
   pkg_failed=yes
 fi
--- ffmpeg2theora-0.16/ffmpeg2theora.c  Sat Feb 11 15:13:31 2006
+++ ffmpeg2theora-0.16.patched/ffmpeg2theora.c  Thu Apr 13 15:49:37 2006
@@ -38,7 +38,7 @@

 #include "theorautils.h"

-#ifdef __linux__
+#ifdef __FreeBSD__
   #define VIDEO4LINUX_ENABLED
 #endif

Le dernier n'est pas vraiment nécessaire, sauf si vous avez une carte d'acquisition. Dans ce cas, adaptez le diff selon votre OS.

S'ensuit un grand classique :

#./configure && gmake && gmake install

4. Paramétrage ezstream

Ezstream va nous permettre d'envoyer le flux streamé sur un serveur Icecast. Il permet d'invoquer, par exemple, ffmpeg2theora par rapport à un flux.

cd /usr/ports/audio/ezstream
make install clean
cp /usr/local/share/doc/ezstream/ezstream_reencoding_example_vorbis.xml ~/streaming/ezstream-files.xml

Dans le cas où vous souhaitez utiliser une webcam, l'entrée stdin de ezstream sera plus appropriée : modifiez le ezstream-files comme suit :

cd ~/streaming
cp ezstream-files.xml ezstream-stdin.xml
--- ezstream-files.xml  Tue Apr 18 15:24:56 2006
+++ ezstream-stdin.xml  Tue Apr 18 15:33:40 2006
@@ -5,8 +5,8 @@
          reencoding, this is the format to reencode to, if not
          then you need to make sure all your input files are in this
          format.  -->
-    <format>VORBIS</format>
-    <filename>tracks.m3u</filename>
+    <format>THEORA</format>
+    <filename>stdin</filename>
     <!-- The following settings are used to describe your stream
          to the server.  It's up to you to make sure the
          bitrate/quality/samplerate/channels

Puis supprimez toute la balise <reencode> de manière recursive

N'oubliez pas de modifier les mots de passe d'accès au serveur Icecast

5. Tests

D'abord, démarrer le serveur icecast :

icecast -c ~/streaming/icecast.xml

Après m'être arraché les cheveux pour récupérer le signal de ma webcam, voici la ligne salvatrice :

mencoder -quiet -nosound -ovc lavc -lavcopts vcodec=mpeg2video -demuxer 26 -rawvideo on:fps=30:w=320:h=240:i420 /dev/video0 -o /dev/stdout | ffmpeg2theora -v 3 --nosound -x 160 -y 120 --inputfps 30 -o /dev/stdout - 2>/dev/null | ezstream -c ezstream-stdin.xml

OUF !!

Je vous conseille de régler auparavant votre cam et de regarder la sortie de ffmpeg2theora.. vous pourrez jouer avec la résolution et le bitrate pour obtenir un flux sympa.

Lors de mes tests j'ai pu observer qu'un flux de 2KBps en upload était possible avec une qualité pas si moche !

freebsd/fbsd_stream_video.txt · Last modified: 2010/01/12 13:29 (external edit)