AVAssetExportSession – 在IOS中join2个mp4文件

我试图用以下代码将2个预先存在的mpeg4video连接到一个ipad2上。

-(void)mergeTestVideos { //setup asset NSString *firstassetpath = [NSString stringWithFormat:@"%@mpeg4-1.mp4", NSTemporaryDirectory()]; NSString *secondassetpath = [NSString stringWithFormat:@"%@mpeg4-2.mp4", NSTemporaryDirectory()]; NSFileManager *fileManager = [NSFileManager defaultManager]; AVAsset *firstAsset = [AVAsset assetWithURL:[NSURL fileURLWithPath:firstassetpath]]; AVAsset *secondAsset = [AVAsset assetWithURL:[NSURL fileURLWithPath:secondassetpath]]; NSLog(@"FirstAsset Is Readable = %d", firstAsset.isReadable); NSLog(@"FirstAsset Is playable = %d", firstAsset.isPlayable); NSLog(@"FirstAsset Is exportable = %d", firstAsset.exportable); NSLog(@"SecondAsset Is Readable = %d", secondAsset.isReadable); NSLog(@"SecondAsset Is playable = %d", secondAsset.isPlayable); NSLog(@"SecondAsset Is exportable = %d", secondAsset.exportable); //setup composition and track AVMutableComposition *composition = [[AVMutableComposition alloc]init]; AVMutableCompositionTrack *track = [composition addMutableTrackWithMediaType:AVAssetExportPresetPassthrough preferredTrackID:kCMPersistentTrackID_Invalid]; //add assets to track [track insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration) ofTrack:[[firstAsset tracksWithMediaType:AVMediaTypeVideo]objectAtIndex:0] atTime:kCMTimeZero error:nil]; [track insertTimeRange:CMTimeRangeMake(kCMTimeZero, secondAsset.duration) ofTrack:[[secondAsset tracksWithMediaType:AVMediaTypeVideo]objectAtIndex:0] atTime:firstAsset.duration error:nil]; // 5 - Create exporter AVAssetExportSession *exporter = [[AVAssetExportSession alloc]initWithAsset:composition presetName:AVAssetExportPresetPassthrough]; NSString *outputURL = [NSString stringWithFormat:@"%@mergedvid.mp4", NSTemporaryDirectory()]; NSLog(@"%@", exporter.supportedFileTypes); exporter.outputURL=[NSURL fileURLWithPath:outputURL]; exporter.outputFileType = AVFileTypeMPEG4; [exporter exportAsynchronouslyWithCompletionHandler:^{ dispatch_async(dispatch_get_main_queue(), ^{ [self exportDidFinish:exporter]; }); }]; } -(void)exportDidFinish:(AVAssetExportSession*)session { NSLog(@"export method"); NSLog(@"%i", session.status); NSLog(@"%@", session.error); } 

并输出如下:

 - FirstAsset Is Readable = 1 - FirstAsset Is playable = 1 - FirstAsset Is exportable = 1 - SecondAsset Is Readable = 1 - SecondAsset Is playable = 1 - SecondAsset Is exportable = 1 - ( "com.apple.quicktime-movie", "com.apple.m4a-audio", "public.mpeg-4", "com.apple.m4v-video", "public.3gpp", "org.3gpp.adaptive-multi-rate-audio", "com.microsoft.waveform-audio", "public.aiff-audio", "public.aifc-audio", "com.apple.coreaudio-format" ) -export method - 4 - Error Domain=AVFoundationErrorDomain Code=-11838 "Operation Stopped" UserInfo=0x155f76f0 {NSLocalizedDescription=Operation Stopped, NSLocalizedFailureReason=The operation is not supported for this media.} 

好吧,所以根据输出我的文件是好的,可导出和MP4是一个支持的输出types。

有没有人知道为什么它给我的错误“操作不支持这个媒体”

我认为这个说法是你的罪魁祸首

 AVMutableCompositionTrack *track = [composition addMutableTrackWithMediaType:AVAssetExportPresetPassthrough preferredTrackID:kCMPersistentTrackID_Invalid]; 

在这里你传递AVAssetExportPresetPassthrough你应该使用AVMediaTypeVideoAVMediaTypeAudio

如果你正在join两个video,那么为什么你在插入时间范围时在两个地方使用kCMTimeZero 。 我认为应该是

  [track insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration) ofTrack:[[firstAsset tracksWithMediaType:AVMediaTypeVideo]objectAtIndex:0] atTime:kCMTimeZero error:nil]; [track insertTimeRange:CMTimeRangeMake(kCMTimeZero, secondAsset.duration) ofTrack:[[secondAsset tracksWithMediaType:AVMediaTypeVideo]objectAtIndex:0] atTime:firstAsset.duration error:nil]; 

在插入atTime时间范围时查看secondAsset