Я хотел бы записывать видео с аудио с помощью AVCaptureSession
. Для этого мне нужна AudioSessionCategory AVAudioSessionCategoryPlayAndRecord
, так как мое приложение также воспроизводит видео со звуком.
Я хочу, чтобы звук звучал из динамика по умолчанию, и я хочу, чтобы он смешивался с другим звуком. Поэтому мне нужны параметры AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionMixWithOthers
.
Если во время воспроизведения другого звука я делаю следующее: в звуке из другого приложения есть явный слышимый сбой:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDefaultToSpeaker error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
Есть ли способ избавиться от этой ошибки?
Похоже, что там, где a AVAudioSessionRouteChangeReasonRouteConfigurationChange
уведомлено AVAudioSessionRouteChangeReasonCategoryChange
без микрофонного входа, на микрофонный вход.
Изменение конфигурации (и сбой) также происходит, когда приложение переходит на задний план (с отключением или без отключения аудио сессии). При возврате с фона без деактивации аудио сессии глюки начинают возникать при изменении конфигурации AVCaptureSession
, т.е. когда камера переключается спереди назад. В этом случае маршрутизация звука не затрагивается, и это происходит только при возврате из фона без деактивации аудио сессии. Уведомление о том, что изменение маршрута запускается дважды. Однажды отключите микрофон и один раз, чтобы включить его снова.
Обратите внимание, что это поведение легко воспроизводится при загрузке примера Apple AVCamManual. Добавьте в viewDidLoad
из AAPLCameraViewController.m
следующее:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDefaultToSpeaker error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
…
session.usesApplicationAudioSession = YES;
session.automaticallyConfiguresApplicationAudioSession = NO;
Некоторые другие странные вещи, которые могут быть связаны:
Сначала установите категорию звука AVAudioSessionCategoryAmbient
и активируйте ее:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient withOptions:0 error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
а затем измените категорию:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDefaultToSpeaker error:nil];
другой звук останавливается, несмотря на флаг опций. Ошибок не возникает.