iOS从.mov文件中提取音频
Posted
技术标签:
【中文标题】iOS从.mov文件中提取音频【英文标题】:iOS Extracting Audio from .mov file 【发布时间】:2011-08-04 05:10:49 【问题描述】:一段时间以来,我一直在尝试从 .mov 文件中提取音频,但似乎无法正常工作。具体来说,我需要提取音频并将其保存为 .aif 或 .aiff 文件。
我尝试使用 AVMutableComposition,并将 mov 文件加载为 AVAsset。在最终使用 AVAssetExportSession(将输出文件类型设置为 AVFileTypeAIFF,这是我需要的格式)之前,仅将音轨添加到 AVMutableComposition,将文件写入 aif。
我收到一条错误消息,提示此输出文件类型无效,我不确定原因:
* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“输出文件类型无效”
AVAssetExportSession *exporter;
exporter = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetHighestQuality] ;
exporter.audioMix = audioMix;
exporter.outputURL=[NSURL fileURLWithPath:filePath];
exporter.outputFileType=AVFileTypeAIFF; //Error occurs on this line
我不确定上述方法是否可行,但我对我做错了什么的可能性持开放态度。但是,如果有人知道另一种方法来完成我想要实现的目标,我们将不胜感激。
如果需要,我可以发布更详细的代码,但目前我正在尝试其他一些方法,所以现在有点混乱。
感谢您的帮助!
【问题讨论】:
有人有什么想法吗?我真的很坚持这个。 我还想从视频文件中提取音频。你能帮我解决这个问题吗? 【参考方案1】:-(void)getAudioFromVideo
float startTime = 0;
float endTime = 10;
[super viewDidLoad];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *audioPath = [documentsDirectory stringByAppendingPathComponent:@"soundOneNew.m4a"];
AVAsset *myasset = [AVAsset assetWithURL:[[NSBundle mainBundle] URLForResource:@"VideoName" withExtension:@"mp4"]];
AVAssetExportSession *exportSession=[AVAssetExportSession exportSessionWithAsset:myasset presetName:AVAssetExportPresetAppleM4A];
exportSession.outputURL=[NSURL fileURLWithPath:audioPath];
exportSession.outputFileType=AVFileTypeAppleM4A;
CMTime vocalStartMarker = CMTimeMake((int)(floor(startTime * 100)), 100);
CMTime vocalEndMarker = CMTimeMake((int)(ceil(endTime * 100)), 100);
CMTimeRange exportTimeRange = CMTimeRangeFromTimeToTime(vocalStartMarker, vocalEndMarker);
exportSession.timeRange= exportTimeRange;
if ([[NSFileManager defaultManager] fileExistsAtPath:audioPath])
[[NSFileManager defaultManager] removeItemAtPath:audioPath error:nil];
[exportSession exportAsynchronouslyWithCompletionHandler:^
if (exportSession.status==AVAssetExportSessionStatusFailed)
NSLog(@"failed");
else
NSLog(@"AudioLocation : %@",audioPath);
];
【讨论】:
它工作得很好......谢谢你...... @rajesh,我有一个问题,我必须创建反向音频所以,有没有任何解决方案来获得任何音频文件的反向音频?给你的评论..【参考方案2】:因为 outputFileType 是错误的。对于 .mov 文件,它通常是 @"com.apple.quicktime-movie"。提取的音频为 .mov 格式。为确保,您可以使用此方法获取支持的输出类型:
NSArray *supportedTypeArray=exportSession.supportedFileTypes;
for (NSString *str in supportedTypeArray)
NSLog(@"%@",str);
您可以使用以下方法以音频格式(.m4a,可以通过 AVAudioPlayer 播放)导出音频:
AVAssetExportSession *exportSession=[AVAssetExportSession exportSessionWithAsset:self.mAsset presetName:AVAssetExportPresetAppleM4A];
exportSession.outputURL=myUrl;
exportSession.outputFileType=AVFileTypeAppleM4A;
exportSession.timeRange=timeRange;
[exportSession exportAsynchronouslyWithCompletionHandler:^
if (exportSession.status==AVAssetExportSessionStatusFailed)
NSLog(@"failed");
];
【讨论】:
【参考方案3】:只是给别人的小信息(我不知道..) 如果您有视频文件(在我的情况下是 mp4),您只能使用 AVAudioPlayer 播放音频。 您无需从视频中提取(或转换)音频。
【讨论】:
以上是关于iOS从.mov文件中提取音频的主要内容,如果未能解决你的问题,请参考以下文章
HTML 视频标签将 MOV 文件读取为 Google Chrome 中的音频文件