<分区>
我设法使用 NSUrlConnection 下载了一个 youtube 视频并将其保存到设备上。现在我想将此(我猜是 .mp4)文件转换为 .mp3 音频文件。有谁知道这个问题的解决方案?也许有一种方法可以只从视频中下载音频?这会节省很多时间。
<分区>
我设法使用 NSUrlConnection 下载了一个 youtube 视频并将其保存到设备上。现在我想将此(我猜是 .mp4)文件转换为 .mp3 音频文件。有谁知道这个问题的解决方案?也许有一种方法可以只从视频中下载音频?这会节省很多时间。
最佳答案
首先,您不想转换任何东西,那很慢。相反,您想从 mp4 文件中提取音频流。为此,您可以创建一个仅包含原始文件音轨的 AVMutableComposition
,然后使用 AVAssetExportSession
导出组合。目前以 m4a 为中心。如果您想同时处理 m4a 和 mp3 输出,请检查音轨类型,确保设置正确的文件扩展名,并在导出 session 中选择 AVFileTypeMPEGLayer3
或 AVFileTypeAppleM4A
。
NSURL* dstURL = [NSURL fileURLWithPath:dstPath];
[[NSFileManager defaultManager] removeItemAtURL:dstURL error:nil];
AVMutableComposition* newAudioAsset = [AVMutableComposition composition];
AVMutableCompositionTrack* dstCompositionTrack;
dstCompositionTrack = [newAudioAsset addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
AVAsset* srcAsset = [AVURLAsset URLAssetWithURL:srcURL options:nil];
AVAssetTrack* srcTrack = [[srcAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
CMTimeRange timeRange = srcTrack.timeRange;
NSError* error;
if(NO == [dstCompositionTrack insertTimeRange:timeRange ofTrack:srcTrack atTime:kCMTimeZero error:&error]) {
NSLog(@"track insert failed: %@\n", error);
return;
}
AVAssetExportSession* exportSesh = [[AVAssetExportSession alloc] initWithAsset:newAudioAsset presetName:AVAssetExportPresetPassthrough];
exportSesh.outputFileType = AVFileTypeAppleM4A;
exportSesh.outputURL = dstURL;
[exportSesh exportAsynchronouslyWithCompletionHandler:^{
AVAssetExportSessionStatus status = exportSesh.status;
NSLog(@"exportAsynchronouslyWithCompletionHandler: %i\n", status);
if(AVAssetExportSessionStatusFailed == status) {
NSLog(@"FAILURE: %@\n", exportSesh.error);
} else if(AVAssetExportSessionStatusCompleted == status) {
NSLog(@"SUCCESS!\n");
}
}];
关于iOS 视频到音频文件的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20776026/