2011-10-30 25 views
2

我正在研究iPhone/iPod touch的視頻編輯應用程序。我的應用程序只是要求用戶選擇相機膠捲目錄中已有的視頻之一,然後逐幀更改像素值並再次以不同的名稱保存在相機膠捲目錄中。由於視頻處理時間可能相當長,我確實需要實現某種功能才能恢復以前啓動的會話(即,當視頻處理量達到總視頻長度的30%時,用戶按下主屏幕按鈕(或有電話呼叫)時我的應用程序被帶回到前景視頻處理應該從30%開始,而不是從開始)。我的代碼ios:如何恢復基於AVAsset視頻的寫作會話

最重要的部分(簡化一點更可讀):

AVAssetReader* assetReader = [[AVAssetReader alloc] initWithAsset:sourceAsset error:&error]; 
NSArray* videoTracks = [sourceAsset tracksWithMediaType:AVMediaTypeVideo]; 
AVAssetTrack* videoTrack = [videoTracks objectAtIndex:0]; 
AVAssetReaderTrackOutput* assetReaderOutput = [[AVAssetReaderTrackOutput alloc] initWithTrack:videoTrack 
[assetReader addOutput:assetReaderOutput]); 
[assetReader addOutput:assetReaderOutput]; 
[mVideoWriter startWriting] 
[mAssetReader startReading] 
[mVideoWriter startSessionAtSourceTime: kCMTimeZero]; 
mediaInputQueue = dispatch_queue_create("mediaInputQueue", NULL); 
[writerInput requestMediaDataWhenReadyOnQueue:mediaInputQueue usingBlock:^{ 
    while (mWriterInput.readyForMoreMediaData) { 
     CMSampleBufferRef nextBuffer = [mAssetReaderOutput copyNextSampleBuffer]; 
     if (nextBuffer) { 
      // frame processing here 
     } // if 
    } // while 
}]; // block 
// when done saving my video to camera roll directory 

,我聽我的應用程序的委託回調方法,如applicationWillResignActive,applicationWillEnterForeground但我不知道該如何處理他們以正確的方式。我已經試過不已:

1)AVAssetWriter開始/ endSessionAtSourceTime],遺憾的是「手動」,並停止在最後一幀呈現時間開始,我

2)節能沒有工作的每一部電影的一部分已處理和加工時達到100%,合併所有的人都用AVMutableComposition,該解決方案然而有時調度隊列崩潰

將是真正偉大的,如果有人能夠給我一些提示應該如何正確地做...

回答

0

我很確定AVAssetWriter不能追加,所以s沿着2)的行),節省件然後合併它們,可能是最好的解決方案,如果您必須必須使您的導出可重新啓動。

但首先你必須解決這個崩潰。

另外,在開始創建數百個電影片段之前,您應該看看AVAssetWriter.movieFragmentInterval,因爲仔細管理您可以使用的演示文稿時間戳/持續時間,可以最大限度地減少要合併的片段數。