iOS 视频到音频文件的转换

标签 ios audio video nsurlconnection

<分区>

我设法使用 NSUrlConnection 下载了一个 youtube 视频并将其保存到设备上。现在我想将此(我猜是 .mp4)文件转换为 .mp3 音频文件。有谁知道这个问题的解决方案?也许有一种方法可以只从视频中下载音频?这会节省很多时间。

最佳答案

首先,您不想转换任何东西,那很慢。相反,您想从 mp4 文件中提取音频流。为此,您可以创建一个仅包含原始文件音轨的 AVMutableComposition,然后使用 AVAssetExportSession 导出组合。目前以 m4a 为中心。如果您想同时处理 m4a 和 mp3 输出,请检查音轨类型,确保设置正确的文件扩展名,并在导出 session 中选择 AVFileTypeMPEGLayer3AVFileTypeAppleM4A

    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/

相关文章:

ios - View 前面的滑动滑动菜单

ios - 使用 iphone sdk 在应用内购买货币交易

比较两个语音

swift - 如何快速重播视频

iphone - 这段通过 AVAssetWriter 和 AVAssetWriterInputs 编写视频+音频的代码不起作用。为什么?

ios - 测试应用程序内购买是否需要有效的付费应用程序契约(Contract)?

Android 将 pcm 文件从 AudioRecord 转换为更小的文件

audio - AVAudioEngine是否支持递归路由?

ios - 如何从YouTube视频中删除视频控件?

ios - QLPreviewController 不加载多个文件