Ошибка AVAssetExport для некоторых файлов - программирование

Ошибка AVAssetExport для некоторых файлов

Я попытался экспортировать аудиофайл из iPod-библиотеки. Моя цель - создать новый файл в папке приложения Document с этим файлом iPod-Library. Он не может создавать файлы только для некоторых элементов. Ниже приведен фрагмент кода.

AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL: url options:nil];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

AVAssetExportSession *exporter = [[AVAssetExportSession alloc]
                                  initWithAsset: songAsset
                                  presetName: AVAssetExportPresetAppleM4A];

exporter.outputFileType = @"com.apple.m4a-audio";

NSString *songName  =   [filename stringByAppendingString:@".m4a"];

NSString *musicfilepath  = [documentsDirectory stringByAppendingPathComponent:@"musics/"];

[[NSFileManager defaultManager] createDirectoryAtPath:musicfilepath withIntermediateDirectories:YES attributes:nil error:nil];

NSString *exportFile = [musicfilepath stringByAppendingPathComponent:songName];



NSError *error1;

if([[NSFileManager defaultManager] fileExistsAtPath:exportFile]) 
{

    [[NSFileManager defaultManager] removeItemAtPath:exportFile error:&error1];

}

NSURL* exportURL = [[NSURL fileURLWithPath:exportFile] retain];

exporter.outputURL = exportURL; 

Получаем ошибку, как показано ниже при попытке с блоком обработчика ошибок:

    [exporter exportAsynchronouslyWithCompletionHandler:^{

    int exportStatus = exporter.status;

    switch (exportStatus) {

        case AVAssetExportSessionStatusFailed: {

            NSError *exportError = exporter.error;

            NSLog (@"AVAssetExportSessionStatusFailed: %@", exportError);

            break;
        }
  }
 }];

AVAssetExportSessionStatusFailed: Error Domain = AVFoundationErrorDomain Code = -11800 "Операция не может быть завершена" UserInfo = 0x214f20 {NSLocalizedFailureReason = Произошла неизвестная ошибка (-12124), NSUnderlyingError = 0x218270 "Операция не может быть выполнена. ( OSStatus error -12124.)", NSLocalizedDescription = Операция не может быть выполнена}

4b9b3361

Ответ 1

Сыграв много с этим, некоторые из ответов могут быть релевантными и правильными. Еще одна вещь, на которую следует обратить внимание, это то, что я часто использовал для получения похожих ошибок AVFoundation, пытаясь объединить видео с разной частотой кадров. Проверьте частоту кадров исходных файлов и проверьте свой CMTime. Возможно, вам придется предварительно обработать некоторые файлы, прежде чем добавлять их в AVMutableComposition.

Ответ 2

Если у вас включен iTunes, и файл не загружен на устройство, это может произойти. Можете ли вы проверить, не так ли? Если это так, я могу дать код для его обнаружения.

+ (BOOL)isDownloadedFromiCloud:(MPMediaItem *)item {
    if ([item valueForProperty:MPMediaItemPropertyAssetURL] != nil) {
        AVURLAsset *asset = [AVURLAsset assetWithURL:[item valueForProperty:MPMediaItemPropertyAssetURL]];
        if (asset.exportable)
            return YES;
    }

    return NO;
}

Ответ 3

Я тоже это испытал. Вы используете iTunes? Возможно, файл не находится на самом устройстве. Вы можете проверить это на AVAsset, проверив свойства, такие как hasProtectedContent или обеспечение exportable YES.

Кроме того, я замечаю, что вы используете AVExportSession пресет AVAssetExportPresetAppleM4A'. This will re-encode the file you are exporting. It may be easier (and much faster) to just pass-though instead using AVAssetExportPresetPassthrough`. Это предполагает, что вы довольны существующим файловым форматом, который может быть .m4a,.mp3,.wav и т.д.

Ответ 4

Путь музыкального файла, который вы используете, может быть неправильным. Попробуйте это

NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 

NSUserDomainMask, YES);
NSString* documentsDirectory = [paths objectAtIndex:0]; 
documentsDirectory = [documentsDirectory stringByAppendingPathComponent:@"Music"];
NSError* error;
if (![[NSFileManager defaultManager] fileExistsAtPath:documentsDirectory])
    [[NSFileManager defaultManager] createDirectoryAtPath:documentsDirectory                withIntermediateDirectories:NO attributes:nil error:&error]; 

NSString *exportFile = [documentsDirectory stringByAppendingPathComponent:songName];

if([[NSFileManager defaultManager] fileExistsAtPath:exportFile]) 
{

    [[NSFileManager defaultManager] removeItemAtPath:exportFile error:&error1];

}

if (error != nil) {
NSURL* exportURL = [[NSURL fileURLWithPath:exportFile] retain];

exporter.outputURL = exportURL; 
[exporter exportAsynchronouslyWithCompletionHandler:^{

int exportStatus = exporter.status;

switch (exportStatus) {

    case AVAssetExportSessionStatusFailed: {

        NSError *exportError = exporter.error;

        NSLog (@"AVAssetExportSessionStatusFailed: %@", exportError);

        break;
        }
    }
  }
];
}