le lab

Movie getDuration() avec QTJava

QTJava me sert à pas mal de choses. Notamment, je m'en sers pour déterminer automatiquement la durée des films 3gp sur Mobipict. J'en profite juste pour noter quelque chose car je ne l'ai pas rencontré ailleurs.

En effet, quicktime for java renvoie une valeur bizzarre pour Movie.getDuration(). En fait c'est une valeur qui est liée au TimeScale du film. Chaque film vu par quicktime a en effet un timescale qui fait des ticks et qui définit une échelle de temps par rapport à laquelle tout le monde s'accorde. Comme le 3gp c'est du quicktime (en gros), il y a cette info.

Tous les codes que j'ai trouvé utilisent des bouts de code exploitant directement getDuration() ou le divisant par une valeur arbitraire. C'est faux. En effet, parfois le film a un timescale de 1, parfois de 600 (valeur par défaut). Dans mon cas, c'est différent.

Pour obtenir la durée en secondes d'un film, il vaut mieux faire:

QTSession.open();
importFile = new QTFile(sourceFile);
myMovie = Movie.fromFile(OpenMovieFile.asRead(importFile));
duration = myMovie.getDuration()/myMovie.getTimeScale();

Voilà!

Commentaires

1. xk_liberlundi 13 février 2006 à 16:08

Salut Cyril,
Moi aussi je développe en QTJava.
Cependant j'ai un problème pour faire qu'un script PHP lance mon programme java utilisant l'API QT.

En fait je génère un petit script shell qui va lancer mon programme Java et que mon PHP lance avec la fonction exec (ou system, ou shell_exec ou autres...).

Je ne sais pas pourquoi mais il lance bien le début du programme Java (initialisation de variables) mais au moment de faire l'ouverture de session QT (QTSession.open() ), ça plante.
Je n'ai pas de message d'erreur mais je sais que ça s'arrête au moment de cette commande.

Etrangement, si je lance mon shell par ligne de commande (je suis sous Mac donc ce sont des commandes Unix mais sous Windows ça reviendrait au même), ça fonctionne bien, l'ouverture de session QuickTime marche et le reste se déroule comme prévu.
Si je lance mon programme sans le shell mais en tapant ma ligne de commande java : idem.

Le seul problème c'est via le PHP.
Je pense que cela vient d'un problème de droit d'accès (ou groupe d'utilisateur) au fichier QTJava.zip qui contient les classes quicktime (Apache étant identifié comme un utilisateur "www") et donc cela empêche l'utilisation des classes "QT for Java".
Mais c'est assez flou tout de même car en spécifiant le CLASSPATH ou en changeant les droits d'accès sur ces fichiers, cela ne fonctionne pas mieux.

Bref, comme tu sembles connaître QTJava, je me demandais si tu avais déjà rencontré ce problème et:ou si tu avais une suggestion à me faire.

Merci d'avance et bravo pour ton site/blog, il est intéressant :)

xk_liber

2. xk_liberlundi 20 février 2006 à 20:14

Merci de ta réponse par mail.

Finalement j'ai pu m'en sortir.
Alors je poste ici la solution au cas où qq1 aurait un jour le même pb.

L'exécution de mon programme Java par PHP (sisi, je dois faire comme ça sur mon serveur, donc avec "exec", "system" ou autres fonctions similaires) ne donne pas le même résultat qu'en ligne de commande (et avec mon compte utilisateur).



Il faut déjà permettre l'exécution des fonctions de l'API QuickTime et donc lancer en premier lieu l'ouverture de session QuickTime (-> QTSession.open(); ).

Ceci est réalisable, vi aPHP toujours car sinon on n'en a pas besoin, grâce à l'option suivante, que l'on rajoute à notre ligne de commande $> java ... d'exécution :

-Djava.awt.headless=true



Et ensuite ça marche.

Maintenant, j'ai été bloqué après parce que j'utilisais le presse papier pour mettre des choses en mémoire tampon... pas vraiment accessible par PHP mais qui peut être utile en utilisation locale.

Bref, j'ai revu mon code et maintenant tout fonctionne :)

Il faut juste éviter d'utiliser "putOnScrap(0);" dans ce contexte assez particulier.



Voilà :)

xk_liber

Trackbacks

Aucun trackback.

Les trackbacks pour ce billet sont fermés.

Ajouter un commentaire

Les commentaires pour ce billet sont fermés.