Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Примечание. Поскольку 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;
}

Ссылка: fooobar.com/info/401879/...