iOS, извлекающая аудио из файла .mov - PullRequest
8 голосов
/ 04 августа 2011

Я уже некоторое время пытаюсь извлечь аудио из файла .mov, и я просто не могу заставить его работать. В частности, мне нужно извлечь аудио и сохранить его как файл .aif или .aiff.

Я пытался использовать AVMutableComposition и загружать файл mov как AVAsset. Добавление только звуковой дорожки в AVMutableComposition перед окончательным использованием AVAssetExportSession (установка типа выходного файла на AVFileTypeAIFF, который является нужным мне форматом) для записи файла в 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

Я не уверен, сработает ли вышеуказанный подход, но я открыт для вероятности того, что я просто что-то делаю не так. Однако, если кто-то знает другой способ достичь того, чего я пытаюсь достичь, любая помощь будет принята с благодарностью.

Я могу опубликовать более подробный код, если он необходим, но в данный момент я пробую несколько других подходов, так что сейчас это немного грязно.

Спасибо за помощь!

Ответы [ 3 ]

11 голосов
/ 29 сентября 2014
-(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);
        }
    }];
}
6 голосов
/ 14 ноября 2012

Потому что 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");
    }
}];
0 голосов
/ 27 октября 2016

Просто небольшая информация для других (я не знал, что ..) Если у вас есть видеофайл (в моем случае это был mp4), вы можете воспроизводить только аудио с AVAudioPlayer.Вам не нужно извлекать (или конвертировать) аудио из видео.

...