Случайное повреждение файла при использовании 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];
}

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

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

14
задан Perception 26 February 2013 в 18:51
поделиться