Le blog de Jean David TECHER, un Réunionnais à Saint-Priest/Lyon

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


< 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 >

vendredi 10 avril 2009

[Lighttpd 1.4.20] Script pour démarrer/arrêter/redémarrer

Il existe un script depuis les sources de lighttpd pour l'installer en tant que service. Le script en question est lighttpd-1.4.20/doc/rc.lighttpd qu'il faut adapter à ses propres besoins.

Personellement, je me suis fait ce petit script shell tout simple

root@olivia:~# cat lighttpd-manager.sh 
# lighttpd version
VERSION="1.4.20";

LIGHTTPD_ROOT_PATH="/opt/lighttpd-${VERSION}";
LIGHTTPD_CONFILE="${LIGHTTPD_ROOT_PATH}/conf/lighttpd.conf";

test -f ${LIGHTTPD_CONFILE} || { echo "can not find '${LIGHTTPD_CONFILE}'";exit 1;} 

PATH=${LIGHTTPD_ROOT_PATH}/sbin:${PATH};

function IsRunning(){
	pidof lighttpd > /dev/null;
	return $?;
}

function Msg(){
	echo -ne "\t$1";
}

case $1 in
	"status")
		IsRunning || runResult="not";
		Msg "lighttpd is ${runResult} running\n"; 
		exit 0;
	;;
	"start")
		IsRunning && { Msg "lighttpd is already running...\n"; exit 1;}
		Msg "starting lighttpd...";
		lighttpd -f ${LIGHTTPD_CONFILE};
		sleep 0.5;
		IsRunning && { echo "[OK]";}
		IsRunning || { echo "[KO]";}
	;;
	"stop")
		IsRunning || { Msg "nothing to stop...[KO]";exit 1;}
		IsRunning && { Msg "stopping lighttpd...";killall -9 lighttpd;echo "[OK]"; exit 0;}
		exit 0;
	;;
	"restart")
		Msg "Trying to restart lighttpd...\n";
		IsRunning && { Msg  "stopping lighttpd..."; kill -9 lighttpd;echo "[OK]";sleep 0.5;}
		IsRunning || { Msg "starting lighttpd...";lighttpd -f ${LIGHTTPD_CONFILE};}
		IsRunning && { echo "[OK]";}
		IsRunning || { echo "[KO]";}
	;;
	*)
		echo " (start|stop|restart|status)";
		exit 0;
	;;
esac

On procéde à quelques tests

root@olivia:~# ./lighttpd-manager.sh restart
        Trying to restart lighttpd...
        stopping lighttpd...[OK]
        starting lighttpd...[OK]
root@olivia:~# ./lighttpd-manager.sh stop
        stopping lighttpd...[OK]
root@olivia:~# ./lighttpd-manager.sh restart
        Trying to restart lighttpd...
        starting lighttpd...[OK]
root@olivia:~# ./lighttpd-manager.sh start
        lighttpd is already running...

Petite vidéo de simba en mp4

J'ai profité de la sortie de ffmpeg-0.5 - finalisé le 20090310 -, compilé sur mon serveur pour faire un test avec bibou...

LD_LIBRARY_PATH=/opt/ffmpeg-0.5/lib /opt/ffmpeg-0.5/bin/ffmpeg -y -i simba-200904092315.mov -vcodec libx264 -vpre normal -ar 11025 simba-200904092315.mp4

Comme c'est un fichier .mov - issu de mon appareil numérique -, il faut préciser le flag -ar.

Cliquez sur l'image pour lancer la vidéo

jeudi 9 avril 2009

[Apache] Lutter contre les messages "ad.yieldmanager.com" qui polluent les logs...

Avant hier Ludo m'a appelé en urgence pour me dire que ma machine avait redémarré...Rien d'urgent, si ce n'est qu'il a fallut que je rallume

grep "http://ad.yieldmanager.com/" /var/log/apache/access.log|grep "08/Apr/2009" > /tmp/manager.bad
sort -r /tmp/manager.bad|tail -n 1;tail  -n 1 /tmp/manager.bad
61.139.105.162 - - [06/Apr/2009:15:11:45 +0200] "GET http://ad.yieldmanager.com/imp?z=0&Z=0x0&s=500843&y=30 HTTP/1.1" 302 0 "http%3A%2F%2Fwww.freegameskingdom.com%2Findex.html" "Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x 4.90)" "-"
61.139.105.162 - - [07/Apr/2009:23:09:52 +0200] "GET http://ad.yieldmanager.com/imp?z=0&Z=0x0&s=529628&y=30 HTTP/1.1" 403 289 "http%3A%2F%2Fwww.onlineea.com%2Findex.html" "Mozilla/4.0 (compatible; MSIE 5.01; Windows 98)" "-"

