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