iOS AVFoundation导出会话缺lessaudio

我正在使用iOS AVFoundation框架,我能够成功合并video轨道,图像叠加和文本叠加。 但是,我的输出文件不能保持我的原始源video完整的audio。

如何确保来自其中一个video的audio来源保留在我创build的新video中?

编辑

*使用此代码有一个很好的例子,如何做到这一点创build一个video(与原始audio)。 在处理AVFoundationvideo时,我需要分开包含音轨。 希望这可以帮助别人。

AVAssetTrack *videoTrack = nil; AVAssetTrack *audioTrack = nil; CMTime insertionPoint = kCMTimeZero; if([[url tracksWithMediaType:AVMediaTypeVideo] count] != 0) { videoTrack = [url tracksWithMediaType:AVMediaTypeVideo][0]; } if([[url tracksWithMediaType:AVMediaTypeAudio] count] != 0) { audioTrack = [url tracksWithMediaType:AVMediaTypeAudio][0]; } // Insert the video and audio tracks from AVAsset if (videoTrack != nil) { AVMutableCompositionTrack *compositionVideoTrack = [videoComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [url duration]) ofTrack:videoTrack atTime:insertionPoint error:&error]; } if (audioTrack != nil) { AVMutableCompositionTrack *compositionAudioTrack = [videoComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, [url duration]) ofTrack:audioTrack atTime:insertionPoint error:&error]; } 

这里是完整的代码解决了这个问题,它有两个video结合他们的audio:

 AVURLAsset* video1 = [[AVURLAsset alloc]initWithURL:[NSURL fileURLWithPath:path1] options:nil]; AVURLAsset* video2 = [[AVURLAsset alloc]initWithURL:[NSURL fileURLWithPath:path2] options:nil]; if (video1 !=nil && video2!=nil) { // 1 - Create AVMutableComposition object. This object will hold your AVMutableCompositionTrack instances. AVMutableComposition *mixComposition = [[AVMutableComposition alloc] init]; // 2 - Video track AVMutableCompositionTrack *firstTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; AVMutableCompositionTrack *firstTrackAudio = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; [firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, video1.duration) ofTrack:[[video1 tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil]; [firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, video2.duration) ofTrack:[[video2 tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:video1.duration error:nil]; 

//它有一个音轨

  if ([[video1 tracksWithMediaType:AVMediaTypeAudio] count] > 0) { AVAssetTrack *clipAudioTrack = [[video1 tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; [firstTrackAudio insertTimeRange:CMTimeRangeMake(kCMTimeZero, video1.duration) ofTrack:clipAudioTrack atTime:kCMTimeZero error:nil]; } 

//它有一个音轨

  if ([[video2 tracksWithMediaType:AVMediaTypeAudio] count] > 0) { AVAssetTrack *clipAudioTrack = [[video2 tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; [firstTrackAudio insertTimeRange:CMTimeRangeMake(kCMTimeZero, video2.duration) ofTrack:clipAudioTrack atTime:video1.duration error:nil]; } 

//导出会话

  AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality]; //Creates the path to export to - Saving to temporary directory NSString* filename = [NSString stringWithFormat:@"Video_%d.mov",arc4random() % 1000]; NSString* path = [NSTemporaryDirectory() stringByAppendingPathComponent:filename]; //Checks if there is already a file at the output URL. if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { NSLog(@"Removing item at path: %@", path); [[NSFileManager defaultManager] removeItemAtPath:path error:nil]; } exporter.outputURL = [NSURL fileURLWithPath:path]; //Set the output file type exporter.outputFileType = AVFileTypeQuickTimeMovie; path3=path; [arr_StoredDocumentoryUrls addObject:path3]; //Exports! [exporter exportAsynchronouslyWithCompletionHandler:^{ switch (exporter.status) { case AVAssetExportSessionStatusCompleted:{ NSLog(@"Export Complete"); break; } case AVAssetExportSessionStatusFailed: NSLog(@"Export Error: %@", [exporter.error description]); break; case AVAssetExportSessionStatusCancelled: NSLog(@"Export Cancelled"); break; default: break; } }]; } 

尝试添加MobileCoreServices并执行。