L'attaque a donc duré plus de 33h00...

Avoir le paramètre ProxyRequests Off dans la conf d'apache a retourné des http_code=404 pour un moment mais celà n'a pas suffit.

Le mieux a donc été de faire comme suit en ajoutant ceci dans le fichier de configuration

order deny,allow
deny from ccteam.ru
deny from mobi-info.ru
deny from t35.com
deny from statcounter.com
deny from criticaldamageclan.tripod.com
deny from ad.yieldmanager.com
deny from vernet.lv
deny from apnic.net
deny from 64.92.199.0/24
deny from 64.13.192.0/18
deny from 69.56.128.0/17
deny from 79.112.0.0/13
deny from 137.226.0.0/16
deny from 193.219.28.0/24
deny from 220.129.0.0/16
deny from 220.130.0.0/15
deny from 220.132.0.0/14
deny from 220.136.0.0/13
deny from 222.32.0.0/11
deny from anonym.to
deny from 80.190.192.48
deny from 84.14.116.228
deny from 195.2.114.1
deny from 220.194.47.69
deny from 210.51.10.42
deny from 88.169.192.158
deny from 62.215.3.44
deny from 87.242.116. 
deny from 87.242.117.
deny from 81.177.26. 
deny from 81.177.27.
deny from 125.30. 
deny from 87.239.57. 
deny from 61.240.
deny from 61.139. # Pour la plage d'IP que je veux faire sauter
deny from 61.241.
deny from 61.242. 
deny from 61.243. #China Beijing China United Telecommunications Corporation
deny from 190.129. #Bolivia Cochabamba Entel S.a. - Entelnet
deny from 90.156.169. #Russian Federation Maxhosting Ltd
deny from 195.76.242.227 #Spain Barcelona Sati Grupo Textil S.a
deny from 41.206.160. #South Africa Neotel
deny from 212.72.30. #South Africa Neotel
deny from 83.222.22. #Russian Federation Moscow Masterhost-hst
deny from 83.222.23. #Russian Federation Moscow Masterhost-hst
deny from 85.115.112. #Latvia Riga Mits Lv Sia
deny from 85.115.113. #Latvia Riga Mits Lv Sia

On relance le serveur et el client reçoit

root@olivia:~# grep -e '61.139.105.162' /var/log/apache/error.log|grep -e 'denied' > /tmp/manager.denied
root@olivia:~# sort -r /tmp/manager.denied|tail -n 1;tail  -n 1 /tmp/manager.denied 
[Tue Apr  7 00:56:10 2009] [error] [client 61.139.105.162] client denied by server configuration: /var/www/imp
[Tue Apr  7 23:09:52 2009] [error] [client 61.139.105.162] client denied by server configuration: /var/www/imp

Bingo !!!

Depuis je n'ai plus revu cette IP...

samedi 4 avril 2009

[Lighttpd 1.4.20/Ffmpeg/FlowPlayer] Installation et configuration pour serveur de pseudostreaming en h264/faac mp4

Mise à jour du 2009-04-25: Je tenais à remercier les retours des utilisateurs concernant les installations nécessaires dans ce billet :). Je ferais donc les correctifs nécessaires en fonction des retours

Après mettre livré à des tests avec nginx, je me suis tourné vers lighttpd ces derniers jours vu que le module h264 de code-shop.com supporte ce serveur...Je fournis donc ici les commandes que j'ai utilisé pour mettre en place mes tests. Le but justement est d'utiliser le module h264 développé par code-shop sur un serveur comme lighttpd pour faire du pseudostreaming sur du mp4 (pouvori seeker (= se déplacer sur la vidéo), etc...). J'ai choisi le lecteur Flow Player car il se montre très simple dans son utilisation et est très paramètrable :)

Cet article est donc un condensé de tout ce que j'ai pu trouvé sur le web

