2012-10-12 15 views
7

我合併多個視頻和多首歌曲,我的機器人得到什麼是錯的代碼,因爲相同的代碼是絕對沒問題,但昨天今天跑我得到如下回應 AVAssetExportSessionStatus = 4,error = Error Domain=AVFoundationErrorDomain Code=-11841 "The operation couldn’t be completed. (AVFoundationErrorDomain error -11841.)" 我做了一些研究發現,由於視頻作品無效,導致出口失敗。請查明視頻作品出了什麼問題。AVErrorInvalidVideoComposition = -11841

- (void)mergeAllselectedVideos 
{ 
    NSArray *pathArray = [DocumentDirectory getUrlFromDocumentDirectoryOfList:self.selectedClipsArray]; 
    AVMutableComposition *mixComposition = [[AVMutableComposition alloc]init]; 
    NSMutableArray *layerinstructions = [[NSMutableArray alloc]init]; 
    CMTime time = kCMTimeZero; 
    CMTime previousSongDuration = kCMTimeZero; 
    for (int i = 0 ; i < pathArray.count; i++) 
    { 
     //VIDEO TRACK// 
     time = CMTimeAdd(time, previousSongDuration); 
     NSURL *url = [NSURL URLWithString:[pathArray objectAtIndex:i]]; 
     AVAsset *avAsset = [AVAsset assetWithURL:url]; 
     AVMutableCompositionTrack *track = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
     [track insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset.duration) ofTrack:[[avAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:time error:nil]; 
    previousSongDuration = avAsset.duration; 
    } 
    CMTime audioTime = kCMTimeZero; 
    for (int i = 0; i < self.selectedSongsArray.count; i++) 
    { 
     MPMediaItem * songItem = [self.selectedSongsArray objectAtIndex:i]; 
     NSURL *songURL = [songItem valueForProperty: MPMediaItemPropertyAssetURL]; 
     AVAsset *audioAsset = [AVAsset assetWithURL:songURL]; 
     AVMutableCompositionTrack *AudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
     CMTimeRange timeRange = CMTimeRangeMake(audioTime, audioAsset.duration); 
     if(CMTimeGetSeconds(CMTimeAdd(audioTime, audioAsset.duration)) > CMTimeGetSeconds(time)) 
     { 
      timeRange = CMTimeRangeMake(audioTime, CMTimeSubtract(time,audioTime)); 
     } 
     [AudioTrack insertTimeRange:timeRange ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil]; 
     audioTime = CMTimeAdd(audioTime, audioAsset.duration); 
    } 

    AVMutableVideoCompositionInstruction * MainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
    MainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, time); 
    MainInstruction.layerInstructions = layerinstructions; 

    AVMutableVideoComposition *MainCompositionInst = [AVMutableVideoComposition videoComposition]; 
    MainCompositionInst.instructions = [NSArray arrayWithObject:MainInstruction]; 
    MainCompositionInst.frameDuration = CMTimeMake(1, 30); 
    MainCompositionInst.renderSize = CGSizeMake(320.0, 480.0); 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    movieName = [CoreDataFunctions getNameForMovieForDate:[CalendarFunctions getCurrentDateString]]; 
    self.moviePlayButton.titleLabel.text = movieName; 
    NSString *myPathDocs = [documentsDirectory stringByAppendingPathComponent:movieName]; 

    NSURL *url = [NSURL fileURLWithPath:myPathDocs]; 

    AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality]; 
    exporter.outputURL=url; 
    exporter.outputFileType = AVFileTypeQuickTimeMovie; 
    exporter.videoComposition = MainCompositionInst; 
    exporter.shouldOptimizeForNetworkUse = YES; 
    [exporter exportAsynchronouslyWithCompletionHandler:^{dispatch_async(dispatch_get_main_queue(), ^{[self exportDidFinish:exporter];});}]; 
} 
- (void)exportDidFinish:(AVAssetExportSession*)session 
{ 
    //Printing error 
    NSLog(@"AVAssetExportSessionStatus = %i,error = %@",session.status,session.error); 
} 

回答

6

我發現你的問題,同時遇到同樣的問題。我在這個問題上的理論是,視頻作品的所有屬性都不是在出口時設置的,因此它正在退出。下面是我現在用的節這是目前導致無差錯出口:

AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition]; 
videoComposition.frameDuration = CMTimeMake(1,30); 
videoComposition.renderScale = 1.0; 
videoComposition.renderSize = CGSizeMake(352.0, 288.0); 
instruction.layerInstructions = [NSArray arrayWithObject: layerInstruction]; 
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, videoAsset.duration); 
videoComposition.instructions = [NSArray arrayWithObject: instruction]; 

在我而言,我缺少的指令TIMERANGE財產。檢查你自己的屬性,以確保他們獲得正確的值。祝你好運!這東西很難。

+0

阿龍,我有不能夠創建一個視頻同樣的問題。我已經詳細說明了上面所說的一切。我能想到的唯一不同是我的視頻輸入是另一個會話的輸出。你有什麼想法可能很重要嗎? –

+0

這並不能解決我的問題: –

-1

您需要設置opacity爲第一LayerInstruction,例如:

[FirstlayerInstruction setOpacity:0.0 atTime:firstAsset.duration];