18 novembre 2007
Gestion de vidéos
Une appication AIR de plus, elle permet de gérer ses contenus vidéos, sur la plateforme ooyala.
Ci joint une capture d'écran de ce que l'on peut faire avec. 
16 novembre 2007
Exif actionscript
Bon, puisqu'en ce moment c'est la fête du byte reading, voilà la lecture des infos exif d'un fichier image sans le charger
Les classes sont dispos chez Antti Kupilla
En plus des classes il y a une super explication et pour ceux que ça intéresse c'est très instructif.
Juste un petit truc au passage, je ne fais pas de flex pour le web, (on s'en fout :)), ok, ce qui me plait c'est surtout AIR, donc encore une fois (rapport à la lecture des id3), il faut modifier l'accès au fichier pour utiliser ces classes avec AIR.
Ci dessous la classe modifiée pour lire un fichier en local.
package
{
import flash.display.*;
import flash.events.*;
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;
import flash.net.*;
import flash.utils.*;
public class ExifReader extends Sprite {
// private var image:URLLoader = null;
private var image:FileStream = new FileStream() ;
private var _contentExif:String = null;
public function ExifReader( path:String = "YOUR_DEFAULT_TEST_FILE" ) {
//// Connection distante
/*
var request:URLRequest = new URLRequest( path );
image = new URLLoader();
//image.dataFormat = DataFormat.BINARY;
image.addEventListener( Event.COMPLETE, parse );
image.load( request );
*/
// Contenu local
var sourceFile:File = new File();
sourceFile.nativePath = path;
image.openAsync(sourceFile, FileMode.READ);
image.addEventListener( Event.COMPLETE, parse );
}
public function parse( event:Event ):void {
var contents:Array = null;
var dump:Array = null;
var ifd:Array = null;
var data:ByteArray = new ByteArray();
var exif:uint = 0;
var interop:uint = 0;
var length:uint = 0;
var tiff:TIFF;
image.readBytes( data, 0, 12 );
if( !isJpeg( data ) || !hasExif( data ) ) {
trace( "Not a JPEG containing EXIF data." );
return;
}
data.position = 4;
length = data.readUnsignedShort();
trace( "EXIF header length: " + length + " bytes" );
image.readBytes( data, 0, length - 8 );
if( data[0] == 73 ) {
trace( "Intel format" );
} else {
trace( "Motorola format" );
}
tiff = new TIFF( data );
ifd = tiff.list();
for( var i:int = 0; i < ifd.length; i++ ) {
if( i == 0 ) {
trace( "Main image" );
} else if( i == 1 ) {
trace( "Thumbnail image" );
}
contents = tiff.dump( ifd[i] );
tiff.print( contents, TIFF.EXIF_TAGS );
exif = 0;
for( var t:int = 0; t < contents.length; t++ ) {
if( contents[t].getTag() == 34665 ) {
exif = contents[t].getValues()[0];
}
}
if( exif != 0 ) {
contents = tiff.dump( exif );
tiff.print( contents, TIFF.EXIF_TAGS );
interop = 0;
for( var s:int = 0; s < contents.length; s++ ) {
if( contents[s].getTag() == 40965 ) {
interop = contents[s].getValues()[0];
}
}
if( interop != 0 ) {
contents = tiff.dump( interop );
tiff.print( contents, TIFF.INTEROP_TAGS );
}
dispatchEvent(new Event(Event.COMPLETE));
}
}
}
public function isJpeg( data:ByteArray ):Boolean {
var jpeg:Boolean = false;
if( data[0] == 255 && data[1] == 216 &&
data[2] == 255 && data[3] == 225 ) {
jpeg = true;
}
return jpeg;
}
public function hasExif( data:ByteArray ):Boolean {
var exif:Boolean = false;
if( data[6] == 69 && data[7] == 120 &&
data[8] == 105 && data[9] == 102 ) {
exif = true;
}
return exif;
}
}
}
Si vous passez par là et que vous connaissez des tutos sur la lecture d'infos dans les fichiers je suis preneur.
Enjoy !!
si je me souviens bien il y a des petites fautes de frappes, je crois qu'il manque les s sur les import de flash.utils et des V majuscules sur les void qui ont géné flex pour la compile.
14 novembre 2007
RandomWin
Cette application vous permet de prendre des photos de personnes, prendre leur nom, et enfin de faire un tirage au sort ... A utiliser partout ou on en a besoin :)
Et à télécharger sur CodeMoiUnMouton
13 novembre 2007
VideoChat avec Adium
Vu sur le blog de Adium un plug in qui permet de faire des visioconferences jusqu'a 15 personnes, il serait dèv en flash ce qui ne gâche rien :)
Bon je l'ai installé, maintenant il va falloir convaincre des gens pour le tester :)
Lire les ID3 d'un fichier
Lire les balises d'un mp3 peux sembler simple, c'est vrai si on accepte de lancer un objet sound.
Mais mon but étant simplement de récupérer les données pour les afficher, je ne trouvais pas très propre de lancer le son en arrière plan avec un volume à zéro le temps de récupérer les infos.
Heureusement Mr Ben Stucki nous a concoté un super tutoriel sur la lecture d'un fichier binaire et la récupération des tags sur un fichier mp3
http://labs.adobe.com/wiki/index.php/AIR:Articles:Working_with_Binary_Data#Reading_binary_data
L'un des principaux problèmes de ce tuto pour les maceux, c'est l'utilisation de browse .... :( un jour peut être.
Enfin pour ça il suffit de déterminer soit même le chemin du fichier que l'on souhaite lire.
Pour ça je donne le path du fichier comme argument de la fonction.
Un autre petit souci c'est que l'exemple considère que les fichiers sont bien tagés ce qui malheureusement n'est pas toujours le cas, j'ai donc ajouté (en rouge )un test try ... catch pour eviter l'erreur 2030.
Et modifié (en vert) la manière de récupérer les infos notamment parce que sur certains mp3 le titre n'est pas dans TIT2 mais TT2, une question de version je crois.
Le code original et les autres fonctions nécéssaires sont disponibles via le lien précédent.
SongTitle, SongAlbum, SongArtiste sont les noms de mes champs textes ou variables à vous de les adapter au votre.
private function loadLocalID3( pathDuFichier:String ):void {
var file:File = new File();
file.nativePath = pathDuFichier;
var bytes:FileStream = new FileStream();
bytes.open(file, FileMode.READ);
// read in sequence
var tagId:String = bytes.readUTFBytes(3);
var majorVersion:Number = bytes.readByte();
var minorVersion:Number = bytes.readByte();
var flags:int = bytes.readByte();
var tagSize:uint = convertSynchsafe(bytes.readUnsignedInt())
trace("id: " + tagId);
if(flags==0) {
//frames
while(bytes.position < tagSize) {
var id:String = bytes.readUTFBytes(4);
var size:uint = bytes.readUnsignedInt();
var flags1:int = bytes.readByte();
var flags2:int = bytes.readByte();
if(id!="") { trace(id); }
if(id.charAt(0)=="T") {
try{
var encodingFlag:int = bytes.readByte();
var text:String = bytes.readUTFBytes(size-1);
if(id == "TIT2"){
SongTitle.text = text;
}
if(id == "TT2"){
SongTitle.text = text;
}
if(id == "TPE1"){
SongArtist.text = text;
}
if(id == "TALB"){
SongAlbum = text;
}
} catch(error:EOFError){
trace (error.message);
}
} else if(id == "APIC") {
var start:int = bytes.position;
var textEncoding:int = bytes.readByte();
var mime:String = readISO(bytes);
var pictureType:int = bytes.readByte();
var description:String = readISO(bytes);
var stop:int = bytes.position;
var imageSize:int = size-(stop-start);
var image:ByteArray = new ByteArray();
bytes.readBytes(image,0,imageSize);
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
loader.loadBytes(image);
} else {
bytes.position += size;
}
}
SongTitle.text = SongTitle.text+' '+SongAlbum; // Ca c'est perso j affiche le titre et l album dans le même champs
}
}
La ou Mr Stucki fait très fort, c'est sur son blog ou il propose de récupérer le contenu des balises ID3 d'un élément distant (ce post à pratiquement deux ans :)), mais il fonctionne avec flex3 beta 2 donc pas de soucis.
Il faut refaire les opérations citées précédemment dans le code car il y a le même type de problèmes sur les fichiers qui n'ont pas de tags ou pas les mêmes.
D'ici quelques temps, j'espère être moins chargé et faire un tutoriel complet sur le sujet, il me faut aussi un vrai blog avec de l'affichage de code et un moteur de recherche parce que là c'est n'importe quoi :)
11 novembre 2007
CoverFlow avec flex
Disponible sur http://dougmccune.com/blog/2007/11/03/coverflow-flex-component/
Un composant FLex qui permet de simuler un cover Flow type OSX.
Il permet aussi très simplement de charger d'autre composant.
Je pense le tester dans la foulée et faire un petit compte rendu des problèmes rencontrés, notamment les problèmes de ralentissement du au nombre d'items.
09 novembre 2007
Un autre bureau virtuel
Les bureaux virtuels ce n'est pas trop mon truc, surement parce que un j'ai déja essayé mais trop tôt on va dire, et du coup beaucoup de temps et d'énergie pour un résultat disons mitigé (super expérience et mauvais bilan :) ).
Et deux certainement parce que si je retombe dedans je vais y retourner....
Mais là il a un petit lien avec le jouet du moment (AIR), vous devez connaitre www.yourminis.com, cette appli AIR qui lance pleins de widgets pour faire que des trucs inutiles ... l'heure, youtube, ebay enfin le web 2 en gros :). Attention l'appli est bien en elle même, c'est le contenu des widgets qui ne me convient pas...
Et bien ils ont aussi fait un bureau virtuel que j'ai trouvé bien sympathique et abouti, et surtout une belle démo de flex, il y a énormément de modules disponibles, tous avec des fonctionnalités particulières, bref beaucoup de travail.
08 novembre 2007
AS3 le replace du pauvre :)
Pour avoir un bel affichage alors que je lis des noms de fichiers je voulais remplacer les _ par des espaces, simple et efficace à la fois non ?
alors je cherche dans la doc et effectivement il y a une méthode replace() dans la classe String... Parfait.
Je fais ma petite fonction et Ho!! la surprise, il ne me remplace que le premier, je viens du monde php ou un ereg_replace sur une chaine de caractère remplace toute les occurrences trouvées.
Bon la soluce n'est pas très compliquée c'est sur, il faut utiliser les expressions régulières
private function showTitle(item:Object):String{
var itemString:String = item.title;
var pattern:RegExp = /_/g; // le g pour spécifier que l'on veut remplacer toutes les occurrences :)
itemString = itemString.replace(pattern," ");
trace ('itemString '+itemString);
return itemString;
}
Flash player 9 update mieux vaut tard que jamais
Pour ceux qui comme moi seraient passé à coté, il y a une nouvelle version du flash player la 9.0.98.0 que l'on peut télécharger sur el lab d'adobe.
http://labs.adobe.com/downloads/flashplayer9.html
07 novembre 2007
Diagramme de Gant avec un dataGrid
Vu sur le oueb, pour ceux que ça intéresse, comment faire un diagramme de gant avec un datagrid
http://www.cynergysystems.com/blogs/page/andrewtrice?entry=gantt_charts_in_flex_datagrids
