分离出视频中的音频(目前仅支持本地视频文件)
/**
* 获取视频中的音频
*
* @param videoUrl 视频的本地路径
* @param newFile 导出音频的路径
* @completionHandle 音频路径的回调
*/
- (void)videoManagerGetBackgroundMiusicWithVideoUrl:(NSURL *)videoUrl newFile:(NSString*)newFile completion:(void(^)(NSString*data))completionHandle{
AVURLAsset *videoAsset = [[AVURLAsset alloc] initWithURL:videoUrl options:nil];;
NSArray *keys = @[@"duration",@"tracks"];
[videoAsset loadValuesAsynchronouslyForKeys:keys completionHandler:^{
NSError *error = nil;
AVKeyValueStatus status = [videoAsset statusOfValueForKey:@"tracks" error:&error];
if(status == AVKeyValueStatusLoaded) {//数据加载完成
AVMutableComposition *mixComposition = [[AVMutableComposition alloc] init];
// 2 - Video track
//Audio Recorder
//创建一个轨道,类型是AVMediaTypeAudio
AVMutableCompositionTrack *firstTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
//获取videoAsset中的音频,插入轨道
[firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil];
NSURL *url = [NSURL fileURLWithPath:newFile];
AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetAppleM4A];//输出为M4A音频
exporter.outputURL = url;
exporter.outputFileType = @"com.apple.m4a-audio";//类型和输出类型一致
exporter.shouldOptimizeForNetworkUse = YES;
[exporter exportAsynchronouslyWithCompletionHandler:^{
dispatch_async(dispatch_get_main_queue(), ^{
if (exporter.status == AVAssetExportSessionStatusCompleted) {
completionHandle(newFile);
}else{
NSLog(@"提取失败原因:%@",exporter.error);
completionHandle(nil);
}
});
}];
}
}];
}
提取音频,获取播放时长,获取视频第一帧图片请到
Demo分享 https://github.com/LXHugh/AVSeparation
网友评论