Pré-requis

  1. Une version de ffmpeg compilée avec libx264 et libfaac. Si on est sous Ubuntu, on peut prendre ma version compilée en full static - quasiment peu dépendances à part les lib systèmes - disponible à http://www.davidgis.fr/download/ffmpeg-fullstatic-svnr17003.tar.bz2
  2. Une bonne machine (de préférence assez récente) pour faire la conversion
  3. Plan de l'article

    Le plan de cet article est le suivant

    • [Optionnel] Compilation de PHP en mode FastCGI et de xcache pour une question de performance
    • Installation de lighttpd et du module h264 développé par code-shop
    • Conversion en utilisant ffmpeg en mp4
    • Faire cohabiter apache et lighttpd avec mod_proxy: car mon serveur Web par défaut est Apache. Le but est donc de pouvoir afficher la vidéo sans déplacer l'intégralité de mon site par simple redirection.
    • Un exemple avec FlowPlayer

Remarque: comme on ne change pas une équipe comme pour l'un de mes précédents articles, le film en question est une petite vidéo sur Jana Defi....

0. Php et xcache

Lighttpd fonctionne parfaitemment avec une version de PHP compilée en version FastCGI. Ici je propose de l'installer en proposant ce mode

Php

Il faut mieux posséder une version de Php >= 5.2.Y où Y est un numéro de la version

Pour ceux qui souhaite en avoir une, vous pouvez télécharger la mienne un peu veillote mais bon à http://www.davidgis.fr/download/php-5.2.1.tar.bz2

On télécharge, on compile en précisant les 3 options minimums comme suite

wget http://www.davidgis.fr/download/php-5.2.1.tar.bz2 -O -|tar xjf -
cd php-5.2.1 && ./configure --enable-fastcgi --enable-discard-path --enable-force-cgi-redirect && make && make install

A chaque fois que je réinstalle php, j'ai pour habitude de copier le binaire résultant /usr/local/bin/php vers /usr/lig/cgi-bin et de récupérer le fichier php.ini-dist dans ce même répertoire en le renommant en php.ini

mkdir -p /usr/lib/cgi-bin/
cp /usr/local/bin/php /usr/lib/cgi-bin/
cp php.ini-dist /usr/lib/cgi-bin/php.ini

Remarque: il faudra peut-être effectuer quelques réglages pour la suite dans le fichier php.ini en fonction de ce que vous utilisez

Concernant le fichier php.ini

Xcache

Ici je partirais du principe que cette section

wget http://xcache.lighttpd.net/pub/Releases/1.2.2/xcache-1.2.2.tar.gz -O - | tar xzf -
cd xcache-1.2.2
phpize
./configure --enable-xcache
make
make install

make install aura pour effet de déployer la librairie xcache.so dans le répertoire des extensions de php. Chez moi le répertoire en question est obtenue en faisant

root@olivia:~# php-config  --extension-dir
/usr/local/lib/php/extensions/no-debug-non-zts-20060613

On vérifie donc que xcache.so a bien été installé

root@olivia:~/tmp/php-5.2.1# grep xcache -r $(php-config  --extension-dir)
Fichier binaire /usr/local/lib/php/extensions/no-debug-non-zts-20060613/xcache.so concorde

Bingo

Concernant xcache, il est nécessaire d'ajuster quelques paramètres pour la suite. Confomément à la littérature niveau performance que j'ai pu trouvé sur le Web et les diverses recommendations pour ma connexion derrière ma Freebox V4, voici ce que j'ai copié à la fin de mon fichier php.ini. Ce qui suit est donc à mettre et à adapter à la fin de votre fichier php.ini

[xcache-common]
extension = xcache.so
[xcache.admin]
xcache.admin.enable_auth = On
xcache.admin.user = "mOo"
xcache.admin.pass = ""
[xcache]
xcache.shm_scheme =        "mmap"
xcache.size  =                128M
xcache.count =                 1
xcache.slots =                8K
xcache.ttl   =                 0
xcache.gc_interval =           0
xcache.var_size  =            10M
xcache.var_count =             1
xcache.var_slots =            8K
xcache.var_ttl   =             0
xcache.var_maxttl   =          0
xcache.var_gc_interval =     300
xcache.test =                Off
xcache.readonly_protection = Off
xcache.mmap_path =    "/dev/zero"
xcache.coredump_directory =   ""
xcache.cacher =               On
xcache.stat   =               On
xcache.optimizer =           On
[xcache.coverager]
xcache.coverager =          Off
xcache.coveragedump_directory = ""
cgi.fix_pathinfo=1

