<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le blog de NicoLargo &#187; gstreamer</title>
	<atom:link href="http://blog.nicolargo.com/category/open-source/gstreamer-open-source-2/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.nicolargo.com</link>
	<description>&#34;La connaissance est la seule chose qui s&#039;accroit lorsqu&#039;on la partage.&#34;</description>
	<lastBuildDate>Fri, 12 Mar 2010 13:50:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Streaming vidéo SD avec Gstreamer</title>
		<link>http://blog.nicolargo.com/2010/02/streaming-video-hd-avec-gstreamer.html</link>
		<comments>http://blog.nicolargo.com/2010/02/streaming-video-hd-avec-gstreamer.html#comments</comments>
		<pubDate>Tue, 16 Feb 2010 10:03:11 +0000</pubDate>
		<dc:creator>NicoLargo</dc:creator>
				<category><![CDATA[Open-source]]></category>
		<category><![CDATA[Réseau]]></category>
		<category><![CDATA[gstreamer]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[hd]]></category>
		<category><![CDATA[streaming]]></category>
		<category><![CDATA[X.264]]></category>

		<guid isPermaLink="false">http://blog.nicolargo.com/?p=2471</guid>
		<description><![CDATA[
Nous allons dans ce billet essayer d'optimiser le streaming d'un flux SD sur un réseau local (LAN de 100 Mbps) en utilisant le framework GStreamer.
Environnement des tests
Deux PC Ubuntu connectés sur un même switch (100 Mbps full-duplex).

PC serveur: ﻿Intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz / 2 Go RAM
PC client: ﻿Intel(R) Core(TM)2 Duo CPU E6750 @ 2.66GHz [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.nicolargo.com/wp-content/uploads/2008/06/poster-bunny-small1.jpg" rel="lightbox[2471]"><img class="alignright size-full wp-image-1010" title="poster-bunny-small.jpg" src="http://blog.nicolargo.com/wp-content/uploads/2008/06/poster-bunny-small1.jpg" alt="" width="132" height="200" /></a></p>
<p>Nous allons dans ce billet essayer d'optimiser le streaming d'un flux SD sur un réseau local (LAN de 100 Mbps) en utilisant le framework GStreamer.</p>
<h1>Environnement des tests</h1>
<p>Deux PC Ubuntu connectés sur un même switch (100 Mbps full-duplex).</p>
<ul>
<li>PC serveur: ﻿Intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz / 2 Go RAM</li>
<li>PC client: ﻿Intel(R) Core(TM)2 Duo CPU E6750 @ 2.66GHz / 1 Go RAM</li>
</ul>
<p>GStreamer version 0.10.25.</p>
<p>Vidéo source: <a href="http://mirror.bigbuckbunny.de/peach/bigbuckbunny_movies/big_buck_bunny_480p_stereo.ogg">Big Buck Bunny 480p</a></p>
<h1>Tests avec le codec X.264</h1>
<pre>Ligne de commande sur la machine générant le streaming (serveur):
<pre class="brush: bash;">
serveur&gt; gst-launch -v \
        filesrc location=&quot;../Vidéos/big_buck_bunny_480p_stereo.ogg&quot; \
        ! queue ! decodebin \
        ! queue ! videoscale method=1 ! video/x-raw-yuv,width=854,height=480 \
        ! queue ! videorate ! video/x-raw-yuv,framerate=\(fraction\)24/1 \
        ! queue ! x264enc byte-stream=true bitrate=2000 bframes=4 ref=4 me=hex subme=4 weightb=true threads=0 \
        ! queue ! rtph264pay \
        ! queue ! udpsink port=5000 host=192.168.29.150 sync=false async=false
</pre>
</pre>
<pre>Ligne de commande sur la machine recevant le streaming (client):</pre>
<pre class="brush: bash;">
client&gt; gst-launch -v udpsrc caps=&quot;application/x-rtp, media=\(string\)video, clock-rate=\(int\)90000, encoding-name=\(string\)H264, payload=\(int\)96&quot; port=5000 \
 ! queue ! rtph264depay \
 ! queue ! ffdec_h264 ! xvimagesink
</pre>
<p><strong><span style="text-decoration: underline;">Résultat:</span></strong><br />
<strong> Visuel</strong>: <span style="color: #ff0000;">vidéo saccadé (environ 2 img/sec)</span><br />
<strong> Bande passante mesurée</strong>: entre 2 et 3 Mbps<br />
<strong> Resource serveur</strong>: %CPU=135 / %MEM=5<br />
<strong> Resource client</strong>: %CPU=10 / %MEM=2</p>
<p>On ajoute un buffer juste avant le depay et le décodage (au niveau du client):</p>
<pre class="brush: bash;">
client&gt; gst-launch -v udpsrc caps=&quot;application/x-rtp, media=\(string\)video, clock-rate=\(int\)90000, encoding-name=\(string\)H264, payload=\(int\)96&quot; port=5000 \
        ! queue ! gstrtpjitterbuffer latency=3000 \
        ! queue ! rtph264depay \
        ! queue ! ffdec_h264 ! xvimagesink
</pre>
<p><strong><span style="text-decoration: underline;">Résultat:</span></strong><br />
<strong> Visuel</strong>: <span style="color: #ff6600;">vidéo beaucoup plus fluide mais variation de la gigue (accéleration de la video par moment). On a par contre un décalage de 3 secondes, donc inutilisable pour des flux lives.</span><br />
<strong> Bande passante mesurée</strong>: entre 2 et 3 Mbps<br />
<strong> Resource serveur</strong>: %CPU=140 / %MEM=6<br />
<strong> Resource client</strong>: %CPU=14 / %MEM=2</p>
<p>On modifie ensuite les paramètres d'encodage X.264 (au niveau du serveur):</p>
<pre class="brush: bash;">
serveur&gt; gst-launch -v --gst-debug-level=2 \
        filesrc location=&quot;../Vidéos/big_buck_bunny_480p_stereo.ogg&quot; \
        ! queue ! decodebin \
        ! queue ! videoscale method=1 ! video/x-raw-yuv,width=720,height=480 \
        ! queue ! videorate ! video/x-raw-yuv,framerate=\(fraction\)24/1 \
        ! queue ! x264enc vbv-buf-capacity=3000 byte-stream=true bitrate=900 subme=4 ref=2 bframes=1 b-pyramid=true weightb=true \
        ! queue ! rtph264pay \
        ! queue ! udpsink port=5000 host=192.168.29.150 sync=false async=false
</pre>
<p><strong><span style="text-decoration: underline;">Résultat:</span></strong><br />
<strong> Visuel</strong>: <span style="color: #008000;">Presque plus de sacade ni de variation de gigue. On a par contre un décalage de 3 secondes, donc inutilisable pour des flux lives.</span><br />
<strong> Bande passante mesurée</strong>: entre 2 et 3 Mbps<br />
<strong> Resource serveur</strong>: %CPU=120 / %MEM=4<br />
<strong> Resource client</strong>: %CPU=10 / %MEM=2</p>

                            <div id="aspdf">
                                <a href="http://blog.nicolargo.com/wp-content/plugins/as-pdf/generate.php?post=2471">
                                    <span> </span>
                                </a>
                            </div>
                        ]]></content:encoded>
			<wfw:commentRss>http://blog.nicolargo.com/2010/02/streaming-video-hd-avec-gstreamer.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://mirror.bigbuckbunny.de/peach/bigbuckbunny_movies/big_buck_bunny_480p_stereo.ogg" length="166825767" type="audio/ogg" />
		</item>
		<item>
		<title>Encodage de vidéo avec GStreamer</title>
		<link>http://blog.nicolargo.com/2009/11/encodage-de-video-avec-gstreamer.html</link>
		<comments>http://blog.nicolargo.com/2009/11/encodage-de-video-avec-gstreamer.html#comments</comments>
		<pubDate>Tue, 17 Nov 2009 10:59:12 +0000</pubDate>
		<dc:creator>NicoLargo</dc:creator>
				<category><![CDATA[Open-source]]></category>
		<category><![CDATA[gstreamer]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[aac]]></category>
		<category><![CDATA[encodage]]></category>
		<category><![CDATA[H.264]]></category>
		<category><![CDATA[theora]]></category>
		<category><![CDATA[vorbis]]></category>

		<guid isPermaLink="false">http://blog.nicolargo.com/?p=2442</guid>
		<description><![CDATA[Si vous suivez régulièrement ce blog, vous savez que je m'intéresse au Framework multimédia GStreamer présent de base dans les systèmes d'exploitations GNU/Linux.  Nous allons dans ce billet voir comment encoder en ligne de commande une source vidéo vers des fichiers aux formats OGG (Theora/Vorbis) et/ou MP4 (H264/AAC).
Pourquoi ces formats ?
Je me limite à ces deux [...]]]></description>
			<content:encoded><![CDATA[<p>Si vous suivez régulièrement ce blog, vous savez que je m'intéresse <a href="http://blog.nicolargo.com/category/open-source/gstreamer-open-source-2">au Framework multimédia GStreamer</a> présent de base dans les systèmes d'exploitations GNU/Linux.  Nous allons dans ce billet voir comment encoder en ligne de commande une source vidéo vers des fichiers aux formats OGG (Theora/Vorbis) et/ou MP4 (H264/AAC).<span id="more-2442"></span></p>
<h1>Pourquoi ces formats ?</h1>
<p>Je me limite à ces deux formats pour la simple et bonne raison qu'il se complète dans mon utilisation quotidienne. En effet, le format OGG (Theora/Vorbis), outre le fait qu'il soit basée sur des codecs libres, permet une intégration simplifié des vidéos dans les navigateurs supportant le HTML5 (<a href="http://blog.nicolargo.com/2009/10/utiliser-le-tag-video-html-5-dans-wordpress.html">lire ce billet</a>), de son coté le format MP4 (H264/AAC) est un standard qui permet de lire ce type de fichiers sur une PlayStation 3.</p>
<h1>Avant d'encoder...</h1>
<p>Avant de commencer, il faut choisir une source de bonne qualité. Les codecs ne font pas des miracles et si la source est mauvaise, les fichiers encodés le seront aussi. Pour mes tests, j'ai récupéré un trailer haute définition sur le site <a href="http://www.hd-trailers.net/">HD-Trailers.net</a>.  Les caractéristiques du fichier sont les suivantes:</p>
<pre class="brush: bash;">
ffmpeg -i shutterisland-tlr1r2r_h720p.mov
Duration: 00:02:22.27, start: 0.000000, bitrate: 6178 kb/s
Stream #0.0(eng): Video: h264, yuv420p, 1280x544, 23.98 tbr, 23.98 tbn, 47.95 tbc
Stream #0.1(eng): Audio: aac, 48000 Hz, 5.1, s16
</pre>
<p>Pour jouer cette vidéo sur votre machine, il faut saisir la pipeline suivante:</p>
<pre class="brush: bash;">
gst-launch filesrc location=~/Vidéos/shutterisland-tlr1r2r_h720p.mov ! decodebin name=decoder \
 decoder. ! queue ! audioconvert ! audioresample ! autoaudiosink \
 decoder. ! queue ! ffmpegcolorspace ! autovideosink
</pre>
<p>Voici le résultat:</p>
<p style="text-align: center;">Le fichier source a une talle de <strong>11 Mo</strong></p>
<p style="text-align: center; "><img class="size-full wp-image-2443 aligncenter" title="shutterisland-tlr1r2r_h720p.mov" src="http://blog.nicolargo.com/wp-content/uploads/2009/11/shutterisland-tlr1r2r_h720p.mov.jpg" alt="shutterisland-tlr1r2r_h720p.mov" width="640" height="272" /><em><span style="color: #808080;">Fichier source</span></em></p>
<h1>Comment encoder ?</h1>
<h2>En basse qualité</h2>
<p>Nous obtiendrons ici des fichiers dont la taille sera réduite mais avec une qualité plus basse, notamment lors des phases ou la caméra bouge beaucoup (par exemple sur les travelings).</p>
<h3>Encodage OGG (Theora/Vorbis)</h3>
<p>La pipeline:</p>
<pre class="brush: bash;">
gst-launch filesrc location=~/Vidéos/shutterisland-tlr1r2r_h720p.mov ! decodebin name=decoder \
 decoder. ! queue ! audioconvert ! vorbisenc ! queue ! \
 oggmux name=muxer \
 decoder. ! queue ! ffmpegcolorspace ! theoraenc ! queue ! \
 muxer. muxer. ! queue ! filesink location=~/Vidéos/shutterisland-tlr1r2r_h720p_lq.ogv
</pre>
<p style="text-align: center;">Le fichier a une taille <strong>1.7 Mo</strong> de donne le résultat suivant:<br />
<img class="size-full wp-image-2444 aligncenter" title="shutterisland-tlr1r2r_h720p_lq.ogv" src="http://blog.nicolargo.com/wp-content/uploads/2009/11/shutterisland-tlr1r2r_h720p_lq.ogv_.jpg" alt="shutterisland-tlr1r2r_h720p_lq.ogv" width="640" height="272" /><em><span style="color: #808080;">Fichier basse qualité OGG</span></em></p>
<h3>Encodage MP4 (H264/AAC)</h3>
<p>La pipeline:</p>
<pre class="brush: bash;">
gst-launch filesrc location=~/Vidéos/shutterisland-tlr1r2r_h720p.mov ! decodebin name=decoder \
 decoder. ! queue ! audioconvert ! faac profile=2 ! queue ! \
 ffmux_mp4 name=muxer \
 decoder. ! queue ! ffmpegcolorspace ! x264enc pass=4 quantizer=30 subme=4 threads=0 ! queue ! \
 muxer. muxer. ! queue ! filesink location=~/Vidéos/shutterisland-tlr1r2r_h720p_lq.mp4
</pre>
<p style="text-align: center;">Le fichier a une taille <strong>2 Mo</strong> de donne le résultat suivant:<br />
<img class="size-full wp-image-2445 aligncenter" title="shutterisland-tlr1r2r_h720p_lq.mp4" src="http://blog.nicolargo.com/wp-content/uploads/2009/11/shutterisland-tlr1r2r_h720p_lq.mp4.jpg" alt="shutterisland-tlr1r2r_h720p_lq.mp4" width="640" height="272" /><em><span style="color: #808080;">Fichier basse qualité MP4</span></em></p>
<h2>En moyenne qualité</h2>
<p>Nous obtiendrons ici un bon compromis entre la taille des fichiers et la qualité de l'image.</p>
<h3>Encodage OGG (Theora/Vorbis)</h3>
<p>La pipeline:</p>
<pre class="brush: bash;">
gst-launch filesrc location=~/Vidéos/shutterisland-tlr1r2r_h720p.mov ! decodebin name=decoder \
 decoder. ! queue ! audioconvert ! vorbisenc ! queue ! \
 oggmux name=muxer \
 decoder. ! queue ! ffmpegcolorspace ! theoraenc quality=32 ! queue ! \
 muxer. muxer. ! queue ! filesink location=~/Vidéos/shutterisland-tlr1r2r_h720p_mq.ogv
</pre>
<p style="text-align: center;">Le fichier a une taille <strong>2.8 Mo</strong> de donne le résultat suivant:<br />
<img class="size-full wp-image-2447 aligncenter" title="shutterisland-tlr1r2r_h720p_mq.ogv" src="http://blog.nicolargo.com/wp-content/uploads/2009/11/shutterisland-tlr1r2r_h720p_mq.ogv_.jpg" alt="shutterisland-tlr1r2r_h720p_mq.ogv" width="640" height="272" /><em><span style="color: #808080;">Fichier moyenne qualité OGG</span></em></p>
<h3>Encodage MP4 (H264/AAC)</h3>
<p>La pipeline:</p>
<pre class="brush: bash;">
gst-launch filesrc location=~/Vidéos/shutterisland-tlr1r2r_h720p.mov ! decodebin name=decoder \
 decoder. ! queue ! audioconvert ! faac profile=2 ! queue ! \
 ffmux_mp4 name=muxer \
 decoder. ! queue ! ffmpegcolorspace ! x264enc pass=4 quantizer=25 subme=5 me=2 ref=3 threads=0 ! queue ! \
 muxer. muxer. ! queue ! filesink location=~/Vidéos/shutterisland-tlr1r2r_h720p_mq.mp4
</pre>
<p style="text-align: center;">Le fichier a une taille <strong>3.6 Mo</strong> de donne le résultat suivant:<br />
<img class="size-full wp-image-2448 aligncenter" title="shutterisland-tlr1r2r_h720p_mq.mp4" src="http://blog.nicolargo.com/wp-content/uploads/2009/11/shutterisland-tlr1r2r_h720p_mq.mp4.jpg" alt="shutterisland-tlr1r2r_h720p_mq.mp4" width="640" height="272" /><em><span style="color: #808080;">Fichier moyenne qualité MP4</span></em></p>
<h2>En haute qualité</h2>
<p>Nous obtiendrons ici une très bonne qualité d'image mais une taille importante des fichiers.</p>
<h3>Encodage OGG (Theora/Vorbis)</h3>
<p>La pipeline:</p>
<pre class="brush: bash;">
gst-launch filesrc location=~/Vidéos/shutterisland-tlr1r2r_h720p.mov ! decodebin name=decoder \
 decoder. ! queue ! audioconvert ! vorbisenc ! queue ! \
 oggmux name=muxer \
 decoder. ! queue ! ffmpegcolorspace ! theoraenc quality=48 ! queue ! \
 muxer. muxer. ! queue ! filesink location=~/Vidéos/shutterisland-tlr1r2r_h720p_hq.ogv
</pre>
<p style="text-align: center;">Le fichier a une taille <strong>5 Mo</strong> de donne le résultat suivant:<br />
<img class="size-full wp-image-2449 aligncenter" title="shutterisland-tlr1r2r_h720p_hq.ogv" src="http://blog.nicolargo.com/wp-content/uploads/2009/11/shutterisland-tlr1r2r_h720p_hq.ogv_.jpg" alt="shutterisland-tlr1r2r_h720p_hq.ogv" width="640" height="272" /><em><span style="color: #808080;">Fichier haute qualité OGG</span></em></p>
<h3>Encodage MP4 (H264/AAC)</h3>
<p>La pipeline:</p>
<pre class="brush: bash;">
gst-launch filesrc location=~/Vidéos/shutterisland-tlr1r2r_h720p.mov ! decodebin name=decoder \
 decoder. ! queue ! audioconvert ! faac profile=2 ! queue ! \
 ffmux_mp4 name=muxer \
 decoder. ! queue ! ffmpegcolorspace ! x264enc pass=4 quantizer=20 subme=6 me=2 ref=3 threads=0 ! queue ! \
 muxer. muxer. ! queue ! filesink location=~/Vidéos/shutterisland-tlr1r2r_h720p_hq.mp4
</pre>
<p style="text-align: center;">Le fichier a une taille <strong>7.3 Mo</strong> de donne le résultat suivant:<br />
<img class="size-full wp-image-2450 aligncenter" title="shutterisland-tlr1r2r_h720p_hq.mp4" src="http://blog.nicolargo.com/wp-content/uploads/2009/11/shutterisland-tlr1r2r_h720p_hq.mp4.jpg" alt="shutterisland-tlr1r2r_h720p_hq.mp4" width="640" height="272" /><em><span style="color: #808080;">Fichier haute qualité MP4</span></em></p>
<h1>Pour conclure</h1>
<p>Nous avons vu dans ce billet les bases de l'encodage de fichiers vidéos avec GStreamer. Il est imporant de signaler que par la magie des pipeline, on pourrait très bien appliquer ces méthodes avec une source live comme une Webcam ou un flux venant d'un serveur de streaming vidéo.</p>
<p>Si vous avez des pipelines d'encodages que vous voulez partager avec les lecteurs de ce blog, les commentaires sont là pour ça !</p>

                            <div id="aspdf">
                                <a href="http://blog.nicolargo.com/wp-content/plugins/as-pdf/generate.php?post=2442">
                                    <span> </span>
                                </a>
                            </div>
                        ]]></content:encoded>
			<wfw:commentRss>http://blog.nicolargo.com/2009/11/encodage-de-video-avec-gstreamer.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Installation et configuration de Hanbrake sur Fedora 11</title>
		<link>http://blog.nicolargo.com/2009/10/installation-et-configuration-de-hanbrake-sur-fedora-11.html</link>
		<comments>http://blog.nicolargo.com/2009/10/installation-et-configuration-de-hanbrake-sur-fedora-11.html#comments</comments>
		<pubDate>Tue, 27 Oct 2009 10:23:32 +0000</pubDate>
		<dc:creator>NicoLargo</dc:creator>
				<category><![CDATA[Open-source]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[gstreamer]]></category>
		<category><![CDATA[fedora]]></category>
		<category><![CDATA[handbrake]]></category>

		<guid isPermaLink="false">http://blog.nicolargo.com/?p=2342</guid>
		<description><![CDATA[Un rapide billet pour installer Handbrake (le logice libre pour ripper vos DVDs) sur une distribution Fedora 11. En effet, Handbrake n'est pas disponible dans les dépôts, il faut donc passer par une installation à la mimine (il faut juste avoir quelques connaissances pour suivre ce tuto, comme le fait de savoir saisir des commandes [...]]]></description>
			<content:encoded><![CDATA[<p>Un rapide billet pour installer <a href="http://handbrake.fr/">Handbrake</a> (le logice libre pour ripper vos DVDs) sur une distribution Fedora 11. En effet, Handbrake n'est pas disponible dans les dépôts, il faut donc passer par une installation à la mimine (il faut juste avoir quelques connaissances pour suivre ce tuto, comme le fait de savoir saisir des commandes dans un terminal...) . J'en profiterai également pour vos donner ma configuration qui me permet d'encoder les DVDs pour les relire sur ma PlayStation 3.</p>
<h1>Avant de commencer</h1>
<p>On ouvre un terminal et on lance les commandes suivantes afin d'installer les librairies nécessaires à la compilation de Handbrake:</p>
<pre class="brush: bash;">sudo yum groupinstall &quot;Development Tools&quot; &quot;Development Libraries&quot; &quot;X Software Development&quot; &quot;GNOME Software Development&quot;
sudo yum install yasm zlib-devel bzip2-devel dbus-glib-devel hal-devel webkitgtk-devel libnotify-devel gstreamer-devel gstreamer-plugins-base-devel
</pre>
<h1>Installation de Handbrake</h1>
<p>On récupère la dernière version de Handbrake à parit du dépôt SVN:</p>
<pre class="brush: bash;">cd ~
mkdir src
cd src
svn checkout svn://svn.handbrake.fr/HandBrake/trunk handbrake
</pre>
<p>On lance la préparation de la compilation:</p>
<pre class="brush: bash;">cd handbrake
./configure --launch
</pre>
<p>On compile et on installe:</p>
<pre class="brush: bash;">cd build
sudo make install
</pre>
<p>Pour lancer le logiciel Handbrake, il faut aller dans le menu Applications / Son et vidéo / Handbrake (si vous êtes sous Gnome...). Et voilà le travail:</p>
<p style="text-align: left;"><a href="http://blog.nicolargo.com/wp-content/uploads/2009/10/handBrake.png" rel="lightbox[2342]"><img class="size-large wp-image-2343 aligncenter" title="HandBrake" src="http://blog.nicolargo.com/wp-content/uploads/2009/10/handBrake-1024x658.png" alt="HandBrake" width="614" height="395" /></a></p>
<h1 style="text-align: left;">Configuration d'un profil PlayStation 3</h1>
<p style="text-align: left;">On commence par cliquer sur le profil "High Profile" puis sur le bouton "Save current settings to new preset". On entre un nom et une description pour le profil:</p>
<p style="text-align: center;"><a href="http://blog.nicolargo.com/wp-content/uploads/2009/10/profilps3.png" rel="lightbox[2342]"><img class="size-full wp-image-2344 aligncenter" title="profilps3" src="http://blog.nicolargo.com/wp-content/uploads/2009/10/profilps3.png" alt="profilps3" width="395" height="204" /></a></p>
<p style="text-align: left;">J'utilise les paramètres suivants:</p>
<p style="text-align: center;"><a href="http://blog.nicolargo.com/wp-content/uploads/2009/10/screenshot_001.jpeg" rel="lightbox[2342]"><img class="size-full wp-image-2345 aligncenter" title="Handbrake-PS3-Video" src="http://blog.nicolargo.com/wp-content/uploads/2009/10/screenshot_001.jpeg" alt="Handbrake-PS3-Video" width="487" height="235" /></a></p>
<p style="text-align: center;"><a href="http://blog.nicolargo.com/wp-content/uploads/2009/10/screenshot_002.jpeg" rel="lightbox[2342]"><img class="size-full wp-image-2346 aligncenter" title="Handbrake-PS3-Audio" src="http://blog.nicolargo.com/wp-content/uploads/2009/10/screenshot_002.jpeg" alt="Handbrake-PS3-Audio" width="567" height="274" /></a></p>
<p style="text-align: center;"><a href="http://blog.nicolargo.com/wp-content/uploads/2009/10/screenshot_003.jpeg" rel="lightbox[2342]"><img class="size-full wp-image-2347 aligncenter" title="Handbrake-PS3-H264" src="http://blog.nicolargo.com/wp-content/uploads/2009/10/screenshot_003.jpeg" alt="Handbrake-PS3-H264" width="564" height="272" /></a></p>
<p style="text-align: left;">Il ne reste plus qu'a insérer un DVD dans votre lecteur, choisir le profil "PlayStation 3" et lancer l'encodage !</p>

                            <div id="aspdf">
                                <a href="http://blog.nicolargo.com/wp-content/plugins/as-pdf/generate.php?post=2342">
                                    <span> </span>
                                </a>
                            </div>
                        ]]></content:encoded>
			<wfw:commentRss>http://blog.nicolargo.com/2009/10/installation-et-configuration-de-hanbrake-sur-fedora-11.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Enregistrer une vidéo Youtube sous Ubuntu</title>
		<link>http://blog.nicolargo.com/2009/10/enregistrer-une-video-youtube-sous-ubuntu.html</link>
		<comments>http://blog.nicolargo.com/2009/10/enregistrer-une-video-youtube-sous-ubuntu.html#comments</comments>
		<pubDate>Wed, 21 Oct 2009 06:15:38 +0000</pubDate>
		<dc:creator>NicoLargo</dc:creator>
				<category><![CDATA[Open-source]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[gstreamer]]></category>
		<category><![CDATA[flv]]></category>
		<category><![CDATA[ogv]]></category>
		<category><![CDATA[telecharger]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://blog.nicolargo.com/?p=2318</guid>
		<description><![CDATA[Je viens de tomber sur un billet de How-To-Forge qui parle d'une application permettant d'enregistrer sur son disque des vidéos disponibles sur Youtube.   Le logiciel est question s'appelle Youtube-dl et nous allons voir dans ce billet ce qu'il a dans le ventre.
Installation
On commence par installer la bête sur notre OS pingouin préféré:
sudo aptitude install youtube-dl
Téléchargement d'une [...]]]></description>
			<content:encoded><![CDATA[<p>Je viens de tomber sur un billet de <a href="http://www.howtoforge.com/download-youtube-videos-with-youtube-dl-on-ubuntu-9.04">How-To-Forge</a> qui parle d'une application permettant d'enregistrer sur son disque des vidéos disponibles sur <a href="http://www.youtube.com">Youtube</a>.   Le logiciel est question s'appelle <a href="http://bitbucket.org/rg3/youtube-dl/wiki/Home">Youtube-dl</a> et nous allons voir dans ce billet ce qu'il a dans le ventre.</p>
<h1>Installation</h1>
<p>On commence par installer la bête sur notre OS pingouin préféré:</p>
<pre class="brush: bash;">sudo aptitude install youtube-dl</pre>
<h1>Téléchargement d'une vidéo YouTube</h1>
<p>Il faut d'abord se rendre avec votre navigateur Web sur la page Youtube pour y récupérer l'adresse (URL):</p>
<p style="text-align: center;"><img class="alignnone size-medium wp-image-2319" title="screenshot_011" src="http://blog.nicolargo.com/wp-content/uploads/2009/10/screenshot_011-300x190.png" alt="screenshot_011" width="300" height="190" /></p>
<p style="text-align: center;">URL = <strong>http://www.youtube.com/watch?v=zlfKdbWwruY</strong></p>
<p>Ensuite, on entre dans un terminal la commande suivante:</p>
<pre class="brush: bash;">youtube-dl -b -o whereismatt.flv http://www.youtube.com/watch?v=zlfKdbWwruY</pre>
<p>L'option <strong>-b </strong>permet d'obtenir une vidéo en qualité optimale. L'option <strong>-o whereismatt.flv</strong> configure le nom du fichier de sortie (le fichier qui sera présent sur votre disque dur). Je vous conseille de laisse l'exetension .flv qui correspond au format du fichier vidéo Youtube (Flash Video). Enfin on entre l'URL <strong><a href="http://www.youtube.com/watch?v=zlfKdbWwruY">http://www.youtube.com/watch?v=zlfKdbWwruY</a></strong>.</p>
<p>A la fin du téléchargement (la durée dépend de la rapidité de votre ligne Internet). le fichier <strong>whereismatt.flv</strong> devrait contenir la vidéo que vous pouvez lire un lecteur multimédia (comme VLC).</p>
<h1>En option, convertir le fichier dans un format libre</h1>
<p>Le format FLV (qui vit je pense ses dernières heures avec l'arrivée d'HTML 5) n'est pas libre et moi , j'aime pas ce qui n'est pas libre... donc pour convertir le fichier <strong>whereismatt.flv</strong> en <strong>whereismatt.ogv</strong> (c'est mieux non ?), j'utilise la commande:</p>
<pre class="brush: bash;">ffmpeg2theora &lt;span style=&quot;font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 18px; font-size: 12px; white-space: pre; background-color: #ffffff;&quot;&gt;whereismatt.flv&lt;span style=&quot;font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; line-height: 19px; white-space: normal; font-size: 13px;&quot;&gt;</pre>
<p>Vous devriez donc avoir à la fin un beau fichier au format conteneur OGV encodé en Theora pour la vidéo et en Vorbis pour l'audio (bref que du beau libre) !</p>
<p>Et hop danses Matt !</p>
<p style="text-align: center;"><img class="size-full wp-image-2320 aligncenter" title="screenshot_015" src="http://blog.nicolargo.com/wp-content/uploads/2009/10/screenshot_015.png" alt="screenshot_015" width="392" height="330" /></p>

                            <div id="aspdf">
                                <a href="http://blog.nicolargo.com/wp-content/plugins/as-pdf/generate.php?post=2318">
                                    <span> </span>
                                </a>
                            </div>
                        ]]></content:encoded>
			<wfw:commentRss>http://blog.nicolargo.com/2009/10/enregistrer-une-video-youtube-sous-ubuntu.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Installation complète de GStreamer sous Fedora 11</title>
		<link>http://blog.nicolargo.com/2009/10/installation-complete-de-gstreamer-sous-fedora-11.html</link>
		<comments>http://blog.nicolargo.com/2009/10/installation-complete-de-gstreamer-sous-fedora-11.html#comments</comments>
		<pubDate>Fri, 16 Oct 2009 09:54:40 +0000</pubDate>
		<dc:creator>NicoLargo</dc:creator>
				<category><![CDATA[Open-source]]></category>
		<category><![CDATA[gstreamer]]></category>
		<category><![CDATA[fedora]]></category>

		<guid isPermaLink="false">http://blog.nicolargo.com/?p=2307</guid>
		<description><![CDATA[
Si vous suivez ce blog de prêt (si ce n'est pas le cas, cliquez ici !), vous savez tout le bien que je pense du Framework multimédia GStreamer présent sur l'ensemble des distributions GNU/Linux. En standard, l'installation de GStreamer ne dispose pas de l'ensemble des plugins disponibles. (dont notamment les encodeurs H.264, et les plugins [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="size-full wp-image-1986 aligncenter" title="gstreamer-logo.png" src="http://blog.nicolargo.com/wp-content/uploads/2009/06/gstreamer-logo.png" alt="gstreamer-logo.png" width="290" height="73" /></p>
<p>Si vous suivez ce blog de prêt (si ce n'est pas le cas, <a href="http://blog.nicolargo.com/abonnez-vous">cliquez ici !</a>), vous savez tout le bien que je pense <a href="http://blog.nicolargo.com/tag/gstreamer">du Framework multimédia GStreamer</a> présent sur l'ensemble des distributions GNU/Linux. En standard, l'installation de GStreamer ne dispose pas de l'ensemble des <a href="http://gstreamer.freedesktop.org/documentation/plugins.html">plugins disponibles</a>. (dont notamment les encodeurs H.264, et les plugins pour la communication avec FFMpeg).</p>
<p>Comme nous l'avions fait avec la <a href="http://blog.nicolargo.com/2009/04/installation-complete-de-gstreamer-sous-ubuntu-904.html">distribution GNU/Linux Ubuntu 9.04,</a> voici donc une petite procédure pour installer une version récente et compléte de GStreamer sous Fedora 11.</p>
<p>On commence par ajouter les dépôts, puis on met à jour notre système:</p>
<pre class="brush: bash;">
rpm -ivh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm
yum update
</pre>
<p>Ensuite on installe GStreamer and co:</p>
<pre class="brush: bash;">
yum install gstreamer gstreamer-tools gstreamer-plugins-base gstreamer-plugins-flumpegdemux gstreamer-plugins-good gstreamer-rtsp gstreamer-ffmpeg gstreamer-plugins-bad gstreamer-plugins-ugly
</pre>
<p>On vérifie l'installation (et le nombre de plugins):</p>
<pre class="brush: bash;">
gst-inspect
...
Nombre total :201 greffons, 914 fonctionnalités
</pre>
<p>Et vous, celà donne quoi sur votre configuration ?</p>

                            <div id="aspdf">
                                <a href="http://blog.nicolargo.com/wp-content/plugins/as-pdf/generate.php?post=2307">
                                    <span> </span>
                                </a>
                            </div>
                        ]]></content:encoded>
			<wfw:commentRss>http://blog.nicolargo.com/2009/10/installation-complete-de-gstreamer-sous-fedora-11.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nouvelle version de GStreamer 0.10.25</title>
		<link>http://blog.nicolargo.com/2009/10/nouvelle-version-de-gstreamer-0-10-25.html</link>
		<comments>http://blog.nicolargo.com/2009/10/nouvelle-version-de-gstreamer-0-10-25.html#comments</comments>
		<pubDate>Mon, 12 Oct 2009 09:49:07 +0000</pubDate>
		<dc:creator>NicoLargo</dc:creator>
				<category><![CDATA[Open-source]]></category>
		<category><![CDATA[gstreamer]]></category>

		<guid isPermaLink="false">http://blog.nicolargo.com/?p=2292</guid>
		<description><![CDATA[
Pas trop le temps de blogger en ce moment (sniff), donc juste une rapide note pour vous indiquer que GStreamer, le framework multimédia sous GNU/Linux vient d'évoluer en version 0.10.25 (pour le core et les plugins de bases).
Deux solutions pour profiter dès à présent des nouveautés, la première est de configurer votre système GNU/Linux Ubuntu [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="size-full wp-image-1986  aligncenter" title="gstreamer-logo.png" src="http://blog.nicolargo.com/wp-content/uploads/2009/06/gstreamer-logo.png" alt="gstreamer-logo.png" width="290" height="73" /></p>
<p>Pas trop le temps de blogger en ce moment (sniff), donc juste une rapide note pour vous indiquer que GStreamer, le framework multimédia sous GNU/Linux vient d'évoluer en version 0.10.25 (pour le core et les plugins de bases).</p>
<p>Deux solutions pour profiter dès à présent des <a href="http://gstreamer.freedesktop.org/releases/gstreamer/0.10.25.html">nouveautés</a>, la première est de configurer votre système GNU/Linux Ubuntu avec le dépôt de développement du projet GStreamer.</p>
<p>On commence par ajouter les lignes suivantes au fichier /etc/pat/sources.list:</p>
<blockquote><p>## Gstreamer for dev</p>
<p><span style="background-color: #ffffff;">deb http://ppa.launchpad.net/gstreamer-developers/ppa/ubuntu jaunty main </span></p>
<p><span style="background-color: #ffffff;">deb-src http://ppa.launchpad.net/gstreamer-developers/ppa/ubuntu jaunty main</span></p></blockquote>
<p>Puis on met à jour notre système:</p>
<blockquote><p>sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 051D8B58</p>
<p>sudo aptitude update</p>
<p>sudo aptitude safe-upgrade</p></blockquote>
<p>La deuxième solution consiste à installer cette nouvelle version en complément de la version standard. Je vous conseille de <a href="http://blog.nicolargo.com/2009/06/compiler-gstreamer-depuis-les-sources-sous-gnulinux.html">compiler GStreamer en suivant cette procédure</a> (il y a même un script shell qui fait tout pour   vous...).</p>

                            <div id="aspdf">
                                <a href="http://blog.nicolargo.com/wp-content/plugins/as-pdf/generate.php?post=2292">
                                    <span> </span>
                                </a>
                            </div>
                        ]]></content:encoded>
			<wfw:commentRss>http://blog.nicolargo.com/2009/10/nouvelle-version-de-gstreamer-0-10-25.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Theora 1.1 sans attendre sous Ubuntu</title>
		<link>http://blog.nicolargo.com/2009/09/theora-1-1-sans-attendre-sous-ubuntu.html</link>
		<comments>http://blog.nicolargo.com/2009/09/theora-1-1-sans-attendre-sous-ubuntu.html#comments</comments>
		<pubDate>Mon, 28 Sep 2009 14:58:55 +0000</pubDate>
		<dc:creator>NicoLargo</dc:creator>
				<category><![CDATA[Open-source]]></category>
		<category><![CDATA[gstreamer]]></category>
		<category><![CDATA[codec]]></category>
		<category><![CDATA[theora]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://blog.nicolargo.com/?p=2257</guid>
		<description><![CDATA[ 
Le codec vidéo libre est sorti la semaine dernière en version 1.1. Beaucoup de nouveautés sur le pont:

rate-Distortion Optimization ( RDO ) pour une meilleure quantification des décisions
quantification adaptative implique une meilleure utilisation du bitrate
un mode d'encodage deux passes pour des fichiers à la taille souhaitée
une utilisation plus fine du CPU pendant l'encodage
un meilleur [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center; "><img class="size-medium wp-image-2258" title="theora-1.0" src="http://blog.nicolargo.com/wp-content/uploads/2009/09/theora-1.0-300x204.png" alt="theora-1.0" width="240" height="163" /> <img class="size-medium wp-image-2259" title="theora-1.1" src="http://blog.nicolargo.com/wp-content/uploads/2009/09/theora-1.1-300x204.png" alt="theora-1.1" width="240" height="163" /></p>
<p>Le codec vidéo libre est sorti la semaine dernière en version 1.1. Beaucoup de <a href="http://hacks.mozilla.org/2009/09/theora-1-1-released/">nouveautés</a> sur le pont:</p>
<ul>
<li><strong>rate-Distortion Optimization</strong> ( RDO ) pour une meilleure quantification des décisions</li>
<li>quantification adaptative implique une meilleure utilisation du <strong>bitrate</strong></li>
<li>un mode d'encodage <strong>deux passes</strong> pour des fichiers à la taille souhaitée</li>
<li>une utilisation plus fine du <strong>CPU</strong> pendant l'encodage</li>
<li>un meilleur <strong>contrôle du débit</strong> pour la diffusion en streaming (<a href="http://blog.nicolargo.com/2009/02/jai-streame-avec-gstreamer.html">à valider bientôt avec GStreamer</a> <img src='http://blog.nicolargo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> )</li>
<li>une amélioration des <strong>performances du décodeur</strong> (de l'ordre de 1,5 à 2 fois plus rapide par rapport à Theora 1.0)</li>
<li>une <strong>retro compatibilité</strong> des fichiers Theora 1.0</li>
</ul>
<p>Pour profiter sans attendre des ces nouveautés sur votre distribution Ubuntu, il faut suivre la procédure suivante:</p>
<blockquote><p>cd ~/src</p>
<p>wget http://downloads.xiph.org/releases/theora/libtheora-1.1.0.tar.bz2</p>
<p>bzip2 -d libtheora-1.1.0.tar.bz2</p>
<p>tar xvf libtheora-1.1.0.tar</p>
<p>./configure</p>
<p>make</p>
<p>sudo make install</p>
<p>make check</p></blockquote>
<p>Et voili !</p>

                            <div id="aspdf">
                                <a href="http://blog.nicolargo.com/wp-content/plugins/as-pdf/generate.php?post=2257">
                                    <span> </span>
                                </a>
                            </div>
                        ]]></content:encoded>
			<wfw:commentRss>http://blog.nicolargo.com/2009/09/theora-1-1-sans-attendre-sous-ubuntu.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GStreamer et le codec X.264</title>
		<link>http://blog.nicolargo.com/2009/06/gstreamer-et-le-codec-x264.html</link>
		<comments>http://blog.nicolargo.com/2009/06/gstreamer-et-le-codec-x264.html#comments</comments>
		<pubDate>Wed, 10 Jun 2009 08:32:03 +0000</pubDate>
		<dc:creator>NicoLargo</dc:creator>
				<category><![CDATA[Open-source]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[gstreamer]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[codec]]></category>
		<category><![CDATA[H.264]]></category>
		<category><![CDATA[MPEG.4]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[X.264]]></category>

		<guid isPermaLink="false">http://blog.nicolargo.com/2009/06/gstreamer-et-le-codec-x264.html</guid>
		<description><![CDATA[Souhaitant effectuer un streaming RTP à partir d'une Webcam, voici un billet sur l'optimisation des paramètres du codec libre X.264 (implémentation libre du codec H.264 ou MPEG-4 AVC - WIKI) dont l'équipe de VideoLAN est à l'origine. Pour tester ce codec et ensuite mettre en place le streaming, j'utiliserai le framework GStreamer.

A la recherche des [...]]]></description>
			<content:encoded><![CDATA[<p><img style="max-width: 800px; float: right; margin-top: 10px; margin-bottom: 10px; margin-left: 10px;" src="http://blog.nicolargo.com/wp-content/uploads/2009/06/x264.png" />Souhaitant effectuer un streaming RTP à partir d'une Webcam, voici un billet sur l'optimisation des paramètres du codec libre X.264 (implémentation libre du codec H.264 ou MPEG-4 AVC - <small><a href="http://fr.wikipedia.org/wiki/X264">WIKI</a></small>) dont l'équipe de VideoLAN est à l'<a href="http://www.videolan.org/developers/x264.html">origine</a>. Pour tester ce codec et ensuite mettre en place le streaming, j'utiliserai le framework <a href="http://blog.nicolargo.com/tag/gstreamer">GStreamer</a>.</p>
<p><span id="more-2001"></span><br />
<h1>A la recherche des "bons" paramètres</h1>
<p>On commence par&nbsp; créer un fichier vidéo de référence. Ce dernier est à adapter à votre besoin. Pour mes tests, j'ai enregistré une séquence d'une dizaine de secondes devant ma Webcam:<br />
<blockquote>gst-launch v4l2src device="/dev/video1" ! queue ! videoscale method=1 ! video/x-raw-yuv,width=320,height=240 ! avimux ! filesink location=webcam.avi</p></blockquote>
<p>Ensuite on génère un fichier encodé en H.264 (c'est à dire sans paramètre, avec un encodage à 2 Mbps). Il servira de référence pour la comparaison qualitative:<br />
<blockquote>gst-launch filesrc location=webcam.avi ! decodebin ! queue ! ffmpegcolorspace ! x264enc ! avimux ! filesink location=webcam-x264-10.avi</p></blockquote>
<p>On peut comparer les deux:</p>
<div align="center"><img style="max-width: 800px;" src="http://blog.nicolargo.com/wp-content/uploads/2009/06/webcamavi-2.png" width="250" height="187" /> <img style="max-width: 800px;" src="http://blog.nicolargo.com/wp-content/uploads/2009/06/webcam-x264-10avi-21.png" width="250" height="187" /><br /><i><small>Original <b>vs</b> X.264 (defaut)</small></i></div>
<p>On va maintenant jouer avec les paramètres disponibles pour le codec X.264. La liste de ces paramètres est longue et le paramétrage très pointu. Je vous conseille la lecture de ce <a href="http://www.scribd.com/doc/16217934/x264-Options-Analysis-08">document</a> et de ce <a href="http://forum.doom9.org/forumdisplay.php?f=77">forum</a>.</p>
<p>Nous allons dans un premier temps fixer le débit de compression à 200 Kbps (paramètre <i>bitrate</i>) puis mettre des valeurs moyennes au niveau des paramètres <i>ref</i> et <i>subme</i>. Cela devrait assurer un bon compromis entre vitesse de compression et qualité d'image.<br />
<blockquote>gst-launch filesrc location=webcam.avi ! decodebin ! queue ! x264enc byte-stream=true bitrate=200 ! gst-launch filesrc location=webcam.avi ! decodebin ! queue ! ffmpegcolorspace ! x264enc byte-stream=true bitrate=200 bframes=4 ref=4 me=hex subme=4 weightb=true threads=0 ! avimux ! filesink location=webcam-x264-11.avi</p></blockquote>
<p>On compare le résultat:</p>
<div align="center"><img style="max-width: 800px;" src="http://blog.nicolargo.com/wp-content/uploads/2009/06/webcam-x264-10avi-21.png" width="250" height="187" /> <img style="max-width: 800px;" src="http://blog.nicolargo.com/wp-content/uploads/2009/06/webcam-x264-11avi-2.png" width="250" height="187" /><br /><i><small>X.264 (defaut) <b>vs</b> X.264 test 11<br /></small><small>(</small></i><small>byte-stream=true bitrate=200 bframes=4 ref=4 me=hex subme=4 weightb=true threads=0<i><small>)</small></i></small></div>
<p>Comme on peut le voir la qualité est moins bonne (surtout quand il y a des mouvements) mais l'on passe d'un débit de 2089 Kbps à 203 Kbps (soit un facteur 10). </p>
<p>En choisissant des options qui permettent une compression plus rapide (ce qui peut être utile pour une utilisation interactive de type videoconference), on perd encore en qualité:<br />
<blockquote>gst-launch filesrc location=webcam.avi ! decodebin ! queue ! ffmpegcolorspace ! x264enc byte-stream=true bitrate=200 bframes=4 ref=1 me=dia subme=1 weightb=true threads=0 ! avimux ! filesink location=webcam-x264-12.avi</p></blockquote>
<p>On compare le résultat par rapport aux paramètres précédant:</p>
<div align="center"><img style="max-width: 800px;" src="http://blog.nicolargo.com/wp-content/uploads/2009/06/webcam-x264-11avi-2.png" width="250" height="187" /> <img style="max-width: 800px;" src="http://blog.nicolargo.com/wp-content/uploads/2009/06/webcam-x264-12avi-2.png" width="250" height="187" /></div>
<div align="center"><i><small>X.264 test 11 <b>vs</b> X.264 test 12<br />(</small></i><small>byte-stream=true bitrate=200 bframes=4 ref=1 me=dia subme=1 weightb=true threads=0</small><i><small>)<br /></small></i></div>
<p>La consommation de bande passante entre les deux tests est la même (203 Kbps). Seul le temps d'encodage diffère (gain de 25%). </p>
<p>Enfin on paramètre X.264 pour améliorer la qualité (donc au détriment du temps d'encodage):<br />
<blockquote>gst-launch filesrc location=webcam.avi ! decodebin ! queue ! ffmpegcolorspace ! x264enc byte-stream=true bitrate=200 bframes=4 ref=8 me=umh subme=6 weightb=true threads=0 ! avimux ! filesink location=webcam-x264-13.avi</p></blockquote>
<p>On compare le résultat par rapport aux paramètres du test 11:</p>
<div align="center"><img style="max-width: 800px;" src="http://blog.nicolargo.com/wp-content/uploads/2009/06/webcam-x264-11avi-2.png" width="250" height="187" /> <img style="max-width: 800px;" src="http://blog.nicolargo.com/wp-content/uploads/2009/06/webcam-x264-13avi-2.png" width="250" height="187" /></div>
<div align="center"><i><small>X.264 test 11 <b>vs</b> X.264 test 13</small></i><br /><i><small>(</small></i><small>byte-stream=true bitrate=200 bframes=4 ref=8 me=umh subme=6 weightb=true threads=0</small><i><small>)</small></i></div>
<p>La qualité est légèrement meilleure (difficile à voir sur cette image), le débit identique, par contre le délais d'encodage bondit de plus de 100%.</p>
<p>Pour résumé, les paramètres suivant sont ceux qui offre le meilleur résultat pour mon besoin:<br />
<blockquote><small>byte-stream=true bitrate=200 bframes=4 ref=4 me=hex subme=4 weightb=true threads=0</small></p></blockquote>
<h1>Ratio qualité/bande passante</h1>
<p>Maintenant que nous avons identifié les "bons" paramètres pour notre besoin. Il faut jouer sur les paramètres externes pour trouver le bon ratio entre la qualité de l'image et la bande passante consommé lors du streaming de notre Webcam.</p>
<p>Les paramètres sur lesquels on a des leviers sont les suivants:
<ul>
<li>taille de l'image (résolution)</li>
<li>nombre d'images par seconde (fps)</li>
<li>débit cible au niveau du codec X.264 (bitrate)</li>
</ul>
<p>Comme je n'aime pas faire des choses répétitives (non non, ce n'est pas de la fainéantise...),&nbsp; j'ai développé un petit script shell qui prend en entrée un fichier vidéo de référence, une liste de résolution (au format GStreamer), une liste de fps et une liste de débit. Le script va générer automatiquement les vidéos encodés avec ces différents paramètres.</p>
<p>Voici le script en question:<br />
<blockquote><small>#!/bin/sh</p>
<p># Je génére le fichier de référence avec la commande:<br /># sudo gst-launch v4l2src device="/dev/video1" ! queue ! videoscale method=1 ! video/x-raw-yuv,width=704,height=576 ! avimux ! filesink location=videotest.avi</p>
<p>videosrc="./videotest.avi"<br />reslist="width=704,height=576 width=352,height=288 width=176,height=144 width=128,height=96"<br />fpslist="24 12 6 3"<br />bitratelist="400 300 200 100 50"</p>
<p>for res in `echo $reslist`<br />do <br />&nbsp;resname=`echo $res | sed "s/width=//" | sed "s/height=//" | sed "s/,/x/"`<br />&nbsp;for fps in `echo $fpslist`<br />&nbsp;do<br />&nbsp; for bitrate in `echo $bitratelist`<br />&nbsp; do<br />&nbsp;&nbsp; echo videotest-${resname}-${fps}fps-${bitrate}kbps.avi<br />&nbsp;&nbsp; gst-launch filesrc location=$videosrc ! decodebin ! ffmpegcolorspace ! queue ! cairotextoverlay text="${resname} ${fps}fps ${bitrate}kbps" shaded-background=true ! queue ! videorate ! video/x-raw-yuv,framerate=$fps/1 ! queue ! videoscale method=1 !&nbsp; video/x-raw-yuv,$res ! queue ! ffmpegcolorspace ! x264enc byte-stream=true bitrate=$bitrate bframes=4 ref=4 me=hex subme=4 weightb=true threads=0 ! avimux ! filesink location=videotest-${resname}-${bitrate}kbps-${fps}fps.avi<br />&nbsp; done<br />&nbsp;done<br />done<br /></small></p></blockquote>
<p>J'obtient les résultats suivants:<br />
<blockquote><small>videotest-704x576-50kbps-6fps.avi donne un débit moyen de 41 kb/s<br />videotest-352x288-50kbps-3fps.avi donne un débit moyen de 42 kb/s<br />videotest-352x288-50kbps-6fps.avi donne un débit moyen de 42 kb/s<br />videotest-704x576-50kbps-3fps.avi donne un débit moyen de 43 kb/s<br />videotest-176x144-50kbps-3fps.avi donne un débit moyen de 44 kb/s<br />videotest-128x96-50kbps-3fps.avi donne un débit moyen de 45 kb/s<br />videotest-176x144-50kbps-6fps.avi donne un débit moyen de 46 kb/s<br />videotest-128x96-50kbps-6fps.avi donne un débit moyen de 47 kb/s<br />videotest-352x288-50kbps-12fps.avi donne un débit moyen de 47 kb/s<br />videotest-704x576-50kbps-12fps.avi donne un débit moyen de 47 kb/s<br />videotest-176x144-50kbps-12fps.avi donne un débit moyen de 51 kb/s<br />videotest-128x96-50kbps-12fps.avi donne un débit moyen de 52 kb/s<br />videotest-352x288-50kbps-24fps.avi donne un débit moyen de 53 kb/s<br />videotest-704x576-50kbps-24fps.avi donne un débit moyen de 53 kb/s<br />videotest-176x144-50kbps-24fps.avi donne un débit moyen de 54 kb/s<br />videotest-128x96-50kbps-24fps.avi donne un débit moyen de 56 kb/s<br />videotest-128x96-100kbps-3fps.avi donne un débit moyen de 73 kb/s<br />videotest-704x576-100kbps-6fps.avi donne un débit moyen de 76 kb/s<br />videotest-352x288-100kbps-3fps.avi donne un débit moyen de 81 kb/s<br />videotest-352x288-100kbps-6fps.avi donne un débit moyen de 81 kb/s<br />videotest-704x576-100kbps-3fps.avi donne un débit moyen de 84 kb/s<br />videotest-176x144-100kbps-3fps.avi donne un débit moyen de 86 kb/s<br />videotest-128x96-200kbps-3fps.avi donne un débit moyen de 87 kb/s<br />videotest-128x96-300kbps-3fps.avi donne un débit moyen de 87 kb/s<br />videotest-128x96-400kbps-3fps.avi donne un débit moyen de 87 kb/s<br />videotest-128x96-100kbps-6fps.avi donne un débit moyen de 88 kb/s<br />videotest-704x576-100kbps-12fps.avi donne un débit moyen de 89 kb/s<br />videotest-352x288-100kbps-12fps.avi donne un débit moyen de 91 kb/s<br />videotest-704x576-100kbps-24fps.avi donne un débit moyen de 93 kb/s<br />videotest-176x144-100kbps-6fps.avi donne un débit moyen de 94 kb/s<br />videotest-176x144-100kbps-12fps.avi donne un débit moyen de 99 kb/s<br />videotest-352x288-100kbps-24fps.avi donne un débit moyen de 99 kb/s<br />videotest-128x96-100kbps-12fps.avi donne un débit moyen de 101 kb/s<br />videotest-176x144-100kbps-24fps.avi donne un débit moyen de 103 kb/s<br />videotest-128x96-100kbps-24fps.avi donne un débit moyen de 104 kb/s<br />videotest-128x96-200kbps-6fps.avi donne un débit moyen de 125 kb/s<br />videotest-128x96-300kbps-6fps.avi donne un débit moyen de 130 kb/s<br />videotest-128x96-400kbps-6fps.avi donne un débit moyen de 131 kb/s<br />videotest-176x144-200kbps-3fps.avi donne un débit moyen de 136 kb/s<br />videotest-704x576-200kbps-6fps.avi donne un débit moyen de 150 kb/s<br />videotest-176x144-300kbps-3fps.avi donne un débit moyen de 151 kb/s<br />videotest-176x144-400kbps-3fps.avi donne un débit moyen de 152 kb/s<br />videotest-352x288-200kbps-6fps.avi donne un débit moyen de 161 kb/s<br />videotest-352x288-200kbps-3fps.avi donne un débit moyen de 162 kb/s<br />videotest-704x576-200kbps-3fps.avi donne un débit moyen de 165 kb/s<br />videotest-176x144-200kbps-6fps.avi donne un débit moyen de 170 kb/s<br />videotest-128x96-200kbps-12fps.avi donne un débit moyen de 174 kb/s<br />videotest-352x288-200kbps-12fps.avi donne un débit moyen de 174 kb/s<br />videotest-704x576-200kbps-12fps.avi donne un débit moyen de 174 kb/s<br />videotest-704x576-200kbps-24fps.avi donne un débit moyen de 187 kb/s<br />videotest-128x96-300kbps-12fps.avi donne un débit moyen de 188 kb/s<br />videotest-128x96-400kbps-12fps.avi donne un débit moyen de 188 kb/s<br />videotest-128x96-200kbps-24fps.avi donne un débit moyen de 191 kb/s<br />videotest-352x288-200kbps-24fps.avi donne un débit moyen de 192 kb/s<br />videotest-176x144-200kbps-12fps.avi donne un débit moyen de 193 kb/s<br />videotest-176x144-200kbps-24fps.avi donne un débit moyen de 199 kb/s<br />videotest-176x144-300kbps-6fps.avi donne un débit moyen de 202 kb/s<br />videotest-128x96-300kbps-24fps.avi donne un débit moyen de 211 kb/s<br />videotest-128x96-400kbps-24fps.avi donne un débit moyen de 215 kb/s<br />videotest-176x144-400kbps-6fps.avi donne un débit moyen de 216 kb/s<br />videotest-704x576-300kbps-6fps.avi donne un débit moyen de 220 kb/s<br />videotest-352x288-300kbps-3fps.avi donne un débit moyen de 235 kb/s<br />videotest-704x576-300kbps-3fps.avi donne un débit moyen de 245 kb/s<br />videotest-352x288-300kbps-6fps.avi donne un débit moyen de 249 kb/s<br />videotest-704x576-300kbps-12fps.avi donne un débit moyen de 262 kb/s<br />videotest-352x288-300kbps-12fps.avi donne un débit moyen de 265 kb/s<br />videotest-176x144-300kbps-12fps.avi donne un débit moyen de 272 kb/s<br />videotest-704x576-300kbps-24fps.avi donne un débit moyen de 278 kb/s<br />videotest-176x144-300kbps-24fps.avi donne un débit moyen de 289 kb/s<br />videotest-352x288-300kbps-24fps.avi donne un débit moyen de 293 kb/s<br />videotest-704x576-400kbps-6fps.avi donne un débit moyen de 297 kb/s<br />videotest-352x288-400kbps-3fps.avi donne un débit moyen de 298 kb/s<br />videotest-176x144-400kbps-12fps.avi donne un débit moyen de 301 kb/s<br />videotest-704x576-400kbps-3fps.avi donne un débit moyen de 318 kb/s<br />videotest-352x288-400kbps-6fps.avi donne un débit moyen de 336 kb/s<br />videotest-176x144-400kbps-24fps.avi donne un débit moyen de 339 kb/s<br />videotest-704x576-400kbps-12fps.avi donne un débit moyen de 346 kb/s<br />videotest-352x288-400kbps-12fps.avi donne un débit moyen de 355 kb/s<br />videotest-704x576-400kbps-24fps.avi donne un débit moyen de 373 kb/s<br />videotest-352x288-400kbps-24fps.avi donne un débit moyen de 385 kb/s</small></p></blockquote>
<p>Si on se focalise sur un nombre d'images par seconde de 12 et une résolution CIF (ce qui est suffisant pour une besoin de type vidéoconférence), on obtient les qualités suivantes:</p>
<div align="center"><img style="max-width: 800px;" src="http://blog.nicolargo.com/wp-content/uploads/2009/06/videotest-352x288-50kbps-12fpsavi-2.png" width="250" height="205" /><br /><small>Dévit cible: 50 Kbps / Débit mesuré: <b>47</b> Kbps</small></p>
<p> <img style="max-width: 800px;" src="http://blog.nicolargo.com/wp-content/uploads/2009/06/videotest-352x288-100kbps-12fpsavi-2.png" width="250" height="204" /><br /><small>Dévit cible: 100 Kbps / Débit mesuré: <b>91</b> Kbps</small></p>
<p><img style="max-width: 800px;" src="http://blog.nicolargo.com/wp-content/uploads/2009/06/videotest-352x288-200kbps-12fpsavi-2.png" width="250" height="205" /><br /><small>Dévit cible: 200 Kbps / Débit mesuré: <b>174</b> Kbps</p>
<p></small><img style="max-width: 800px;" src="http://blog.nicolargo.com/wp-content/uploads/2009/06/videotest-352x288-300kbps-12fpsavi-2.png" width="250" height="204" /><br /><small>Dévit cible: 300 Kbps / Débit mesuré: <b>265</b> Kbps</p>
<p></small><img style="max-width: 800px;" src="http://blog.nicolargo.com/wp-content/uploads/2009/06/videotest-352x288-400kbps-12fpsavi-2.png" width="250" height="204" /> <br /><small>Dévit cible: 400 Kbps / Débit mesuré: <b>355</b> Kbps</small></div>
<p>On peut voir que la qualité augmente moins à partir d'un débit cible de 200 Kbps. <br />
<h1>On teste enfin le streaming</h1>
<p>Pas la peine de réinventer la roue, j'avais déjà écrit <a href="http://blog.nicolargo.com/2009/02/jai-streame-avec-gstreamer.html">un billet sur le sujet</a>. Si l'on souhaite faire un streaming RTP entre deux machines en prenant en compte l'optimisation X.264 décrite dans les chapitres précédant, il faut saisir les commandes suivantes:</p>
<p>Sur le serveur (192.168.1.1):<br />
<blockquote>gst-launch -v&nbsp; gstrtpbin name=rtpbin \<br />
v4l2src \<br />
! queue ! videoscale method=1 ! video/x-raw-yuv,width=352,height=288 \<br />! queue ! videorate ! video/x-raw-yuv,framerate=\(fraction\)12/1 \<br />
! queue ! x264enc byte-stream=true bitrate=200 bframes=4 ref=4 me=hex subme=4 weightb=true threads=0 ! rtph264pay \<br />
! rtpbin.send_rtp_sink_0 \<br />
rtpbin.send_rtp_src_0 ! udpsink port=5000 host=192.168.1.2 \<br />
rtpbin.send_rtcp_src_0 ! udpsink port=5001 host=192.168.1.2 sync=false async=false \<br />
udpsrc port=5002 ! rtpbin.recv_rtcp_sink_0</p></blockquote>
<p>Puis sur le client (192.168.1.2):<br />
<blockquote>gst-launch -v gstrtpbin name=rtpbin latency=200 \<br />
udpsrc caps="application/x-rtp, media=(string)video,<br />
clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" port=5000 \<br />
! rtpbin.recv_rtp_sink_0 \<br />
rtpbin. ! rtph264depay ! ffdec_h264 ! xvimagesink \<br />
udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0 \<br />
rtpbin.send_rtcp_src_0 ! udpsink port=5002 host=192.168.0.1 sync=false async=false</p></blockquote>
<h1>Conclusion</h1>
<p>Comme toujours dans ce genre d'exercice, le paramétrage des codecs vidéos dépend de votre source (on n'encode pas de la même manière le flux CIF venant d'une Webcam ou un fichier vidéo HD...). On a ici trouvé un bon compromis entre qualité d'affichage et bande passante consommée sur le réseau. Etant loin d'être un spécialiste sur le sujet, il y a surement des optimisations à faire. Les commentaires sont fait pour ça !</p>

                            <div id="aspdf">
                                <a href="http://blog.nicolargo.com/wp-content/plugins/as-pdf/generate.php?post=2001">
                                    <span> </span>
                                </a>
                            </div>
                        ]]></content:encoded>
			<wfw:commentRss>http://blog.nicolargo.com/2009/06/gstreamer-et-le-codec-x264.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Compiler GStreamer depuis les sources sous GNU/Linux</title>
		<link>http://blog.nicolargo.com/2009/06/compiler-gstreamer-depuis-les-sources-sous-gnulinux.html</link>
		<comments>http://blog.nicolargo.com/2009/06/compiler-gstreamer-depuis-les-sources-sous-gnulinux.html#comments</comments>
		<pubDate>Mon, 08 Jun 2009 09:20:06 +0000</pubDate>
		<dc:creator>NicoLargo</dc:creator>
				<category><![CDATA[Open-source]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[gstreamer]]></category>
		<category><![CDATA[compilation]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[source]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.nicolargo.com/2009/06/compiler-gstreamer-depuis-les-sources-sous-gnulinux.html</guid>
		<description><![CDATA[
Edit: j'ai ajouté un script SHELL "qui fait tout pour vous" en fin de billet...
Voici une petite procédure pour compiler la dernière version du framework multimédia GStreamer tout en préservant la version installée depuis les dépôts officiels. La procédure a été validé sur une GNU/Linux Ubuntu 9.04 mais doit facilement être adaptable à d'autres distribution [...]]]></description>
			<content:encoded><![CDATA[<p><img style="max-width: 800px; float: right; margin-top: 10px; margin-bottom: 10px; margin-left: 10px;" src="http://blog.nicolargo.com/wp-content/uploads/2009/06/gstreamer-logo.png" alt="" /></p>
<p><em><strong>Edit</strong></em><strong>: j'ai ajouté un script SHELL "qui fait tout pour vous" en fin de billet...</strong></p>
<p>Voici une petite procédure pour compiler la dernière version <a href="http://blog.nicolargo.com/tag/gstreamer">du framework multimédia GStreamer</a> tout en préservant la version installée depuis les dépôts officiels. La procédure a été validé sur une GNU/Linux Ubuntu 9.04 mais doit facilement être adaptable à d'autres distribution (pour une procèdure équivalente sous Mac OS X, vous pouvez <a href="http://blog.nicolargo.com/2009/02/installation-de-gstreamer-sur-mac-os-x.html">lire ce billet</a>).</p>
<p>GStreamer étant un framework, il se base sur de nombreuses librairies externes. Pour nous simplifier la tache, nous allons utiliser les dépôts pour l'installation de ces librairies:</p>
<blockquote><p>sudo aptitude build-dep gstreamer0.10-ffmpeg gstreamer0.10-plugins-bad gstreamer0.10-plugins-bad-multiverse gstreamer0.10-plugins-base gstreamer0.10-plugins-good gstreamer0.10-plugins-ugly gstreamer0.10-plugins-ugly-multiverse bison flex git</p></blockquote>
<p>Ensuite on récupère <a href="http://gstreamer.freedesktop.org/src/">les dernières versions disponibles</a> de GStreamer et de ses plugins:</p>
<blockquote><p>mkdir ~/src<br />
cd ~/src<br />
wget http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.25.tar.gz<br />
wget http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.10.25.tar.gz<br />
wget http://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-0.10.17.tar.gz<br />
wget http://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-0.10.17.tar.gz<br />
wget http://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-0.10.13.tar.gz<br />
wget http://gstreamer.freedesktop.org/src/gst-ffmpeg/gst-ffmpeg-0.10.8.tar.gz</p></blockquote>
<p>On commence par la compilation de GStreamer (core). L'installation se fera dans le répertoire /opt/gstreamer/gstreamer-0.10.24:</p>
<blockquote><p>tar zxvf gstreamer-0.10.25.tar.gz<br />
cd gstreamer-0.10.25<br />
./configure --prefix=/opt/gstreamer/gstreamer-0.10.25<br />
make<br />
sudo make install<br />
cd ..</p></blockquote>
<p>... puis les plugins "base":</p>
<blockquote><p>tar zxvf gst-plugins-base-0.10.25.tar.gz<br />
cd gst-plugins-base-0.10.25<br />
PKG_CONFIG_PATH=/opt/gstreamer/gstreamer-0.10.25/lib/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig ./configure --prefix=/opt/gstreamer/gstreamer-0.10.25<br />
make<br />
sudo make install<br />
cd ..</p></blockquote>
<p>... puis les plugins "good":</p>
<blockquote><p>tar zxvf gst-plugins-good-0.10.17.tar.gz<br />
cd gst-plugins-good-0.10.17<br />
PKG_CONFIG_PATH=/opt/gstreamer/gstreamer-0.10.25/lib/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig ./configure --prefix=/opt/gstreamer/gstreamer-0.10.25<br />
make<br />
sudo make install<br />
cd ..</p></blockquote>
<p>... puis les plugins "bad":</p>
<blockquote><p>tar zxvf gst-plugins-bad-0.10.17.tar.gz<br />
cd gst-plugins-bad-0.10.17<br />
PKG_CONFIG_PATH=/opt/gstreamer/gstreamer-0.10.25/lib/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig ./configure --prefix=/opt/gstreamer/gstreamer-0.10.25<br />
make<br />
sudo make install<br />
cd ..</p></blockquote>
<p>... les plugins "ugly":</p>
<blockquote><p>tar zxvf gst-plugins-ugly-0.10.13.tar.gz<br />
cd gst-plugins-ugly-0.10.13<br />
PKG_CONFIG_PATH=/opt/gstreamer/gstreamer-0.10.25/lib/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig ./configure --prefix=/opt/gstreamer/gstreamer-0.10.25<br />
make<br />
sudo make install<br />
cd ..</p></blockquote>
<p>... et enfin les plugins FFMPEG (streaming):</p>
<blockquote><p>tar zxvf gst-ffmpeg-0.10.8.tar.gz<br />
cd gst-ffmpeg-0.10.8<br />
PKG_CONFIG_PATH=/opt/gstreamer/gstreamer-0.10.25/lib/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig ./configure --prefix=/opt/gstreamer/gstreamer-0.10.25<br />
make<br />
sudo make install<br />
cd ..</p></blockquote>
<p>Puis on créé un lien symbolique entre le répertoire /opt/gstreamer/current et /opt/gstreamer/gstreamer-0.10.25. Ce lien nous permet d'avoir plusieur version de GStreamer sur notre système.</p>
<blockquote><p>sudo cp /opt/gstreamer/gstreamer-0.10.25/lib/gstreamer-0.10.25/* /opt/gstreamer/gstreamer-0.10.25/lib/</p></blockquote>
<blockquote><p>sudo ln -s /opt/gstreamer/gstreamer-0.10.25/lib /opt/gstreamer/current</p></blockquote>
<p>On teste enfin l'installation:</p>
<blockquote><p>/opt/gstreamer/gstreamer-0.10.25/bin/gst-inspect --gst-plugin-path=/opt/gstreamer/current</p></blockquote>
<p>Pour les plus faineant, voici un script sheel automatisant ces quelques taches</p>
<pre class="brush: bash;">
#!/bin/sh

# A simple script to get/compile/install GStreamer

# Nicolas Hennion - GPL

#

# Remarks: the version will be installed in the /opt/gstreamer folder

# Change this to the latest version

GST_CORE=0.10.25

GST_BASE=0.10.25

GST_GOOD=0.10.17

GST_BAD=0.10.17

GST_UGLY=0.10.13

GST_FFMPEG=0.10.8

# Do not edit under this line

sudo aptitude build-dep gstreamer0.10-ffmpeg gstreamer0.10-plugins-bad gstreamer0.10-plugins-bad-multiverse gstreamer0.10-plugins-base gstreamer0.10-plugins-good gstreamer0.10-plugins-ugly gstreamer0.10-plugins-ugly-multiverse

sudo aptitude install bison flex git

if [ ! -e gstreamer-$GST_CORE.tar.gz ]

then

wget http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-$GST_CORE.tar.gz

fi

if [ ! -e gst-plugins-base-$GST_BASE.tar.gz ]

then

wget http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-$GST_BASE.tar.gz

fi

if [ ! -e gst-plugins-good-$GST_GOOD.tar.gz ]

then

wget http://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-$GST_GOOD.tar.gz

fi

if [ ! -e gst-plugins-bad-$GST_BAD.tar.gz ]

then

wget http://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-$GST_BAD.tar.gz

fi

if [ ! -e gst-plugins-ugly-$GST_UGLY.tar.gz ]

then

wget http://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-$GST_UGLY.tar.gz

fi

if [ ! -e gst-ffmpeg-$GST_FFMPEG.tar.gz ]

then

wget http://gstreamer.freedesktop.org/src/gst-ffmpeg/gst-ffmpeg-$GST_FFMPEG.tar.gz

fi

sudo mkdir /opt/gstreamer

if [ ! -e gstreamer-$GST_CORE ]

then

tar zxvf gstreamer-$GST_CORE.tar.gz

cd gstreamer-$GST_CORE

./configure --prefix=/opt/gstreamer/gstreamer-$GST_CORE

make

sudo make install

cd ..

fi

if [ ! -e gst-plugins-base-$GST_BASE ]

then

tar zxvf gst-plugins-base-$GST_BASE.tar.gz

cd gst-plugins-base-$GST_BASE

PKG_CONFIG_PATH=/opt/gstreamer/gstreamer-$GST_CORE/lib/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig ./configure --prefix=/opt/gstreamer/gstreamer-$GST_CORE

make

sudo make install

cd ..

fi

if [ ! -e gst-plugins-good-$GST_GOOD ]

then

tar zxvf gst-plugins-good-$GST_GOOD.tar.gz

cd gst-plugins-good-$GST_GOOD

PKG_CONFIG_PATH=/opt/gstreamer/gstreamer-$GST_CORE/lib/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig ./configure --prefix=/opt/gstreamer/gstreamer-$GST_CORE

make

sudo make install

cd ..

fi

if [ ! -e gst-plugins-bad-$GST_BAD ]

then

tar zxvf gst-plugins-bad-$GST_BAD.tar.gz

cd gst-plugins-bad-$GST_BAD

PKG_CONFIG_PATH=/opt/gstreamer/gstreamer-$GST_CORE/lib/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig ./configure --prefix=/opt/gstreamer/gstreamer-$GST_CORE

make

sudo make install

cd ..

fi

if [ ! -e gst-plugins-ugly-$GST_UGLY ]

then

tar zxvf gst-plugins-ugly-$GST_UGLY.tar.gz

cd gst-plugins-ugly-$GST_UGLY

PKG_CONFIG_PATH=/opt/gstreamer/gstreamer-$GST_CORE/lib/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig ./configure --prefix=/opt/gstreamer/gstreamer-$GST_CORE

make

sudo make install

cd ..

fi

if [ ! -e gst-ffmpeg-$GST_FFMPEG ]

then

tar zxvf gst-ffmpeg-$GST_FFMPEG.tar.gz

cd gst-ffmpeg-$GST_FFMPEG

PKG_CONFIG_PATH=/opt/gstreamer/gstreamer-$GST_CORE/lib/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig ./configure --prefix=/opt/gstreamer/gstreamer-$GST_CORE

make

sudo make install

cd ..

fi

sudo cp /opt/gstreamer/gstreamer-$GST_CORE/lib/gstreamer-$GST_CORE/* /opt/gstreamer/gstreamer-$GST_CORE/lib/

sudo ln -s /opt/gstreamer/gstreamer-$GST_CORE/lib /opt/gstreamer/current

/opt/gstreamer/gstreamer-$GST_CORE/bin/gst-inspect --gst-plugin-path=/opt/gstreamer/current
</pre>

                            <div id="aspdf">
                                <a href="http://blog.nicolargo.com/wp-content/plugins/as-pdf/generate.php?post=1987">
                                    <span> </span>
                                </a>
                            </div>
                        ]]></content:encoded>
			<wfw:commentRss>http://blog.nicolargo.com/2009/06/compiler-gstreamer-depuis-les-sources-sous-gnulinux.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Test du codec Speex dans Gstreamer</title>
		<link>http://blog.nicolargo.com/2009/06/test-du-codec-speex-dans-gstreamer.html</link>
		<comments>http://blog.nicolargo.com/2009/06/test-du-codec-speex-dans-gstreamer.html#comments</comments>
		<pubDate>Thu, 04 Jun 2009 10:01:10 +0000</pubDate>
		<dc:creator>NicoLargo</dc:creator>
				<category><![CDATA[Open-source]]></category>
		<category><![CDATA[gstreamer]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[codec]]></category>
		<category><![CDATA[speex]]></category>

		<guid isPermaLink="false">http://blog.nicolargo.com/2009/06/test-du-codec-speex-dans-gstreamer.html</guid>
		<description><![CDATA[Speex (wiki / site officiel) est un codec audio libre (licence dérivée de BSD) dont les perfomances sont très intéressantes, surtout pour transporter un signal comme la voix humaine. Le but de ce billet est de tester ce codec dans le cadre d'une application de streaming audio.
Mise en place du test
Pour tester ce codec, j'utilise [...]]]></description>
			<content:encoded><![CDATA[<p>Speex <small>(<a href="http://fr.wikipedia.org/wiki/Speex">wiki</a> / </small><small><a href="http://www.speex.org/">site officiel</a>)</small> est un codec audio libre (<a href="http://www.xiph.org/licenses/bsd/speex/">licence</a> dérivée de BSD) dont les perfomances sont très intéressantes, surtout pour transporter un signal comme la voix humaine. Le but de ce billet est de tester ce codec dans le cadre d'une application de streaming audio.<br />
<h1>Mise en place du test</h1>
<p>Pour tester ce codec, j'utilise le <a href="http://blog.nicolargo.com/tag/gstreamer">framework GStreamer</a> et deux scripts shell tournant sur deux machines différentes. Le script <i>rtpserver.sh</i> prend comme source le microphone par défaut de votre machine, encode le flux en Speex, puis le diffuse en RTP/UDP vers la seconde machine. Le script <i>rtpclient.sh</i> récupére le flux RTP/UDP venant de la première machine, le décode et le diffuse sur la sortie son par défaut.</p>
<p>Le script <i>rtpserver.sh</i>:<br />
<blockquote><small>#!/bin/sh</small></p>
<p><small>SEND_TO_ADDR=192.168.29.111</small><br /><small>SEND_TO_RTP_PORT=5003</small><br /><small>SEND_TO_RTCP_PORT=5004</small><br /><small>RECV_FROM_RTCP_PORT=5005</small></p>
<p><small>ENCODER=speexenc</small><br /><small>PAYLOADER=rtpspeexpay</small></p>
<p><small>SPEEX_PARAMS="quality=4 vad=true dtx=true"</small><br /><small>SPEEX_CAPS="audio/x-raw-int,rate=16000" </small></p>
<p><small>ENCODER_PARAMS=${SPEEX_PARAMS}</small><br /><small>RTP_PARAMS="latency=200"</small><br /><small>AUDIO_CAPS=${SPEEX_CAPS}</small></p>
<p><small>gst-launch -v&nbsp; gstrtpbin name=rtpbin ${RTP_PARAMS} \</small><br /><small>alsasrc \</small><br /><small>! queue ! audioresample ! ${AUDIO_CAPS} ! ${ENCODER} ${ENCODER_PARAMS} ! ${PAYLOADER} \</small><br /><small>! rtpbin.send_rtp_sink_1 \</small><br /><small>rtpbin.send_rtp_src_1 ! udpsink port=${SEND_TO_RTP_PORT} host=${SEND_TO_ADDR} \</small><br /><small>rtpbin.send_rtcp_src_1 ! udpsink port=${SEND_TO_RTCP_PORT} host=${SEND_TO_ADDR} sync=false async=false \</small><br /><small>udpsrc port=${RECV_FROM_RTCP_PORT} ! rtpbin.recv_rtcp_sink_1</small></p></blockquote>
<p>Le script <i>rtpclient.sh</i>:<br />
<blockquote><small>#!/bin/sh</small></p>
<p><small>SEND_TO_RTCP_PORT=5005</small><br /><small>RECV_FROM_ADDR=192.168.29.146</small><br /><small>RECV_FROM_RTP_PORT=5003</small><br /><small>RECV_FROM_RTCP_PORT=5004</small><br /><small>AUDIORATE=16000</small></p>
<p><small>gst-launch-0.10 -v gstrtpbin name=rtpbin latency=200 \</small><br /><small>udpsrc caps="application/x-rtp, media=(string)audio, clock-rate=(int)${AUDIORATE}, encoding-name=(string)SPEEX, encoding-params=(string)1, ssrc=(guint)419764010, payload=(int)110, clock-base=(guint)3478167082, seqnum-base=(guint)57894" port=${RECV_FROM_RTP_PORT} \</small><br /><small>! rtpbin.recv_rtp_sink_1 \</small><br /><small>rtpbin. ! rtpspeexdepay ! decodebin ! alsasink \</small><br /><small>udpsrc port=${RECV_FROM_RTCP_PORT} ! rtpbin.recv_rtcp_sink_1 \</small><br /><small>rtpbin.send_rtcp_src_1 ! udpsink port=${SEND_TO_RTCP_PORT} host=${RECV_FROM_ADDR} sync=false async=false</small></p></blockquote>
<p>Attention, il faut lancer le script <i>rtpclient.sh</i> avant le <i>rtpserver.sh</i> . Les variables suivantes sont modifiables dans les scripts:</p>
<p>Script <i>rtpserver.sh</i>:<br /><small>SEND_TO_ADDR: Adresse IP du client</small><br /><small>SEND_TO_RTP_PORT: Numéro de port sur lequel les paquets RTP seront envoyés</small><br /><small>SEND_TO_RTCP_PORT</small><small>: Numéro de port sur lequel les paquets RTCP seront envoyés</small><br /><small>RECV_FROM_RTCP_PORT</small><small>: Numéro de port sur lequel les paquets RTCP seront reçus</small><br /><small>SPEEX_PARAMS: <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-speexenc.html">Paramètres</a> du plugin d'encodage Speexenc</small><br /><small>SPEEX_CAPS: Caps du flux audio (audio rate)</small></p>
<p>Script <i>rtpclient.sh</i>:<br /><small>SEND_TO_RTCP_PORT: </small><small>Numéro de port sur lequel les paquets RTCP seront </small><small>envoyés</small><br /><small>RECV_FROM_ADDR:&nbsp;</small><small> Adresse IP du serveur</small><small></small><br /><small>RECV_FROM_RTP_PORT: </small><small>Numéro de port sur lequel les paquets RTP seront </small><small>reçus</small><br /><small>RECV_FROM_RTCP_PORT: </small><small>Numéro de port sur lequel les paquets RTCP seront reçus</small><br /><small>AUDIORATE: Audio rate, mettre la même valeur que celle dans le caps du serveur</small><br />
<h1>Résultats des tests</h1>
<p>Le premier test a été effectué avec un audio rate de 44000 (bref un taux d'échantillonnage proche de celui d'un CD audio). </p>
<p><u>Paramètres:</u><br />rate=44000 / vad=false / dtx=false<br /><u>Tests:</u><br />En jouant sur l'option quality, on obtient <br />quality=10 -&gt; bande passante de 80 Kbps<br />quality=8 -&gt; bande passante de  60 Kbps<br />quality=6 -&gt; bande passante de  50 Kbps<br /><b>quality=4</b> -&gt; bande passante de  40 Kbps<br />quality=3 -&gt; bande passante de  36 Kbps<br />quality=2 -&gt; bande passante de  35 Kbps<br /><u>Conclusion:</u><br />On obtient une dégradation de la qualité de réception de la voix en dessous d'une valeur de quality de 4. Il est clairement dit dans la documentation que la qualité &gt; 4 son a réserver pour les sources audio plus complexes que la voix humaine (musique, film...). Par contre la consommation de CPU est plus importante (rapport de 5 contre 1 entre quality=10 et quality=1).<br />La bande passante est constante (à quelques Kbps) que l'on parle ou que l'on ne parle pas. </p>
<p><u>Paramètres:</u><br />En jouant sur les paramètres vad et dtx, on va essayer d'optimiser la bande passante en gardant la même qualité.<br /><b>VAD</b> (<small>dixit <a href="http://fr.wikipedia.org/wiki/Speex">Wiki</a></small>): <small>"Quand cette option est activé, le VAD détecte quand l'audio encodé est du dialogue ou du silence/bruit de fond. VAD est toujours implicitement activé en encodage VBR, donc cette option est utile uniquement en mode non VBR. Dans ce cas Speex détecte les périodes sans dialogue et les encode avec le strict minimum de bits pour reproduire le bruit de fond. Cette fonction est appelée Comfort Noise Generation (CNG)."</small><br /><b>DTX</b> (<small>dixit <a href="http://fr.wikipedia.org/wiki/Speex">Wiki</a></small>): <small>"la transmission discontinue est une fonctionnalité qui s'ajoute aux<br />opérations de VAD et de VBR, qui permet de couper la transmission<br />complètement quand le bruit de fond est stationnaire. Dans un fichier,<br />5&nbsp;bits sont utilisés pour chaque <span class="lang-en" xml:lang="en" lang="en"><i>frame</i></span> manquante (correspondant à 250&nbsp;bits/s)"</small><br /><u>Tests:</u><br />On ajoute les paramètres <b>vad=true</b> et <b>dtx=true</b> au niveau du serveur (<small>SPEEX_PARAMS</small>)<br />La bande passante reste la même (40 Kbps) quand on parle, par contre elle passe à 23 Kbps quand on ne parle pas.<br /><u>Conclusion:</u><br />Les algorithmes VAD et DTX fonctionnent très bien. Ils permettent de gagner de la bande passante quand l'activité au niveau sonore est faible (ce qui est le cas dans une conversation ou, normalement, une seule personne parle à un instant t).</p>
<p>En conservant les paramètres du premier test (<b>quality=4, </b><b>vad=true,</b> <b>dtx=true</b>), on change seulement l'audio rate (au niveau du serveur et du client).</p>
<p><u>Paramètres:</u><br />rate=16000<br /><u>Tests:</u><br />Bande passante de 28 Kbps lorsque l'on parle, 17 Kbps pendant les silences.<br /><u>Conclusion:</u><br />La qualité reste excellente. Sur une conversation (voix humaine), on ne voit pas la différence avec un rate de 44000 (44 KHz).</p>
<p><u>Paramètres:</u><br />rate=8000<br /><u>Tests:</u></p>
<p>Bande passante de 23 Kbps lorsque l'on parle, 16 Kbps pendant les silences.</p>
<p><u>Conclusion:</u><br />La qualité est dégradée mais la conversation reste compréhensible. On gagne seulement 5 Kbps par rapport au test précédant. </p>
<h1>Pour conclure<br /></h1>
<p>D'après les tests effectués, le meilleur compromis bande passante qualité est:
<ul>
<li>audio rate = 16000 (16 Khz)</li>
<li>quality = 4</li>
<li>vad = true</li>
<li>dtx = true</li>
</ul>
<p></p>

                            <div id="aspdf">
                                <a href="http://blog.nicolargo.com/wp-content/plugins/as-pdf/generate.php?post=1979">
                                    <span> </span>
                                </a>
                            </div>
                        ]]></content:encoded>
			<wfw:commentRss>http://blog.nicolargo.com/2009/06/test-du-codec-speex-dans-gstreamer.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
