.h文件
/**
提取視頻中的音頻
@param videoPath 視頻路徑
@param completionHandle 完成回調(diào)
*/
+(void)accessAudioFromVideo:(NSURL *)videoPath completion:(void (^)(NSURL *outputPath,BOOL isSucceed)) completionHandle;
.m文件
需要導入系統(tǒng)的#import <Photos/Photos.h>
/**
提取視頻中的音頻
@param videoPath 視頻路徑
@param completionHandle 完成回調(diào)
*/
+(void)accessAudioFromVideo:(NSURL *)videoPath completion:(void (^)(NSURL *outputPath,BOOL isSucceed)) completionHandle{
AVAsset *videoAsset = [AVAsset assetWithURL:videoPath];
//1創(chuàng)建一個AVMutableComposition
AVMutableComposition *mixComposition = [[AVMutableComposition alloc]init];
//2 創(chuàng)建一個軌道,類型為AVMediaTypeAudio
AVMutableCompositionTrack *audioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
//獲取videoPath的音頻插入軌道
[audioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil];
//4創(chuàng)建輸出路徑
NSURL *outputURL = [self exporterPath:@"mp4"];
//5創(chuàng)建輸出對象
AVAssetExportSession *exporter = [[AVAssetExportSession alloc]initWithAsset:mixComposition presetName:AVAssetExportPresetAppleM4A];
exporter.outputURL = outputURL ;
exporter.outputFileType = AVFileTypeAppleM4A;
exporter.shouldOptimizeForNetworkUse = YES;
[exporter exportAsynchronouslyWithCompletionHandler:^{
if (exporter.status == AVAssetExportSessionStatusCompleted) {
NSURL *outputURL = exporter.outputURL;
completionHandle(outputURL,YES);
}else {
NSLog(@"失敗%@",exporter.error.description);
completionHandle(outputURL,NO);
}
}];
}
// 輸出路徑
+ (NSURL *)exporterPath:(NSString *)filename{
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
formatter.dateFormat = @"yyyyMMddHHmmss";
NSString *str = [formatter stringFromDate:[NSDate date]];
NSString *fileName = [NSString stringWithFormat:@"selfMusic%@.%@",str,filename];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [paths firstObject];
//這個是錄制視頻時存儲到本地的video
NSString *path = [NSString stringWithFormat:@"%@/KSYShortVideoCache",docPath];
//判斷文件夾是否存在,不存在就創(chuàng)建
//創(chuàng)建附件存儲目錄
if (![[NSFileManager defaultManager] fileExistsAtPath:path]) {
[[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
}
NSString *outputFilePath = [path stringByAppendingPathComponent:fileName];
return [NSURL fileURLWithPath:outputFilePath];
}