我成功使用NSUrlConnection下载了一个YouTube视频并将其保存到设备上。现在我想将这个(我猜是.mp4)文件转换为.mp3音频文件。有人知道解决这个问题的方法吗?也许有一种方法只下载视频的音频?这将节省很多时间。
我成功使用NSUrlConnection下载了一个YouTube视频并将其保存到设备上。现在我想将这个(我猜是.mp4)文件转换为.mp3音频文件。有人知道解决这个问题的方法吗?也许有一种方法只下载视频的音频?这将节省很多时间。
首先,你不想转换任何东西,那样太慢了。相反,你想从mp4文件中提取音频流。你可以通过创建一个AVMutableComposition
包含原始文件的音频轨道,然后使用AVAssetExportSession
导出组合来实现这一点。目前这是以m4a为中心的。如果你想处理m4a和mp3输出,检查音频轨道类型,确保设置正确的文件扩展名,并在导出会话中选择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");
}
}];