QTKit : récupérer le timeValue de chaque image d'une video
Bonjour
Comme le titre l'indique, je souhaite récupérer dans un NSArray le timeValue pour chaque image d'une video.
Pour cela, j'ai utilisé 2 méthodes qui ne me donnent pas les mêmes résultats :
La première, toute simple :
NSNumber *val = [NSNumber numberWithLongLong: 0];
[arrayTVTrackImg addObject:val];
while (maMovie.currentTime.timeValue < maMovie.duration.timeValue) {
[maMovie stepForward];
float monTV = maMovie.currentTime.timeValue;
NSNumber *val1 = [NSNumber numberWithLongLong: maMovie.currentTime.timeValue];
[arrayTVTrackImg addObject:val1];
}
Le problème de cette méthode est que sont déroulement est trop long : 6" pour une séquence de 15"
La 2e méthode est :
Movie qtMovie = [movieQT quickTimeMovie];
Track videoTrack = GetMovieIndTrackType(qtMovie, 1, VideoMediaType, movieTrackMediaType);
Media media = GetTrackMedia(videoTrack);
TimeValue64 interestingDisplayTime = 0;
TimeValue64 interestingDisplayDuration = 0;
TimeValue movieDuration = GetMovieDuration(qtMovie);
TimeValue movieTimeScale = GetMovieTimeScale(qtMovie);
TimeScale timeScale = GetMediaTimeScale(media);
timeScaleMedia = GetMediaTimeScale(media);
BOOL stop = (interestingDisplayTime == -1);
while(!stop)
{
NSNumber *val1 = [NSNumber numberWithLongLong: interestingDisplayTime];
[arrayTVTrackImg addObject: val1];
GetMediaNextInterestingDisplayTime(media,
nextTimeStep,
interestingDisplayTime,
FloatToFixed(1),
&interestingDisplayTime,
&interestingDisplayDuration);
stop |= (interestingDisplayTime == -1);
stop |= (1.*(interestingDisplayTime)/timeScaleMedia >= 1.*movieDuration/movieTimeScale);
}
Ici, c'est beaucoup plus rapide : 1" pour cette même séquence de 15" mais les valeurs sont sensiblement différentes. Ce qui fait que lorsque je me place sur une ce ces valeurs, particulièrement avec une video prise par une webcam (avec des intervalles de temps variables) , je ne suis pas forcément sur la bonne image (contrairement à la méthode précédente).
J'ai bien essayé de fonctionner avec un système d'intervalle de temps, c'est à dire sur [timeValue n , timeValue n+1[ et corriger la current TimeValue à la borne de gauche mais parfois je rencontre 2 current TimeValue dans la même borne donc ces 2 valeurs correspondent au même numéro d'image (par rapport à mon NSArray) ce qui n'est pas acceptable.
Quelqu'un aurait il une idée pour récupérer ces timeValue rapidement (voir immédiatement) ?
Réponses
Si on admet que le frame rate est constant, alors on peut effectuer une interpolation linéaire:
duration = timeLastFrame - timeFirstFrame
time(frame) = timeFirstFrame + (duration * (frame/numberOfFrames))
Sauf que le frame rate n'est pas constant pour les vidéos issues de webcam...
Je vois que mon sujet n'inspire pas grand monde !!! C'est vrai que QTKit semble à l'avenir être abandonné au profit de AVFoundation. Peut être donc vous serez plus nombreux à pouvoir m'aider pour cette récupération des timevalue pour chaque image, cette fois-ci sous AVFoundation ???
merci d'avance