1. LIGHTTPD

1. Lighttpd - Préparation avant compilation

Il faut suivre les indications de http://h264.code-shop.com/trac/wiki/Mod-H264-Streaming-Lighttpd-Version2

On télécharge donc les sources remaniées de lighttpd version 1.4.18 ainsi que les sources du module h264 streaming

svn export http://h264.code-shop.com/svn/h264/tags/mod_h264_streaming-2.0/lighttpd-1.4.18 lighttpd-1.4.18
svn export --force http://h264.code-shop.com/svn/h264/tags/mod_h264_streaming-2.0/mp4split lighttpd-1.4.18/src

On télécharge ensuite les sources de lighttp 1.4.20

wget http://opensu.se/~darix/lighttpd/lighttpd-1.4.20.prerelease.r2303.tar.gz -O - | tar xzf -

Ensuite, il faut procéder à quelques modifications et copie de fichiers

  • Il faut copier les sources du modules h264 vers ceux de lighttpd 1.4.20
    cp lighttpd-1.4.18/src/moov.* lighttpd-1.4.20/src/
    cp lighttpd-1.4.18/src/mod_h264_streaming.c lighttpd-1.4.20/src/
    
  • Il est ensuite nécessaire de modifier le fichier lighttpd-1.4.20/src/Makefile.am afin que le module h264 soit compilé, en ajoutant les lignes suivantes
    lib_LTLIBRARIES += mod_h264_streaming.la
    mod_h264_streaming_la_SOURCES = mod_h264_streaming.c moov.c
    mod_h264_streaming_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined
    mod_h264_streaming_la_LIBADD = $(common_libadd)
    	

2. Lighttpd - Compilation, Installation

On lance la configuration

./configure --enable-maintainer-mode --prefix=/opt/lighttpd-1.4.20
make
make install

3. Lighttpd - configuration pour h264 et demarrage

Personnellement, j'ai récupéré le fichier conf/lighttpd.conf contenu dans les sources et je l'ai copié vers /opt/lighttpd-1.4.20/conf

mkdir /opt/lighttpd-1.4.20/conf
cp ~/lighttpd-1.4.20/openwrt/lighttpd.conf /opt/lighttpd-1.4.20/conf

Conformément aux notes de http://h264.code-shop.com/trac/wiki/Mod-H264-Streaming-Lighttpd-Version2, en fusionnant toutes les recommendations fournis, mon fichier de configuratione est

root@olivia:~# grep -v -e "^#" -e "^$" /opt/lighttpd-1.4.20/conf/lighttpd.conf 
server.modules              = (
			        "mod_access",
				"mod_expire",
				"mod_secdownload",
				"mod_h264_streaming"				
)
server.document-root             = "/www/"
server.indexfiles          = ( "index.php", "index.html",
                                "index.htm", "default.htm" )
