2011-06-14 73 views
2

我試圖在慢動作中播放電影並將其附加到現有電影中。這是我到目前爲止已經完成:QTKit慢動作播放電影

QTMovie *originalMovie = ...; 
QTMovie *slowMotionMovie = ...; 

[originalMovie insertSegmentOfMovie:slowMotionMovie timeRange:QTMakeTimeRange(QTZeroTime, [slowMotionMovie duration]) atTime:[originalMovie duration]]; 

這正確添加第二個電影的firts之一,但它不會在過程中的慢動作播放。我知道還有另一種方法insertSegmentOfMovie:fromRange:scaledToRange:,但我不知道如何在那裏設置時間範圍。

任何幫助,將不勝感激

更新:我可以使用下面的代碼添加慢動作:

[slowMotionMovie setAttribute:[NSNumber numberWithBool:YES] forKey:QTMovieEditableAttribute]; 
QTTime newDuration = QTMakeTime([slowMotionMovie duration].timeValue * 2, [slowMotionMovie duration].timeScale); 
[slowMotionMovie scaleSegment:QTMakeTimeRange(QTZeroTime, [slowMotionMovie duration]) newDuration:newDuration]; 

這正常播放慢動作視頻,但保存慢動作中的第二個視頻的音頻。 I.E.第二個視頻是慢動作,但它的音頻不是!

更新2:

要清楚,如果我嘗試將QuickTime播放器中播放originalVideo從我的可可應用程序向右走,第二個視頻的音頻並以慢動作播放。這只是保存的音頻不同步的文件。

我張貼的完整代碼以防萬一它有助於:

- (void)captureOutput:(QTCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL forConnections:(NSArray *)connections dueToError:(NSError *)error 
{ 

    QTMovie *originalMovie = [QTMovie movieWithURL:outputFileURL error:nil]; 
    [originalMovie setAttribute:[NSNumber numberWithBool:YES] forKey:QTMovieEditableAttribute]; 

    QTMovie *slowMotionMovie = [QTMovie movieWithURL:outputFileURL error:nil]; 
    [slowMotionMovie setAttribute:[NSNumber numberWithBool:YES] forKey:QTMovieEditableAttribute]; 

    // Scale the second video 
    QTTime newDuration = QTMakeTime([slowMotionMovie duration].timeValue * 2, [slowMotionMovie duration].timeScale); 
    [slowMotionMovie scaleSegment:QTMakeTimeRange(QTZeroTime, [slowMotionMovie duration]) newDuration:newDuration]; 

    // Attach Slow motion video 
    [originalMovie insertSegmentOfMovie:slowMotionMovie timeRange:QTMakeTimeRange(QTZeroTime, [slowMotionMovie duration]) atTime:[originalMovie duration]]; 

    // If I play originalMovie, both video and audio of slowMotionMovie are correct (i.e. in slow motion) 

    [originalMovie updateMovieFile]; 
    // However, the video that's being saved here has its audio out of sync (i.e. not in slow motion) 
} 

更新3:

如果我打開比其他的QuickTime程序的最後文件,說VLC的視頻在第一個視頻結束時停止播放(動作應該開始),但音頻會繼續播放直到結束。

更新4:

如果我使用[originalMovie writeToFile:withAttributes]並指定一個新的位置,一切都按預期工作。只有當我嘗試覆蓋一個文件時,我會遇到各種問題。

回答

0

好,所以要加在緩慢運動的第二個電影人需要做到以下幾點:

- (void)captureOutput:(QTCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL forConnections:(NSArray *)connections dueToError:(NSError *)error 
{ 

    QTMovie *originalMovie = [QTMovie movieWithURL:outputFileURL error:nil]; 
    [originalMovie setAttribute:[NSNumber numberWithBool:YES] forKey:QTMovieEditableAttribute]; 

    QTMovie *slowMotionMovie = [QTMovie movieWithURL:outputFileURL error:nil]; 
    [slowMotionMovie setAttribute:[NSNumber numberWithBool:YES] forKey:QTMovieEditableAttribute]; 

    // Scale the second video 
    QTTime newDuration = QTMakeTime([slowMotionMovie duration].timeValue * 2, [slowMotionMovie duration].timeScale); 
    [slowMotionMovie scaleSegment:QTMakeTimeRange(QTZeroTime, [slowMotionMovie duration]) newDuration:newDuration]; 

    // Attach Slow motion video 
    [originalMovie insertSegmentOfMovie:slowMotionMovie timeRange:QTMakeTimeRange(QTZeroTime, [slowMotionMovie duration]) atTime:[originalMovie duration]]; 

} 

不過,如果你試圖覆蓋originalMovie你可以得到所有樣的錯誤,這樣反而保存在[originalMovie writeToFile]的新位置。