2013-02-20 30 views
1

我是一名OS X編程新手,我必須以不同的時間間隔從互聯網上獲得一堆NSImages,並從中構建一個漸進式電影文件。例如,NSImage的到達速率可以從毫秒到3秒之間的任何地方。使用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]時,duration參數是影片在影片中的持續時間。 QTKit將負責複製它以創建足夠的電影幀來覆蓋持續時間。總之,你不需要直接擔心幀速率,只需要考慮每幀的持續時間。

    您可以通過跟蹤接收幀的時間和接收到最後一幀的時間來計算幀的持續時間。基本上,當圖像進入下一個圖像時,您將每個圖像添加到電影中,並使用兩個圖像的接收時間之間的時間差作爲持續時間。當然,根據記錄如何停止(用戶明確指定,通過超時等),您必須做一些稍微不同的事情來解釋最後的圖像。

  2. 我不太確定這個答案,但我認爲你可以假設這是一個你不需要擔心的實現細節。如果您已經用可寫入文件初始化QTMovie對象,則可能會定期致電-updateMovieFile以刷新當前內存中對磁盤的更改。這需要測試,但是與所有性能優化一樣,在測試和分析表明存在問題之前,您不應該擔心它。

+0

非常感謝。我試圖看看如何使用QTTime API來完成時間戳記和時間增量,但是我沒有看到任何可用於記錄當前時間的QTTime函數,然後採取差異,以便可以將它與addImage一起使用: duration:withAttributes方法。 – 2013-02-27 03:02:20