2013-08-08 4 views
3

Эта проблема сводит меня с ума. Я пытаюсь пометить некоторые песни в своем приложении Cocoa с помощью AVAsset, который я добавляю в него информацию тега и экспортирую ее с помощью AVAssetExportSession. Однако, независимо от того, что я делаю, экспорт выходит из строя с ошибкой (OSStatus error -620.)" (notEnoughMemoryErr: insufficient physical memory). На моем MacBook у меня всегда есть 3-4 концерта или больше свободной памяти, когда я делаю это, так что это не так. Я попытался удалить всю информацию о тегах, в случае, если что-то было причиной ошибки, но это не помогло.AVAssetExportSession дает ошибку -620 (недостаточная физическая память) с 4-х гигабайтами свободной оперативной памяти

Вот код:

AVURLAsset *asset = [AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:[tempSongPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]] options:nil]; 

AVAssetExportSession *session; 
session = [AVAssetExportSession exportSessionWithAsset:asset presetName:AVAssetExportPresetAppleM4A]; 
session.outputFileType = AVFileTypeAppleM4A; 

NSURL *outputURL = [NSURL URLWithString:[[NSString stringWithFormat:@"%@Path/%@", NSTemporaryDirectory(), @"output.m4a"] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 

session.outputURL = outputURL; 
NSLog(@"Asset: %@", asset); 
NSLog(@"Session %@", session); 
[session exportAsynchronouslyWithCompletionHandler:^{ 


    if (AVAssetExportSessionStatusCompleted == session.status) { 
     NSLog(@"Completed"); 
    } 

    NSString *cause; 
    NSString *stringError; 
    if (session.error) 
    { 
     NSLog(@"%@", session.error); 
     stringError = [session.error localizedDescription]; 
     cause = session.error.localizedFailureReason; 

    } 
    else 
     stringError = @"Unknown error"; 
    NSLog(@"Error: %@ because %@", stringError, cause); 
    for (NSString *key in session.error.userInfo.allKeys) 
    { 
     NSLog(@"%@: %@", key, [session.error.userInfo objectForKey:key]); 
    } 
}]; 

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

+0

Сколько ОЗУ является вашим приложением, используемым в момент сбоя, и является ли ваше приложение 32-разрядным или 64-битным? Если он 32-разрядный и он пытается выделить более 4 ГБ ОЗУ для приложения, он будет исчерпан ОЗУ, независимо от того, сколько свободной памяти у вас есть, так как это ограничение для 32-разрядных приложений. – BergQuester

+0

@BergQuester Мое приложение использует около 40 МБ ОЗУ во время сбоя. Кроме того, я не думаю, что можно написать 32-битное приложение для OSX. (Я мог бы ошибаться об этом) – Garrett

+0

Мне было бы любопытно, сколько ОЗУ оно пытается выделить тогда. OS X была 32-бит только до 10.4. Я считаю, что полная поддержка 64-битной версии была завершена в 10.6. В 10.7 они отказались от поддержки 32-битных процессоров, но 32-разрядные приложения по-прежнему поддерживаются. Xcode 4.6.3 также поддерживает создание 32-разрядных приложений Mac, у нас все еще есть 32-разрядная версия нашего приложения на работе, которую мы построим с помощью 4.6.3. – BergQuester

ответ

3

Ошибка вне памяти - это красная селедка. Проблема эта линия:

NSURL *outputURL = [NSURL URLWithString:[[NSString stringWithFormat:@"%@Path/%@", NSTemporaryDirectory(), @"output.m4a"] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 

Попробуйте заменить его с этим:

NSURL *outputURL = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%@", NSTemporaryDirectory(), @"output.m4a"] isDirectory:NO]; 

Я просто проверял с вышеизложенным и теперь он работает нормально.

+0

(NB Вы все равно получите сообщение NSLog в строках 'Error: Unknown error, потому что (null)', потому что вы регистрируете ошибку, даже когда 'session.error' ясен) – davidf2281

+0

Это работает! Но почему моя работа не работала? Когда я делаю это по-своему, я получаю 'файл: // localhost/var/folders/l8/jzvsxgpn5t5cgc3wjk39wq380000gn/T // output.m4a' для' outputURL' с этим двойным/вместо одного. Вот почему я не поместил его в строку. Но по какой-то причине он работает с двумя косыми чертами, а не с одним. Почему это? – Garrett

+1

Проблема связана с тем фактом, что вы использовали 'URLWithString', а не' fileURLWithPath', поэтому ваш URL-адрес не был добавлен с 'file: // localhost'. – davidf2281

 Смежные вопросы

  • Нет связанных вопросов^_^