iOS视频转换成音频文件

6

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


我不认为这是重复的。因为所谓的原始问题中没有被接受的答案。 - Alok C
1个回答

7

首先,你不想转换任何东西,那样太慢了。相反,你想从mp4文件中提取音频流。你可以通过创建一个AVMutableComposition包含原始文件的音频轨道,然后使用AVAssetExportSession导出组合来实现这一点。目前这是以m4a为中心的。如果你想处理m4a和mp3输出,检查音频轨道类型,确保设置正确的文件扩展名,并在导出会话中选择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");
        }
    }];

谢谢!听起来很棒。有没有一种方法可以只提供视频文件的URL,然后进行“流式传输”?先下载整个文件非常慢。 - Valle
尝试将srcURL设置为远程URL。检查曲目需要更长的时间,因此您应该异步加载曲目。 - Rhythmic Fistman
一切都运行得很好,但有时会出现“空数组”错误,因为视频文件的保存尚未准备好。你们知道如何获取NSData writeToFile的completitionHandler(或其他方法)吗? - Valle
writeToFile是同步的,所以应该不是问题。提出一个新问题并发布一些代码。如果我的答案解决了你的问题,请点击大复选框将其接受为答案。 - Rhythmic Fistman
我可以成功提取M4A文件,但是无法提取MP3文件。有人做到了吗? - iOS Dev
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接