2012-03-14 7 views
14

В приложении, которое я сейчас разрабатываю, я более или менее ударил по кирпичной стене. В приложении вы можете ввести представление, в котором перечислены все локально сохраненные аудиофайлы в стандартном представлении таблицы. Отсюда вы можете щелкнуть по ним, чтобы воспроизвести их, или нажать кнопку записи ниже, чтобы создать новую запись, которая впоследствии автоматически будет сохранена в изолированной программной среде приложений.Видимо случайное повреждение файла с помощью AVAudioRecorder (Иногда файл нельзя воспроизвести) - iOS

Теперь все это работает отлично, в большинстве случаев. Я могу сидеть и записывать и воспроизводить их. Я могу сидеть и тестировать это снова и снова около 45 без каких-либо проблем. Затем внезапно в случайные моменты я попаду в очень странную проблему. Проблема в том, что рекордер внезапно начинает ничего не сохранять, кроме поврежденных файлов, которые невозможно воспроизвести и размером всего 4096 байт, независимо от того, как долго вы записываете.

Я использую AVAudioRecorder в совершенно стандартным способом, установив его так:

// Specific settings for the audio recording 
NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
    [NSNumber numberWithInt:AVAudioQualityMin], 
    AVEncoderAudioQualityKey, 
    [NSNumber numberWithInt:8], 
    AVEncoderBitRateKey, 
    [NSNumber numberWithInt: 2], 
    AVNumberOfChannelsKey, 
    [NSNumber numberWithFloat:22000.0], 
    AVSampleRateKey, 
    nil]; 

NSError *error = nil; 
audioRecorder = [[AVAudioRecorder alloc] 
    initWithURL:contentURL 
    settings:recordSettings 
    error:&error]; 
audioRecorder.delegate = self; 

Я начала записи, как это:

if (!isRecording) { 
    isRecording = YES; 
    [audioRecorder record]; 

    // Start the timer 
    recordTiming = [NSDate date]; 

    timeCheck = [NSTimer 
     scheduledTimerWithTimeInterval:1.0f 
     target:self 
     selector:@selector(timeCheck) 
     userInfo:nil 
     repeats:YES]; 
} 

А потом остановить его с этим:

if (isRecording) { 
    [audioRecorder stop]; 

    // Stop the timer 
    [timeCheck invalidate]; 
} 

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

Есть ли у кого есть небольшое представление о том, что может вызвать проблемы с поврежденными файлами?

+1

Так вы говорите, переменная ошибки всегда ноль после audioRecorder инициализации, верно? –

+0

Да, правильно :) На самом деле у меня есть некоторые быстрые проверки ошибок ниже для NSLog, чтобы убедиться, что он правильно инициализирован и что NSError равен нулю и т. Д. – CodingBeagle

+0

Получил это, давайте улучшим ваш код, проблема, вероятно, должна стать очевидной или исчезнуть. Вместо использования isRecording var вы можете использовать запись свойств аудиозаписей; Я не вижу инициализацию аудиозаписей, но вы, вероятно, просто опустили ее. Однако я бы посоветовал вам также улучшить обработку ошибок, ответ ниже можно было бы использовать в качестве ссылки: http://stackoverflow.com/questions/1010343/how-do-i-record-audio-on-iphone-with -avaudiorecorder –

ответ

6

Примечание: Поскольку OP неактивен в течение нескольких дней, и я предполагаю, что на этот вопрос должен быть дан ответ для будущей ссылки общественности, поэтому я отправляю этот ответ.

AVAudioSession должен быть получен до начала записи.

AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
NSError *err = nil; 
[audioSession setCategory :AVAudioSessionCategoryPlayAndRecord error:&err]; 
if(err){ 
    NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]); 
    return; 
} 
err = nil; 
[audioSession setActive:YES error:&err]; 
if(err){ 
    NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]); 
    return; 
} 

Ссылка: https://stackoverflow.com/a/9706731/188331

+0

Это действительно проблема :) Прошло некоторое время с тех пор, как я проверил свои старые вопросы, поэтому я сожалею об этом, но это действительно решение проблемы. – CodingBeagle