QTTime

16:48 modifié dans API AppKit #1
Bonjour
Voilà  je cherche à  obtenir la duration de ma petite vidéo :
[[[audioView movie] QTMovie] currentTime]

Et ds QTTime :
Defines the value and time scale of a time.

typedef struct {  long  long        timeValue;  long            timeScale;  long            flags; }

ben moi ce bordel j'en ai déduis qu'il fallait faire comme les NSRect etc.. etc..
Donc j'ai fais :
QTTime testTime = [[[audioView movie] QTMovie] currentTime];<br />	NSLog(@&quot;%f&quot;, testTime.timeValue);


Vous trouvez pas que je suis un peu con ? Enfin en tout cas il me met "invalid receiver type 'void *' " à  la première ligne

Si quelqu'un voit comment faire ? Merci

Réponses

  • ChachaChacha Membre
    août 2005 modifié #2
    dans 1124820135:

    [[[audioView movie] QTMovie] currentTime]
    


    Ouille ouille ouille la confusion
    [audioView movie] te renvoie un objet de type QTMovie, et un objet de type QTMovie réponds à  "currentTime". Mais QTMovie n'est pas une méthode! Il te faut donc simplement écrire [[audioView movie] currentTime].
    ça suffira, et ça ira déjà  mieux.
    Sinon, ton %f pour afficher un "long" te donnera des sueurs froides si tu ne le remplaces pas par un %ld.

    Voilà 
    +
    Chacha

    [edit]
    Ah, ouais, d'accord, amnesic à  raison : QTMovie est aussi une méthode, mais dans la classe NSMovie, donc rien à  voir. Je comprends mieux la confusion. Et pour le %lld, il a raison aussi. Donc finalement, c'est moi qui suis "grilled" ;-)
    [/edit]
  • amnesicamnesic Membre
    16:48 modifié #3
    J'ai l'impression que tu mélanges les APIs de NSMovie ( méthode - (void *)QTMovie ? ) et les plus récentes de QTKit (attention Tiger only je crois).

    Sinon, "%f" c'est pour le type "float",  timeValue est un "long long int" donc "%lld"

    Tu peux essayer ca :
    <br />&nbsp; &nbsp; QTMovie *mMovie;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSURL *movieUrl = [NSURL fileURLWithPath:@&quot;myMovie.mov&quot;];<br />&nbsp; &nbsp; mMovie = [[QTMovie alloc] initWithURL:movieUrl error:nil];	<br />&nbsp; &nbsp; QTTime testTime = [mMovie duration];<br />&nbsp; &nbsp; NSLog(@&quot;%lld&quot;,testTime.timeValue);<br />
    
  • 16:48 modifié #4
    En effet, j'ai pas fait attention mais Tiger Only ça me plaà®t pas du tout :(
    J'aimerais rendre mon app compatible Panther au moins
    Quelqu'un connaà®trait un autre moyen d'afficher la duration d'une NSMovie ?
    Merci pour votre aide à  amnesic et chacha
  • BruBru Membre
    16:48 modifié #5
    Et, as tu essayé GetMovieDuration de l'api QT ?

    Un truc du style :
    <br />long duree=GetMovieDuration([monFilm QTMovie]);<br />
    


  • 16:48 modifié #6
    Undefined Symbols :
    _GetMovieDuration
    collect2 : Id returned 1 exit status

    :o I am debutant hein  :o
  • BruBru Membre
    août 2005 modifié #7
    Ajoute le framework carbon à  ton projet.

    EDIT : édité pour cause de nullité.

    .
  • 16:48 modifié #8
    Tjrs pareil :o
  • BruBru Membre
    16:48 modifié #9
    Mais non, c'est le framework QuickTime bien sûr (quelle tâche je suis ce soir)...

    .
  • muqaddarmuqaddar Administrateur
    16:48 modifié #10
    dans 1124830526:

    (quelle tâche je suis ce soir)...


    Il souffle comme un air de vérité en cette soirée venteuse du mois d'Août.  :o
  • 16:48 modifié #11
    Impec merci bru
  • 16:48 modifié #12
    Avec GetMoviePosterTime j'obitens TimeValue
    TimeValue est bien le temps écoulé ?
    En tout cas ça reste à  0.0
  • BruBru Membre
    16:48 modifié #13
    dans 1124833840:

    Avec GetMoviePosterTime j'obitens TimeValue
    TimeValue est bien le temps écoulé ?
    En tout cas ça reste à  0.0


    Tu veux savoir quoi ?
    Le moment dans lequel se trouve le film ?

    Si oui, c'est GetMovieTime qu'il faut utiliser.

    .
  • 16:48 modifié #14
    Oui c'est ça
    Sauf que ça plante lorsque je l'utilise  :o
    NSMovie *movie = [audioView movie];<br />		long duree = GetMovieTime(movie,nil);<br />		NSLog(@&quot;%0.1f&quot;,&nbsp; (float)duree);
    

    j'ai testé aussi sans le nil et même un truc fou :
    NSMovie *movie = [audioView movie];<br />		long duree = GetMovieTime(movie,(GetMovieDuration(movie),GetMovieTimeScale(movie), GetMovieTimeBase(movie)));<br />		NSLog(@&quot;%0.1f&quot;,&nbsp; (float)duree);
    
      <3 <br />C'est le TimeRecord qui me chagrine, j'ai mis nil au départ car il est marqué :
    currentTime
    A pointer to a TimeRecord structure. The function updates this time structure to contain the movie?s current time. If you don?t want this information, set this parameter to NIL.
  • BruBru Membre
    16:48 modifié #15
    GetMovieTime travaille avec en argument un pointeur sur les données QT d'un film. Or tu lui passes la référence d'un objet NSMovie : donc, c'est comme parler chinois à  un finlandais, ils ne s'entendent pas !

    La méthode QTMovie de NSMovie permet justement de récupérer ce pointeur à  partir de ton objet film.

    <br />&nbsp; &nbsp; long d;<br />&nbsp; &nbsp; TimeRecord tr;<br /><br />&nbsp; &nbsp; d=GetMovieTime([[audioView movie] QTMovie], &amp;tr);<br /><br />&nbsp; &nbsp; // ou si t&#39;as pas besoin de la structure TimeRecord<br />&nbsp; &nbsp; d=GetMovieTime([[audioView movie] QTMovie], nil);<br />
    


    .
  • mpergandmpergand Membre
    16:48 modifié #16
    Attention au timeScale pour le calcul de la position.
    Extrait d'un programme:
    <br />// retourne la durée en 10e de seconde<br />long getDuration()<br />	{<br />	<br />	TimeValue time=GetMovieDuration(movie);<br />	TimeScale scale=GetMovieTimeScale(movie)/10;		// 1/10 s<br />			<br />	return (long)(time/scale);<br />	}	<br />	<br />// retourne la position en 10e de seconde<br />long getTime()<br />	{<br />	TimeRecord timeRecord;<br />	<br />	TimeValue time=GetMovieTime(movie,&amp;timeRecord);<br />	TimeScale scale=GetMovieTimeScale(movie)/10;		// 1/10 s<br />			<br />	return (long)(time/scale);<br />	}	<br /><br />// fixe la position en 10e de seconde<br />void setTime(long t)<br />	{<br />	<br />	TimeScale scale=GetMovieTimeScale(movie);<br />	TimeValue time=t*scale/10;<br />	<br />	SetMovieTimeValue(movie,time);<br />	}<br /><br />
    
  • 16:48 modifié #17
    Je comprend pas du tout, ça me met tjrs 0.0
  • Eddy58Eddy58 Membre
    16:48 modifié #18
    Il y a un exemple qui devrait t'intéresser ici, avec des fonctions toutes faites. :)
  • 16:48 modifié #19
    Oui j'ai vu c'est du bordel en C...

    En fait maintenant j'obtiens l'avancement en secondes
    le problème c'est que je ne vois pas comment formatter ces secondes en h et min.
    N'y a-t-il pas un moyen simple d'auto-convertir les secondes ?
  • wiskywisky Membre
    16:48 modifié #20
    NSTime ? ou quelque chose pour créer une date avec un unixstamp.
    En PHP ça existe. En C ça doit bien exister. ;)
  • 16:48 modifié #21
    Ha ben j'allais faire un edit
    En fait j'ai trouvé un truc tout con
    <br />long total = GetMovieTime(qtmovie,nil);<br />int sec = total / 60 / 10; // c&#39;est barbare :p<br />NSLog(@&quot;%i&quot;, sec%60);<br />
    

    donc le compteur ne dépasse pas les 59 secondes.. Donc voilà  suis sur la bonne piste je pense
  • Eddy58Eddy58 Membre
    16:48 modifié #22
    dans 1125401996:

    le problème c'est que je ne vois pas comment formatter ces secondes en h et min.
    N'y a-t-il pas un moyen simple d'auto-convertir les secondes ?

    Tu peux passer par les méthodes de NSCalendarDate. Le code suivant est à  tester : :)
    [tt]
    int secondes;
    int resultHeures;
    int resultMinutes;
    int resultSecondes;

    // Nombre de secondes à  convertir, par exemple.
    secondes=8500;
    // Initialiser la date de référence
    NSCalendarDate *now=[NSCalendarDate calendarDate];
    // Initialiser une autre date en ajoutant le nombre de secondes à  la date de référence
    NSCalendarDate *later=[now dateByAddingYears:0 months:0 days:0 hours:0 minutes:0 seconds:secondes];
    // Faire la différence entre les deux dates en heures minutes et secondes
    [later years:NULL months:NULL days:NULL hours:&resultHeures
        minutes:&resultMinutes seconds:&resultSecondes sinceDate:now];
    [/tt]
  • AliGatorAliGator Membre, Modérateur
    août 2005 modifié #23
    Heu est-ce nécessaire de faire la différence de 2 dates ?
    Moi je dirai qu'il suffit d'en créer une avec le bon nombre de secondes et de demander de l'afficher. La date on s'en fout du moment que l'heure est bonne, puisqu'on ne demandera que d'afficher l'heure...
    NSCalendarDate *durationDate = [NSCalendarDate dateWithYear:2000 month:1 day:1 hour:0 minute:0 second:temps_en_secondes timeZone:[NSTimeZone defaultTimeZone]];<br />NSString *datestr = [durationDate descriptionWithCalendarFormat:@&quot;%H:%M:%S&quot;];
    
    Tu trouveras les "formatteurs" de dates (%H,%M,%S) dans ta doc, si tu veux écrire autrement ta durée qu'en "hh:mm:ss" :

    file:///Developer/ADC%20Reference%20Library/Documentation/Cocoa/Conceptual/DataFormatting/Concepts/DateFormatters.html

    Ceci dit la création d'un NSCalendarDate avec un nombre de secondes + grand que 59, faut tester... Mais bon a priori si ça marche avec la méthode d'Eddy ça marche avec la mienne aussi ;)
  • 16:48 modifié #24
    Dsl mais disons que j'ai fais à  ma manière comme d'hab :p
    Voilà  ma soluce qui marche impec :
    NSMovie *movie = [audioView movie];<br />	Movie qtmovie = [movie QTMovie];<br />	long current = GetMovieTime(qtmovie, nil);<br />	int seconds = current / 60 / 10;<br />	int minutes = seconds / 60;<br />	int hours = minutes / 60;<br />	<br />	if(hours%60&gt;9 &amp;&amp; minutes%60&gt;9 &amp;&amp; seconds%60&gt;9)<br />		[time setStringValue:[NSString stringWithFormat:@&quot;%i:%i:%i&quot;, hours%60,minutes%60,seconds %60]];<br />	else if(hours%60&gt;9 &amp;&amp; minutes%60&gt;9 &amp;&amp; seconds%60&lt;10)<br />		[time setStringValue:[NSString stringWithFormat:@&quot;%i:%i:0%i&quot;, hours%60,minutes%60,seconds %60]];<br />	else if(hours%60&gt;9 &amp;&amp; minutes%60&lt;10 &amp;&amp; seconds%60&gt;9)<br />		[time setStringValue:[NSString stringWithFormat:@&quot;%i:0%i:%i&quot;, hours%60,minutes%60,seconds %60]];<br />	else if(hours%60&gt;9 &amp;&amp; minutes%60&lt;10 &amp;&amp; seconds%60&lt;10)<br />		[time setStringValue:[NSString stringWithFormat:@&quot;%i:0%i:0%i&quot;, hours%60,minutes%60,seconds %60]];<br />	else if(hours%60&lt;10 &amp;&amp; minutes%60&gt;9 &amp;&amp; seconds%60&gt;9)<br />		[time setStringValue:[NSString stringWithFormat:@&quot;0%i:%i:%i&quot;, hours%60,minutes%60,seconds %60]];<br />	else if(hours%60&lt;10 &amp;&amp; minutes%60&gt;9 &amp;&amp; seconds%60&lt;10)<br />		[time setStringValue:[NSString stringWithFormat:@&quot;0%i:%i:0%i&quot;, hours%60,minutes%60,seconds %60]];<br />	else if(hours%60&lt;10 &amp;&amp; minutes%60&lt;10 &amp;&amp; seconds%60&gt;9)<br />		[time setStringValue:[NSString stringWithFormat:@&quot;0%i:0%i:%i&quot;, hours%60,minutes%60,seconds %60]];<br />	else if(minutes%60&lt;10 &amp;&amp; hours%60&lt;10 &amp;&amp; seconds%60&lt;10)<br />		[time setStringValue:[NSString stringWithFormat:@&quot;0%i:0%i:0%i&quot;, hours%60,minutes%60,seconds %60]];
    


    Pour tous ces "if" je me suis dessiner une table de vérité avec 1 = <10 0 = >9



    | Heures | Minutes | Secondes |
    |    0           0             0           |
    |    0           0             1           |
    |    0           1             0           |
    |    0           1             1           |
    |    1           0             0            |
    |    1           0             1           |
    |    1           1             0           |
    |    1           1             1           |



    Muhaha
  • AliGatorAliGator Membre, Modérateur
    16:48 modifié #25
    Berk.

    Le fou.
    >:)

    Y'en a vraiment qui aiment se compliquer la vie...

    Et au fait, même si tu voulais utiliser cette façon de faire, tu sais que "%02i" au lieu de "%i" permet directement de formatter le chiffre sur 2 caractères (c'est le "2" avant le i), en remplissant les "cases vides" par des zéros (c'est le zéro avant le "2")...

    Donc NSLog(@%i ; %02i | %i ; %02i,5,5,12,12) donnera "5 ; 05 | 12 ; 12"...

    Déjà  ça t'aurait évité tout ces "ifs" qui se seraient simplifés en... une seule ligne !!

    (Y'a vraiment des fous sur terre...)
  • Eddy58Eddy58 Membre
    16:48 modifié #26
    dans 1125426889:

    Heu est-ce nécessaire de faire la différence de 2 dates ?
    Moi je dirai qu'il suffit d'en créer une avec le bon nombre de secondes et de demander de l'afficher. La date on s'en fout du moment que l'heure est bonne, puisqu'on ne demandera que d'afficher l'heure...

    Tout serait parfait si les choses seraient aussi simples...;)
    Petit extrait de la doc pour la méthode dateWithYear:month:day:hour:minute:second:timeZone: :
    [tt]
    The year value must include the century (for example, 1999 instead of 99). The other values are the standard ones: 1 through 12 for months, 1 through 31 for days, 0 through 23 for hours, and 0 through 59 for both minutes and seconds.
    [/tt]


    Dsl mais disons que j'ai fais à  ma manière comme d'hab :p

    Ca a le mérite de fonctionner, mais :
    1) C'est lourd niveau code.
    2) Côté optimisation c'est pas top.
    3) Les APIs possèdent toutes les méthodes nécessaires, alors pourquoi réinventer la roue ? :o
  • AliGatorAliGator Membre, Modérateur
    16:48 modifié #27
    Oh, et by the way, "hours % 60" est-ce bien utile ?
    le modulo 60 pour les minutes et secondes, oui, mais pour les heures, je vois pas... :)

    M'enfin le prend pas mal, Louka, pour une fois que je peux répondre à  une question Cocoa... ;) C'était pas méchant (apparement je l'ai vexé il a pris ça au 1er degré...)
  • AliGatorAliGator Membre, Modérateur
    16:48 modifié #28
    dans 1125435121:

    dans 1125426889:

    Heu est-ce nécessaire de faire la différence de 2 dates ?
    Moi je dirai qu'il suffit d'en créer une avec le bon nombre de secondes et de demander de l'afficher. La date on s'en fout du moment que l'heure est bonne, puisqu'on ne demandera que d'afficher l'heure...

    Tout serait parfait si les choses seraient aussi simples...;)
    Petit extrait de la doc pour la méthode dateWithYear:month:day:hour:minute:second:timeZone: :
    [tt]
    The year value must include the century (for example, 1999 instead of 99). The other values are the standard ones: 1 through 12 for months, 1 through 31 for days, 0 through 23 for hours, and 0 through 59 for both minutes and seconds.
    [/tt]
    Ben je sais bien je l'ai vu cette note en allant fouiller dans la doc pour trouver comment on pourrait faire ;) Mais c'est por ça que j'ai rajouté ma remarque "à  tester pour des valeurs >59s"...
  • Eddy58Eddy58 Membre
    16:48 modifié #29
    dans 1125435789:

    Ben je sais bien je l'ai vu cette note en allant fouiller dans la doc pour trouver comment on pourrait faire ;) Mais c'est por ça que j'ai rajouté ma remarque "à  tester pour des valeurs >59s"...

    Je viens de tester, en effet ça fonctionne, les conversions s'effectuent automatiquement, moi qui m'attendait à  un message d'erreur ! Une bonne chose à  savoir...:)
Connectez-vous ou Inscrivez-vous pour répondre.