mimetype.assign            = (
  ".pdf"          =>      "application/pdf",
  ".sig"          =>      "application/pgp-signature",
  ".spl"          =>      "application/futuresplash",
  ".class"        =>      "application/octet-stream",
  ".ps"           =>      "application/postscript",
  ".torrent"      =>      "application/x-bittorrent",
  ".dvi"          =>      "application/x-dvi",
  ".gz"           =>      "application/x-gzip",
  ".pac"          =>      "application/x-ns-proxy-autoconfig",
  ".swf"          =>      "application/x-shockwave-flash",
  ".tar.gz"       =>      "application/x-tgz",
  ".tgz"          =>      "application/x-tgz",
  ".tar"          =>      "application/x-tar",
  ".zip"          =>      "application/zip",
  ".mp3"          =>      "audio/mpeg",
  ".m3u"          =>      "audio/x-mpegurl",
  ".wma"          =>      "audio/x-ms-wma",
  ".wax"          =>      "audio/x-ms-wax",
  ".ogg"          =>      "audio/x-wav",
  ".wav"          =>      "audio/x-wav",
  ".gif"          =>      "image/gif",
  ".jpg"          =>      "image/jpeg",
  ".jpeg"         =>      "image/jpeg",
  ".png"          =>      "image/png",
  ".xbm"          =>      "image/x-xbitmap",
  ".xpm"          =>      "image/x-xpixmap",
  ".xwd"          =>      "image/x-xwindowdump",
  ".css"          =>      "text/css",
  ".html"         =>      "text/html",
  ".htm"          =>      "text/html",
  ".js"           =>      "text/javascript",
  ".asc"          =>      "text/plain",
  ".c"            =>      "text/plain",
  ".conf"         =>      "text/plain",
  ".text"         =>      "text/plain",
  ".txt"          =>      "text/plain",
  ".dtd"          =>      "text/xml",
  ".xml"          =>      "text/xml",
  ".mpeg"         =>      "video/mpeg",
  ".mpg"          =>      "video/mpeg",
  ".mov"          =>      "video/quicktime",
  ".qt"           =>      "video/quicktime",
  ".avi"          =>      "video/x-msvideo",
  ".asf"          =>      "video/x-ms-asf",
  ".asx"          =>      "video/x-ms-asf",
  ".wmv"          =>      "video/x-ms-wmv"
 )
h264-streaming.extensions = ( ".mp4", ".f4v" )

url.access-deny             = ( "~", ".inc" )
server.port                = ????
$HTTP["url"] =~ "\.(mp4|f4v)$" {
   expire.url = ( "" => "access 8 hours" )
}
secdownload.secret          = "secret"
secdownload.document-root   = "/var/www/video/"
secdownload.uri-prefix      = "/video/"
secdownload.timeout         = 3600

??? ligne server.port est le port pour lighttpd. On prendra soin de noter que contrairement aux recommendations, le paramètre h264-streaming.buffer-seconds = 10 n'est pas reconnu par lighttpd.

3.2 Lighttpd -test du fichier de configuration et démarrage de lighttpd

Pour tester, le fichier on fait

root@olivia:~# /opt/lighttpd-1.4.20/sbin/lighttpd  -t -f /opt/lighttpd-1.4.20/conf/lighttpd.conf
Syntax OK

Pour lancer le serveur sans le mettre en background:

root@olivia:~# /opt/lighttpd-1.4.20/sbin/lighttpd  -D -f /opt/lighttpd-1.4.20/conf/lighttpd.conf
2009-04-04 14:52:51: (log.c.97) server started 

sinon il suffit d'enlever le flag '-D'. Un simple [CTRL]+[C] pour arrêter le serveur...

3.4 Lighttpd - Intégration et activation de PHP

Comme j'ai déjà ma version de php compilé en CGI pour MapServer, il me suffit d'ajouter

  • pour la partie consacrée aux modules:
    server.modules              = (
                                    ...
                                    "mod_fastcgi",
                                    ...
    )
    
  • et pour fastcgi.server
    fastcgi.server = ( ".php" => ((
      "bin-path" => "/usr/lib/cgi-bin/php",
      "socket" => "/tmp/php.socket"
      ))) 
    

/usr/lib/cgi-bin/php est mon binaire php déjà disponible car utilisé avec MapServer (comme quoi mon expérience sous les SIG est utile ici )...

Version de développement 2.1 du module h264 - Notes personnelles

La version actuellement en cours de développement est la 2.1rc. Pour la tester

LIGHTTPD_VERSION="5.0";

cd $HOME
[-d "$HOME/lighttpd-1.${LIGHTTPD_VERSION}"] && rm -rf lighttpd-1.${LIGHTTPD_VERSION}

svn export http://h264.code-shop.com/svn/h264/tags/mod_h264_streaming-2.1rc/lighttpd-1.${LIGHTTPD_VERSION} lighttpd-1.${LIGHTTPD_VERSION}
svn export --force http://h264.code-shop.com/svn/h264/tags/mod_h264_streaming-2.1rc/mp4split lighttpd-1.${LIGHTTPD_VERSION}/src

cd lighttpd-1.${LIGHTTPD_VERSION}
./configure --enable-maintainer-mode --prefix=/opt/lighttpd-1.${LIGHTTPD_VERSION}
make
make install
cd

/opt/lighttpd-1.${LIGHTTPD_VERSION}/sbin/lighttpd -D -f /opt/lighttpd-1.${LIGHTTPD_VERSION}/conf/lighttpd.conf

