Экспорт аудио из видеофайлов 3gp с помощью AVAssetExportSession

Я пытаюсь экспортировать звук из видеофайла 3gpp, и он не работает... Кто-нибудь знает, что я делаю неправильно? Вот код, который я использую:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"newFile.m4a"];
NSString *tempFile = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"oldFile.3gp"];

AVURLAsset *asset = [AVURLAsset URLAssetWithURL:[NSURL URLWithString:tempFilePath] options:nil];
[asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler:^ {

    //HERE IS THE PROBLEM. THE ARRAY OF TRACKS IS EMPTY FOR SOME REASON.
    AVAssetTrack* audioTrack = [[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];

    AVMutableComposition* audioComposition = [AVMutableComposition composition];
    AVMutableCompositionTrack* audioCompositionTrack = [audioComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
    [audioCompositionTrack insertTimeRange:[audioTrack timeRange] ofTrack:audioTrack atTime:CMTimeMake(0, 1) error:nil];


    AVAssetExportSession *exprortSession = [AVAssetExportSession exportSessionWithAsset:audioComposition presetName:AVAssetExportPresetAppleM4A];
    NSURL *toFileURL = [NSURL URLWithString:filePath];
    exprortSession.outputURL = toFileURL;
    exprortSession.outputFileType = @"com.apple.m4a-audio";

    NSLog(@"exportAsynchronouslyWithCompletionHandler will start");

    [exprortSession exportAsynchronouslyWithCompletionHandler: ^(void) {

        if (exprortSession.status == AVAssetExportSessionStatusCompleted) {
            NSLog(@"Export success");
        }
        else {
            NSLog(@"Export failed");
        }
    }];
}];

person Zigglzworth    schedule 31.01.2012    source источник


Ответы (2)


Попробуйте загрузить актив с помощью

[AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:tempFilePath] options:nil];

вместо

[AVURLAsset URLAssetWithURL:[NSURL URLWithString:tempFilePath] options:nil];
person nano    schedule 31.01.2012
comment
да. Не могу поверить, что я просмотрел это. Также в выходном файле. Спасибо. - person Zigglzworth; 01.02.2012

Поскольку ваша задача будет напрямую манипулировать буферами аудиосэмплов, вам следует использовать второй вариант, который вам предоставит AVFoundation: парная установка AVAssetReader и AVAssetWriter. Вы найдете правильный пример кода, как в AVReaderWriterOSX, из источника Apple для разработчиков. Это также должно работать с iOS, кроме того, что у вас есть другие доступные настройки формата ввода-вывода. Должна быть предоставлена ​​возможность распаковывать аудио как PCM и записывать обратно в несжатый .wav или аудиофайл.

person nivritgupta    schedule 30.07.2013