(à compléter)
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 là ou encore là. 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é.
1. Prérequis 2. Paramétrage IceCast2 3. Paramétrage ffmpeg2theora 4. Paramétrage ezstream 5. Tests
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.
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 :
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.
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
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
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 !