Iphone AverorInvalidVideoComposition=-11841

Iphone AverorInvalidVideoComposition=-11841,iphone,objective-c,ios,arrays,ios5,Iphone,Objective C,Ios,Arrays,Ios5,我正在合并多个视频和多首歌曲,我没有发现代码中有什么错误,因为昨天相同的代码运行得非常好,但今天我得到了以下回应 AVAssetExportSessionStatus=4,error=error Domain=AVFoundationErrorDomain code=-11841“操作无法完成。(AVFoundationErrorDomain error-11841)。” 我做了一些研究,发现由于视频合成无效,导出失败。请找出视频合成的错误 - (void)mergeAllselectedVid

我正在合并多个视频和多首歌曲,我没有发现代码中有什么错误,因为昨天相同的代码运行得非常好,但今天我得到了以下回应
AVAssetExportSessionStatus=4,error=error Domain=AVFoundationErrorDomain code=-11841“操作无法完成。(AVFoundationErrorDomain error-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);
}
-(无效)合并所有选定的视频
{
NSArray*pathArray=[DocumentDirectory getUrlFromDocumentDirectoryOfList:self.SelectedClipArray];
AVMutableComposition*mixComposition=[[AVMutableComposition alloc]init];
NSMutableArray*layerinstructions=[[NSMutableArray alloc]init];
CMTime time=KCMTIME0;
CMTime previousSongDuration=KCMTIME0;
对于(int i=0;iCMTimeGetSeconds(time))
{
时间范围=CMTimeRangeMake(音频时间,CMTimeSubtract(时间,音频时间));
}
[AudioTrack insertTimeRange:Track的时间范围:[[audioAsset tracksWithMediaType:AVMediaTypeAudio]对象索引:0]时间:kCMTimeZero错误:零];
audioTime=CMTimeAdd(audioTime,audioAsset.duration);
}
AVMutableVideoCompositionInstruction*Main指令=[AVMutableVideoCompositionInstruction videoCompositionInstruction];
MainInstruction.timeRange=CMTimeRangeMake(KCMTIME0RO,时间);
MainInstruction.layerInstructions=layerInstructions;
AVMutableVideoComposition*MainCompositionST=[AVMutableVideoComposition];
MainCompositionList.instructions=[NSArray arrayWithObject:MainInstruction];
MainCompositionist.frameDuration=CMTimeMake(1,30);
main compositionist.renderSize=CGSizeMake(320.0480.0);
NSArray*Path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,是);
NSString*documentsDirectory=[paths objectAtIndex:0];
movieName=[CoreDataFunctions getNameForMovieForDate:[CalendarFunctions getCurrentDateString]];
self.moviePlayButton.titleLabel.text=movieName;
NSString*myPathDocs=[DocumentsDirectoryStringByAppendingPathComponent:movieName];
NSURL*url=[NSURL fileURLWithPath:myPathDocs];
AVAssetExportSession*exporter=[[AVAssetExportSession alloc]initWithAsset:mixComposition预设名称:AVAssetExportPresetHighestQuality];
exporter.outputURL=url;
exporter.outputFileType=AVFileTypeQuickTimeMovie;
exporter.videoComposition=主合成列表;
exporter.shouldOptimizationForNetworkUse=是;
[exporter exportAsynchronouslyWithCompletionHandler:^{dispatch_async(dispatch_get_main_queue(),^{[self-exportDidFinish:exporter];});}];
}
-(void)exportDidFinish:(AVAssetExportSession*)会话
{
//打印错误
NSLog(@“AVAssetExportSessionStatus=%i,错误=%@”,会话状态,会话错误);
}

我发现你的问题时也遇到了同样的问题。我在这个问题上的理论是,视频合成的所有属性都不是在导出时设置的,所以它很糟糕。下面是我现在使用的一节,它现在导致了一个无错误的导出:

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属性。检查您自己的属性,确保它们得到正确的值。祝你好运这东西很难理解。

您需要为第一个
层设置
不透明度
,例如:

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

如果碰巧将多条主指令传递给AVMutableVideoComposition的指令数组,请确保时间范围不重叠,否则将导致此错误

Aaron,我也有同样的问题,无法制作视频。我已经详细说明了你上面所说的一切。我能想到的唯一不同的是我的视频输入是另一个会话的输出。你对这件事有什么想法吗?