Je me note ici lesdifférences suivantes par rapport à lighttpd 1.4.X (à tester plus tard quand j'aurais le temps )

  • la révision actuelle du dépot SVN est la 125
  • l'activation de PHP utilise deux autres modes autre que mod_fascgi; (mode_proxy??? et ??? pas encore tester)...
  • Au démarrage le serveur est en mode debug...beaucoup de traces concernant le déplacement pendant le lecture d'une vidéo.

Ffmpeg -conversion des films en h264/acc pour mp4

Pour la suite, il faut disposer d'une version assez récente de ffmpeg. Sur le site de code-shop.com, est proposé des options pour ffmepg disponibles à http://h264.code-shop.com/trac/wiki/Encoding. A partir de maintenant, il est aussi bien possible de reprendre les options proposées que d'utiliser les ffpresets de ffmepg.

L'utilisation depuis http://h264.code-shop.com/trac/wiki/Encoding suppose que les vidéos ne soients pas énormes en dimension ou d'avoir une bande passante assez conséquente. Elles sont adaptées pour la plupart des cas. Personnellement je me tourne maintenant vers les ffpresets.

Si on a les sources de ffmpeg, il suffit de les récupérer et de les mettre dans son home dans le sous-répertoire .ffmpeg

mkdir $HOME/.ffmpeg
cp /chemin/source/de/ffmpeg/ffpresets/*ffpreset $HOME/.ffmpeg/

Plusieurs modes sont disponibles

root@olivia:~# ls $HOME/.ffmpeg
libx264-baseline.ffpreset       libx264-hq.ffpreset       libx264-lossless_fast.ffpreset    libx264-lossless_slower.ffpreset     libx264-main.ffpreset    libx264-slowfirstpass.ffpreset
libx264-default.ffpreset        libx264-ipod320.ffpreset  libx264-lossless_max.ffpreset     libx264-lossless_slow.ffpreset       libx264-max.ffpreset
libx264-fastfirstpass.ffpreset  libx264-ipod640.ffpreset  libx264-lossless_medium.ffpreset  libx264-lossless_ultrafast.ffpreset  libx264-normal.ffpreset

Après quelques tests, j'ai donc jeté mon dévolu sur les modes normal et hq vu que mon serveur est derrière une FreeBox V4...Mais la qualité est satisfaisante

Exemple sur un avi

Sur le serveur j'ai un film de deux minutes de Jana Defi - que votre bienfaiteur aura trouvé sur le Web -. Avant de lancer la conversion, il me faut connaître les dimensions:

root@olivia:~# ffmpeg -i Jana_Defi_Nuts_Issue_3-2007.avi 2>&1|grep Video
    Stream #0.0: Video: mpeg4, yuv420p, 480x270 [PAR 1:1 DAR 16:9], 25.00 tb(r)

Déjà les dimensions sont width=480 et height=270. Si je lance la conversion immédiatemment, ffmpeg effectuera la conversion mais me renverra le message

libx264 @ 0x84d8970]width or height not divisible by 16 (480x270),compression will suffer.

Alors

  • 480 / 16 = 30...c'est OK
  • 270 / 16 = 16 x 16 + 14...pas OK....L'astuce va donc résider à jouer sur l'ajout horizontal de bande noir autour de la vidéo. Celà concerne les flags -padtop et -padbottom. Ces deux derniers doivent être des multiples de 2. Je vais me contenter d'opérer qu'une bande noire de longueur 2 en bas

Pour la conversion, on prend du HQ, ce qui donne donc

 ffmpeg -y -i Jana_Defi_Nuts_Issue_3-2007.avi -vcodec libx264 -padtop 0 -padbottom 2 -g 30 -vpre hq /tmp/tmpfile.mp4 ;
qt-faststart /tmp/tmpfile.mp4 Jana_Defi_Nuts_Issue_3-2007.mp4

REMARQUE:

Pour obtenir qt-faststart, il faut le compiler depuis les sources de ffmpeg et le copier dans un répertoire disponible du PATH

cd /chemin/source/de/ffmpeg/tools
gcc -o qt-faststart qt-faststart.c
cp qt-faststart /usr/local/bin

Note sur les keyframes

Pour jouer sur les keyframes, il faut paramètrer le flag -g de ffmpeg. A tester en fonction de vos vidéos!!!

Faire cohabiter Apache 1.3 et lighttpd: mod_proxy

Mon blog étant sous Apache, il est possible le temps de ce billet de les faire cohabiter, en activant le module proxy d'apache et en procédant à une redirection. Bien sûr, il est nécessaire que le port soit ouvert. Pour la suite, ici [PORT]désigne le port en question.

Dans le script /etc/apache/modules.conf, on active le mod_proxy:

root@olivia:~# grep proxy /etc/apache/modules.conf
LoadModule proxy_module  /usr/lib/apache/1.3/libproxy.so

Pour la suite, je vais me créer deux répertoires:

  • /www/movies qui contiendra mes films
  • /www/imagettes qui contiendra les imagettes de mes films avant le chargement de la vidéo

Pour procéder à la redirection, dans le fichier de configuration d'apache - /etc/apache/httpd.conf -, on effectue la redirection suivante

    ProxyPass  /movies http://www.davidgis.fr:[PORT]/movies
    ProxyPassReverse  /movies http://www.davidgis.fr:[PORT]/movies
    ProxyPass  /imagettes http://www.davidgis.fr:[PORT]/imagettes
    ProxyPassReverse  /imagettes http://www.davidgis.fr:[PORT]/imagettes

REMARQUE IMPORTANTE: S'assurer de laisser de ne pas activer le paramètre ProxyRequests Off

REMARQUE: Comme je parle d'imagette pour le film que j'ai précédemment converti, pour créer l'imagette, je fais

ffmpeg -y -i /www/movies/Jana_Defi_Nuts_Issue_3-2007.mp4 -an -ss 00:00:14 -r 1 -vframes 1 -f mjpeg /www/imagettes/Jana_Defi_Nuts_Issue_3-2007.png

Flow Player: lecteur Flash

Téléchargement

Récemment en date du 2009-03-07, une nouvelle version estampillé en 3.0.7 est disponible sur le site flowplayer.org...

Pour de plus amples renseignements concernant le pseudostreaming, il faut se rendre à http://flowplayer.org/plugins/streaming/pseudostreaming.html

Il est nécessaire de télécharger la version GPL ainsi qu'un le binaire swf disponible sur le précédent lien (voir fin de page)....

Bon allez, on se montre sympa, on peut tout récupérer directement tout ça à http://www.davidgis.fr/download/flowplayer-3.0.7-h264.zip

Le zip en question contiendra donc

  • flowplayer-3.0.6.min.js
  • flowplayer-3.0.7.swf
  • flowplayer.controls-3.0.4.swf
  • flowplayer.pseudostreaming-3.1.1.swf

Un exemple

<script type="text/javascript" src="flowplayer-3.0.6.min.js"></script>

<a style="display:block;width:480px;height:272px" id="jana">
	<img src='/imagettes/Jana_Defi_Nuts_Issue_3-2007.png'/>
</a>

<script type="text/javascript">
flowplayer("jana", "flowplayer-3.0.7.swf", {
  clip: {
    url: '/movies/Jana_Defi_Nuts_Issue_3-2007.mp4',
    provider: 'h264streaming'
  },
  plugins: {
    h264streaming: {
      url: 'flowplayer.pseudostreaming-3.1.1.swf'
    },
    controls: {  
      url: 'flowplayer.controls-3.0.4.swf',  
      play:false,       
      fullscreen:true,  
      scrubber: true          
    }               
  }
});

</script>

Ce qui donnera par exemple

Cliquez sur l'image pour lancer la vidéo. L'encodage est de qualité moyenne vu ma connexion chez Free!

Incorporer le button play à l'imagette

Ceci est une mise à jour de ce billet

Il faut récupérer le bouton en question à http://flowplayer.org/img/player/btn/play_text.png

donc
wget http://flowplayer.org/img/player/btn/play_text.png

Puis

ffmpeg -y -i Jana_Defi_Nuts_Issue_3-2007.mp4 -an -ss 00:00:14 -r 1 -vframes 1 -f mjpeg -vhook '/usr/lib/vhook/imlib2.so -x W/2-52  -y H/2-20  -i play_text.png' Jana_Defi_Nuts_Issue_3-2007.png