2012-12-17 117 views
2

我试图使用合并与视频文件,音频文件:合并音频与视频的Objective-C

+ (void)CompileFilesToMakeMovie:(NSString *) audioPath { 
NSLog(@"a"); 
AVMutableComposition* mixComposition = [AVMutableComposition composition]; 
NSURL *audio_inputFileUrl = [[NSURL alloc] initFileURLWithPath:audioPath]; 



NSString *videoPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"input" ofType:@"mov"]; 
NSURL* video_inputFileUrl = [NSURL fileURLWithPath:videoPath]; 

NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *docsDir = [dirPaths objectAtIndex:0]; 
NSString *outputFilePath = [docsDir stringByAppendingPathComponent:@"OutputFile.mov"]; 
NSURL* outputFileUrl = [NSURL fileURLWithPath:outputFilePath]; 

if ([[NSFileManager defaultManager] fileExistsAtPath:outputFilePath]) 
    [[NSFileManager defaultManager] removeItemAtPath:outputFilePath error:nil]; 
NSLog(@"b"); 


CMTime nextClipStartTime = kCMTimeZero; 

AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:video_inputFileUrl options:nil]; 
CMTimeRange video_timeRange = CMTimeRangeMake(kCMTimeZero,videoAsset.duration); 
AVMutableCompositionTrack *a_compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
[a_compositionVideoTrack insertTimeRange:video_timeRange ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:nextClipStartTime error:nil]; 

NSLog(@"c"); 
AVURLAsset* audioAsset = [[AVURLAsset alloc]initWithURL:audio_inputFileUrl options:nil]; 
CMTimeRange audio_timeRange = CMTimeRangeMake(kCMTimeZero, audioAsset.duration); 
AVMutableCompositionTrack *b_compositionAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
[b_compositionAudioTrack insertTimeRange:audio_timeRange ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:nextClipStartTime error:nil]; 
NSLog(@"d"); 


AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality]; 
_assetExport.outputFileType = @"com.apple.quicktime-movie"; 
_assetExport.outputURL = outputFileUrl; 

[_assetExport exportAsynchronouslyWithCompletionHandler: 
^(void) { 
    UISaveVideoAtPathToSavedPhotosAlbum(outputFilePath, nil, nil, nil); 
}  
]; 


} 

但我得到的“C”后,错误会记录为“NSRangeException”,原因:

* - [__ NSArrayM objectAtIndex:]:索引0超出界限为空 阵列”。

音频文件位于

NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *docsDir = [dirPaths objectAtIndex:0]; 
    NSString *soundFilePath = [docsDir stringByAppendingPathComponent:@"%1.iaff"]; 

任何提示吗? 谢谢。

+0

是解决你的问题.... http://stackoverflow.com/questions/12855624/how-to-merge-video-and-recording-并且制作单个视频 – Rajneesh071

回答

9

首先我应该说是你给的音频格式不正确,

NSString *soundFilePath = [docsDir stringByAppendingPathComponent:@"%1.iaff"]; 

做出AIFFNSString *soundFilePath = [docsDir stringByAppendingPathComponent:@"1.aiff"];

如果你不能确定你所使用的代码, 此代码适合我,

-(void) mergeAudio:(NSURL *) audioURL withVideo:(NSURL *) videoURL andSaveToPathUrl:(NSString *) savePath{ 

AVURLAsset* audioAsset = [[AVURLAsset alloc]initWithURL:audioURL options:nil]; 
AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:videoURL options:nil]; 

AVMutableComposition* mixComposition = [AVMutableComposition composition]; 

AVMutableCompositionTrack *compositionCommentaryTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio 
preferredTrackID:kCMPersistentTrackID_Invalid]; 
[compositionCommentaryTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration) 
ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] 
atTime:kCMTimeZero error:nil]; 

AVMutableCompositionTrack *compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo 
preferredTrackID:kCMPersistentTrackID_Invalid]; 
[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration) 
ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] 
atTime:kCMTimeZero error:nil]; 

AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition 
presetName:AVAssetExportPresetPassthrough]; 

NSURL *savetUrl = [NSURL fileURLWithPath:savePath]; 

if ([[NSFileManager defaultManager] fileExistsAtPath:savePath]) 
{ 
[[NSFileManager defaultManager] removeItemAtPath:savePath error:nil]; 
} 

_assetExport.outputFileType = @"com.apple.quicktime-movie"; 


_assetExport.outputURL = savetUrl; 
_assetExport.shouldOptimizeForNetworkUse = YES; 

[_assetExport exportAsynchronouslyWithCompletionHandler: 
^(void) { 
NSLog(@"fileSaved !"); 
} 
]; 


} 

通过vid eoURLaudioURL保存最终文件的路径

+0

我认为这个代码只适用于.mp3文件?而不是.m4a? –