Использование exportAsynchronouslyWithCompletionHandler - PullRequest
5 голосов
/ 29 марта 2011

Я пытаюсь экспортировать аудиофайл из iPod-библиотеки. Я хочу создать с этим файлом iPod-Library новый файл. В Руководстве по программированию AV Foundation в главе «Чтение и запись активов» приведен небольшой пример. Однако этот код не работает для меня. Бывает 4 ошибки

Export Status 4 Error Domain=AVFoundationErrorDomain 
Code=-11800 "The operation could not be completed" 
UserInfo=0x1edfa0 {NSLocalizedFailureReason=An unknown error occurred (-12124), 
NSUnderlyingError=0x1ebdc0 "The operation couldn’t be completed. (OSStatus error -12124.)", 
NSLocalizedDescription=The operation could not be completed}

Мой код

AVURLAsset *objAvUrlAsset = [[AVURLAsset alloc] initWithURL:[tempArray objectAtIndex:0]  options:nil];

NSLog(@"%s objAvUrlAsset %@", __FUNCTION__, objAvUrlAsset);

NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:objAvUrlAsset];

NSLog(@"%s compatiblePresets %@", __FUNCTION__, compatiblePresets);

if ([compatiblePresets containsObject:AVAssetExportPresetAppleM4A]) {


    AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]
                                           initWithAsset:objAvUrlAsset presetName:AVAssetExportPresetAppleM4A];

    NSString * exportPath = [NSString stringWithFormat:@"testTrack1.M4A"];
    NSURL *exportURL = [NSURL fileURLWithPath:exportPath];

    exportSession.outputURL = exportURL;
    exportSession.outputFileType = AVFileTypeAppleM4A;
    exportSession.shouldOptimizeForNetworkUse = YES;

     NSLog(@"%s export Session %@",__FUNCTION__, exportSession);

    [exportSession exportAsynchronouslyWithCompletionHandler: ^(void) {
        // export completed
        NSLog(@"Export Status %d %@", exportSession.status, exportSession.error);
    }];
    [exportSession release];
}

сообщение nslog

-[MyLocalMusicLibrary getAllTracks] objAvUrlAsset AVURLAsset: 0x1dd5a0, URL = ipod-library://item/item.mp3?id=-212958261728896866

 -[MyLocalMusicLibrary getAllTracks] compatiblePresets (
AVAssetExportPresetAppleM4A,
AVAssetExportPreset960x540,
AVAssetExportPresetLowQuality,
AVAssetExportPresetMediumQuality,
AVAssetExportPreset640x480,
AVAssetExportPresetHighestQuality,
AVAssetExportPreset1280x720
)

 -[MyLocalMusicLibrary getAllTracks] export Session AVAssetExportSession: 0x1e85c0, 
asset = AVURLAsset: 0x1dd5a0, URL = ipod-library://item/item.mp3?id=-212958261728896866, 
presetName = AVAssetExportPresetAppleM4A, outputFileType = com.apple.m4a-audio

 -[MyLocalMusicLibrary getAllTracks] Export Status 4 Error Domain=AVFoundationErrorDomain 
Code=-11800 "The operation could not be completed" 
UserInfo=0x1edfa0 {NSLocalizedFailureReason=An unknown error occurred (-12124), 
NSUnderlyingError=0x1ebdc0 "The operation couldn’t be completed. (OSStatus error -12124.)", 
NSLocalizedDescription=The operation could not be completed}

Как я могу исправить эти четыре ошибки. Нужно ли мне для этого экспортировать AVAssetReader и AVAssetWriter.

Ответы [ 2 ]

8 голосов
/ 11 августа 2011

Я получил тот же результат от AVAssetExportSession, что совершенно бесполезный NSError пытается вам сказать, что путь, по которому вы экспортируете, не существует полностью. Вы должны убедиться, что вы создаете путь к каталогу, в который вы помещаете файл, используя NSFileManager.

0 голосов
/ 10 января 2014

Проблема для меня заключалась в том, что я пытался преобразовать файл непосредственно из каталога tmp после получения его из UIImagePickerController

Сначала мне нужно было сохранить файл в библиотеке, а затем перебрать файлы ALAssetLibrary, чтобы найти последнее сохраненное видео. Затем я преобразовал это видео в формат .mp4 и сохранил его в локальном каталоге документов приложения, чтобы использовать его, как мне угодно.

Довольно смешно, что это необходимо, но это работает.

...