I - MOTIVATIONS
Comme lundi c'était mon anniversaire, je ne travaillais pas donc j'ai décidé de faire un petit film sur Simba, mon gros chat d'amour! Seulement je voulais faire à partir des films issus de mon appareil numérique en. Je me suis donc compliqué la tâche, histoire de me remplir la journée comme il faut. J'ai donc décidé de tout faire en MinG.
Je me suis surtout inspiré de ce billet http://www.ioncannon.net/php/110/using-flash-video-metadata-to-display-annotations/
II - CODE PHP et FICHIER XML
II.a) le code php
Je me suis pour celà inspiré du code fourni en faisant pour moi dans un fichier flahsplayer.php
<?php
function createImage($img)
{
$shape = new SWFShape();
$shape->setRightFill($shape->addFill(new SWFBitmap(fopen($img, "rb"))));
$shape->drawLine(16,0);
$shape->drawLine(0,16);
$shape->drawLine(-16,0);
$shape->drawLine(0,-16);
return $shape;
}
function createButton($movie, $name, $loc, $script)
{
$button = new SWFButton();
$button->addShape(createImage("control_" . $name . ".png"), SWFBUTTON_UP);
$button->addShape(createImage("control_" . $name . "_blue.png"), SWFBUTTON_DOWN | SWFBUTTON_HIT | SWFBUTTON_OVER);
$button->addAction(new SWFAction($script), SWFBUTTON_HIT);
$item=$movie->add($button);
$item->moveto($loc,248);
}
Ming_setScale(20.0000000);
ming_useswfversion(7);
$movie = new SWFMovie(7);
$movie->setDimension(320,270); // width x height
$movie->setBackground(0,0,0);
$movie->setRate(8);
createButton($movie, "start", 10, "_root.videoStream.seek(0);");
createButton($movie, "pause", 40, "_root.videoStream.pause(true);");
createButton($movie, "play", 70, "_root.videoStream.pause(false);");
$strAction = "
this.createTextField('video_txt', 999, 0, 0, 100, 100);
video_txt.autoSize = 'left';
video_txt.multiline = true;
video_txt.textColor = 0xeeeeee;
stop();
nc=new NetConnection();
nc.connect(null);
videoStream=new NetStream(nc);
videoStreamItem.attachVideo(videoStream);
videoStream.setBufferTime(10);
videoStream.play('http://www.davidgis.fr/download/swf/simbafilm.flv');
videoStream.pause();
videoStream.onCuePoint = function(infoObject)
{
video_txt.text = '' + infoObject.name + '\n';
if( infoObject.parameters != undefined )
{
video_txt.text += ' ' + infoObject.parameters['mydata'] + '\n';
}
else
{
video_txt.text = ' \n';;
}
};
";
$stream = new SWFVideoStream();
$stream->setDimension(320, 240);
$item=$movie->add($stream);
$item->setName("videoStreamItem");
$movie->add(new SWFAction($strAction));
$movie->nextFrame();//video_txt.text += 'Info: undef\n';
$movie->save("simbafilm.swf");
?>
II.b) le code XML
Ici j'ai adapté le code à mon usage personnel. J'ai donc créé un fichier tags.xml dont le contenu est
<tags>
<metatag event="onCuePoint" overwrite="true">
<name>SIMBA DANS TOUTE SA SPLENDEUR</name>
<timestamp>1000</timestamp>
<parameters>
<mydata>TOUJOURS PRET A JOUER</mydata>
</parameters>
<type>event</type>
</metatag>
<metatag event="onCuePoint" overwrite="true">
<name> </name>
<timestamp>4000</timestamp>
<parameters>
<mydata>..UN PETIT RIEN L'AMUSE...</mydata>
</parameters>
<type>event</type>
</metatag>
<metatag event="onCuePoint" overwrite="true">
<name>MAIS OUI, MAIS OUI...!</name>
<timestamp>10000</timestamp>
<parameters>
<mydata>FELIN REDOUTABLE, SPLENDIDE</mydata>
</parameters>
<type>event</type>
</metatag>
<metatag event="onCuePoint" overwrite="true">
<name>Simba</name>
<timestamp>12000</timestamp>
<parameters>
<mydata>JEUNE, BEAU, VIF...</mydata>
</parameters>
<type>event</type>
</metatag>
<metatag event="onCuePoint" overwrite="true">
<name> </name>
<timestamp>14000</timestamp>
<parameters>
<mydata>ADMIREZ LA RAPIDITE ET LA PRECISION DU FELIN</mydata>
</parameters>
<type>event</type>
</metatag>
II.c) Ajout des boutons
Comme sur le billet de l'auteur pour avoir mes boutons, j'ai téléchargé les images
wget http://www.famfamfam.com/lab/icons/silk/icons/control_pause.png
wget http://www.famfamfam.com/lab/icons/silk/icons/control_pause_blue.png
wget http://www.famfamfam.com/lab/icons/silk/icons/control_start.png
wget http://www.famfamfam.com/lab/icons/silk/icons/control_start_blue.png
wget http://www.famfamfam.com/lab/icons/silk/icons/control_play.png
wget http://www.famfamfam.com/lab/icons/silk/icons/control_play_blue.png
III - Conversion du fichier .MOV en .FLV
III.a) Commandes et souci avec ffmpeg
Normalement les deux lignes à saisir pour la conversion
mencoder -mc 0 -noskip -oac pcm -ovc lavc -ffourcc DX50 -vop scale=320:240 -o simba.avi pict0943.mov
ffmpeg -i simba.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv simbafilm.flv
Or pour avoir le son dans le fichier flv, il faut que ffmpeg ait été compilé avec l'option --enable-mp3lame. La première commande ne pose aucun problème pour le son!
Ce qui n'était pas le cas pour moi! Donc je suis allé sur http://doc.ubuntu-fr.org/formats_non-libres#activer_le_support_du_mp3_et_de_l_amr_dans_ffmpeg. J'ai donc adapté mon /etc/apt/source.list pour avoir le dépôt multiverse comme il faut et ensuite j'ai fait
cd /usr/local/src
apt-get install dpkg-dev libimlib2-dev texi2html liblame-dev libfaad2-dev libmp4v2-dev libfaac-dev \
libxvidcore4-dev debhelper libogg-dev libvorbis-dev liba52-dev libdts-dev libsdl1.2debian-all \
libraw1394-dev libdc1394-13-dev libtheora-dev libgsm1-dev
wget http://blogger.rukker.org/dl/ffmpeg_enable_amr.patch.bz2
apt-get source ffmpeg
cd ffmpeg-0.cvs20050918 <----- le nom de répertoire est différent pour moi
bzcat ../ffmpeg_enable_amr.patch.bz2 | sudo patch -p1
DEB_BUILD_OPTIONS=”risky” sudo dpkg-buildpackage
cd ..
dpkg -i ffmpeg_0.cvs20060823-5ubuntu1_i386.deb
Et la nouvelle installation de ffmepg m'a permis de pouvoir vérifier que j'avais bien le support --enable-mp3lame
IV - AJOUT DES METATAGS DU FICHIER XML AU FICHIER FLV
IV.a) Pré-requis
J'avais déjà ruby d'installé donc je pouvais passer à la suite
IV.b) Compilation de FFVTOOL2
flvtool2 est l'utilitaire qui va me permettre d'ajouter de combiner mon fichier xml à mon fichier flv. J'ai donc commencé à l'installer
wget http://rubyforge.org/frs/download.php/9225/flvtool2_1.0.5_rc6.tgz
tar xvzf flvtool2_1.0.5_rc6.tgz
J'ai ensuite suivi les instructions fournis dans le fichier flvtool2_1.0.5_rc6/README
ruby setup.rb config
ruby setup.rb setup
sudo ruby setup.rb install
IV.c) Utilisation de flvtool2
Il m'a suffit de faire
flvtool2 -AUtP tags.xml simbafilm.flv