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

AVAudioRecorder не работает на iPhone 5S

Итак, я использую AVAudioRecorder для записи звука вместе с AVCaptureSession, который записывает видео (я знаю, что это странно, но для моей ситуации мне нужно записывать их отдельно).

Все работает отлично на каждом устройстве, кроме моего iPhone 5S. Он записывает без ошибок, но файл, который сохраняется на диске, поврежден или что-то в этом роде. Когда я обращаюсь к файловой системе на своем mac и пытаюсь воспроизвести файл m4a с VLC или Quicktime, я получаю ошибку "формат файла не может быть обнаружен". Вот как я инициализирую свой AVAudioRecorder и записываю свой звук:

// Prepare the audio session
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil];
[[AVAudioSession sharedInstance] setMode:AVAudioSessionModeVideoRecording error:nil];

 // Setup audio recording
 NSDictionary *recordSettings = @{AVFormatIDKey: @(kAudioFormatMPEG4AAC),
                                      AVEncoderAudioQualityKey: @(AVAudioQualityLow),
                                      AVEncoderBitRateKey: @16,
                                      AVNumberOfChannelsKey: @1,
                                      AVSampleRateKey: @22050.0f};

 NSError *audioRecorderError;

 NSURL *audioFileURL = [[self.outputFileURL URLByDeletingPathExtension] URLByAppendingPathExtension:@"m4a"];

 self.audioRecorder = [[AVAudioRecorder alloc] initWithURL:audioFileURL
                                                              settings:recordSettings
                                            error:&audioRecorderError];

self.audioRecorder.delegate = self;

 if (audioRecorderError) {
      CCLog(@"Error while initializing the audio recorder... Skipping sound recording!");
 }
else {
    if (![self.audioRecorder prepareToRecord]) {
        CCLog(@"Error preparing to record");
    }
    if (![self.audioRecorder record]) {
        CCLog(@"Error recording");
    }
}

Опять же, это работает на всех устройствах, кроме 5S. Кто-нибудь знает, что может быть причиной этого?

4b9b3361

Ответ 1

Сделал еще несколько копаний, и я, по-видимому, нашел решение. Я просто избавился от AVEncoderBitRateKey, и все работает нормально. Итак, теперь мой словарь recordSettings выглядит следующим образом:

// Setup audio recording
NSDictionary *recordSettings = @{AVFormatIDKey: @(kAudioFormatMPEG4AAC),
                                  AVEncoderAudioQualityKey: @(AVAudioQualityLow),
                                  AVNumberOfChannelsKey: @1,
                                  AVSampleRateKey: @22050.0f};

Все еще не уверен, почему это будет иметь место только на iPhone 5S. Опять же, я тестировал на всех других устройствах под управлением iOS6 и iOS7, а старый словарь настроек отлично работает на всех, кроме 5S. Теперь, когда я удалил AVEncoderBitRateKey и значение, он также работает на 5S.

Ответ 2

Похоже, это взаимодействие между AVNumberOfChannelsKey и AVEncoderBitRateKey. Я не могу записать выше 64000 Кбит/с, когда # каналов = 1, но когда он = 2, я могу использовать 128000...

Ответ 3

У меня была такая же проблема - и ответ оказался связан с AVAudioSession. Мне нужно было установить категорию аудиосеанса в PlayAndRecord. Другие части моего приложения устанавливали его в Ambient. Этот пост fooobar.com/info/410384/... дал мне ответ. Надеюсь, это поможет кому-то, я потерял воскресенье к этому.