2012-10-12 12 views
7

मैं कई वीडियो और कई गीतों विलय रहा हूँ और मैं बॉट हो रही है क्या कोड में गलत है, क्योंकि एक ही कोड बिलकुल ठीक कल लेकिन आज चल रहा था मैं कुछ किया मैं निम्नलिखित प्रतिक्रिया AVAssetExportSessionStatus = 4,error = Error Domain=AVFoundationErrorDomain Code=-11841 "The operation couldn’t be completed. (AVFoundationErrorDomain error -11841.)" हो रही है शोध और पाया कि अवैध वीडियो संरचना के कारण निर्यात विफल हो रहा है। कृपया यह पता लगाएं कि वीडियो संरचना में क्या गलत है।AVErrorInvalidVideoComposition = -11,841

- (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

आप पहली बार LayerInstruction के लिए opacity निर्धारित करने की आवश्यकता, उदा .:

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