2013-02-20 3 views
1

Я новичок в программировании на OS X, мне нужно взять кучу NSImages, прибывающих из Интернета с переменным интервалом, и создать из него прогрессивный видеофайл. Например, скорость прибытия NSImage может составлять от миллисекунд до трех секунд.Использование QTKit для добавления NSImages к фильму при случайной частоте кадров

  1. Я интересно, если это правильный способ сделать это с помощью QTKit, и как рассчитать частоту кадров, так как кадры приходят почти в случайные моменты времени.

  2. Я также интересуюсь использованием памяти, попытается ли он сохранить весь фильм в памяти, прежде чем писать его в конце?

Вот код, который я кусочки из Интернета:

-(void)startRecording 
{ 
    NSDictionary *myDict = nil; 
    myDict = [NSDictionary dictionaryWithObjectsAndKeys:@"mp4v", 
       QTAddImageCodecType, 
       [NSNumber numberWithLong:codecHighQuality], 
       QTAddImageCodecQuality, 
       nil]; 

    long long timeValue = 1; 
    long timeScale  = 3; 
    QTTime duration  = QTMakeTime(timeValue, timeScale); 
    QTMovie *mMovie =[[QTMovie alloc] initToWritableFile:@"tmpfps.tmp" error:NULL]; 

    self.mMovie=mMovie; 
    self.duration=duration; 
    self.myDict=myDict; 
} 

-(void) addFrame:(NSImage*)imageFrame 
{ 
    [mMovie addImage:imageFrame 
     forDuration:self.duration 
     withAttributes:self.myDict]; 
} 

-(void) stopRecording 
{ 
    myDict = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] 
             forKey:QTMovieFlatten]; 
    [self.mMovie writeToFile:@"my.mov" withAttributes:myDict]; 
    self.mMovie=nil; 
} 

ответ

0

Это было время, так как я работал с QTKit, но в прошлом я написал приложение, которое сделало что-то очень похожее на то, что вы описали (делали изображения, поступающие несколько нерегулярно по сети и записывали их в фильм QuickTime).

  1. При вызове -[QTMovie addImage:forDuration:withAttributes], параметр продолжительности является продолжительность изображения в фильме. QTKit позаботится о том, чтобы дублировать его, чтобы создать достаточно кадров для фильма, чтобы покрыть продолжительность. Короче говоря, вам не нужно беспокоиться о частоте кадров напрямую, просто продолжительность каждого кадра.

    Вы можете определить продолжительность кадра, отслеживая, когда он был получен и когда был получен последний кадр. По существу, вы добавляете каждое изображение в фильм, когда приходит следующее изображение, и используйте разницу во времени между временем получения двух изображений в качестве продолжительности. Конечно, вам нужно сделать что-то немного отличное от учета последнего изображения, в зависимости от того, как остановлена ​​запись (явно пользователем, через тайм-аут и т. Д.).

  2. Я не так уверен в ответе на это, но я думаю, вы можете предположить, что это деталь реализации, о которой вам не нужно беспокоиться. Если вы инициализировали объект QTMovie с файлом, доступным для записи, может оказаться правдой, что вы можете периодически вызывать -updateMovieFile, чтобы сбросить текущие изменения в памяти на диске. Это потребует тестирования, но, как и при любой оптимизации производительности, вы не должны беспокоиться об этом, пока тестирование и профилирование не означают, что есть проблема.

+0

Большое спасибо. Я пытаюсь посмотреть, как я могу делать отметки времени и временные дельта с помощью QTTime API, но я не вижу никакой функции QTTime, которую я могу использовать для записи текущего времени, а затем принять разницу, чтобы я мог использовать ее с addImage: duration: withAttributes. –

 Смежные вопросы

  • Нет связанных вопросов^_^