Низкий уровень записи в сочетании с AVAudioSessionCategoryPlayAndRecord
Когда я устанавливаю:
[[AVAudioSession sharedInstance] setCategory:
AVAudioSessionCategoryPlayAndRecord error:NULL];
... запись и воспроизведение отлично работают, только громкость воспроизведения примерно на 60% ниже, чем когда я просто воспроизвожу один и тот же звук без записи и настроек PlayAndRecord.
Мне нужно получить пики большого объема (чтобы проверить, ударил ли пользователь микрофон), для чего я начал сеанс записи. Но без настроек AVAudio..PlayandRecord, я не могу воспроизводить какие-либо звуки тем временем. Вот почему я выполнил эту команду.
Любая помощь?
спасибо Chris
Ответы
Ответ 1
Для всех с одинаковой проблемой перенаправьте вывод на динамик:
[[AVAudioSession sharedInstance] setCategory:
AVAudioSessionCategoryPlayAndRecord error:NULL];
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute,
sizeof(audioRouteOverride), &audioRouteOverride);
Это работает.
Ответ 2
Сегодня я столкнулся с этой проблемой, и кажется, что этот ответ немного устарел. AudioSessionsSetProperty (...) теперь устарел.
Кажется, что все работает, обеспечивая полную громкость через динамики, но автоматически маршрутизируя звук в наушники, если они подключены до запуска приложения:
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error: nil];
И если вы предпочитаете воспроизведение звука через громкоговорители на полной громкости, даже если наушники подключены, это тоже работает:
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
Ответ 3
Я узнал (см. листинг 7-9 в документации iOS), что предлагаемое решение выше по переопределению аудио маршрута перестает работать после подключения и удаляет наушники,
Итак, если вы хотите, чтобы изменение в маршруте аудио было постоянным в текущем сеансе аудио (листинг 7-10 в документации iOS), тот же источник, который вы можете установите аудиодорожку по умолчанию, используя
NSError *setCategoryErr = nil;
NSError *activationErr = nil;
//Set the general audio session category
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error: &setCategoryErr];
//Make the default sound route for the session be to use the speaker
UInt32 doChangeDefaultRoute = 1;
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof (doChangeDefaultRoute), &doChangeDefaultRoute);
//Activate the customized audio session
[[AVAudioSession sharedInstance] setActive: YES error: &activationErr];
и, конечно же, обязательно привяжите структуру AudioToolbox и импортируйте ее с помощью
#import <AudioToolbox/AudioServices.h>
Ответ 4
Не забывайте оператор import. Возможно, очевидно для более опытных программистов...
#import <AudioToolbox/AudioServices.h>
Ответ 5
Кроме того, вам необходимо добавить в свой проект рамки AudioToolbox и AVFoundation с помощью Right-Cliking on Frameworks → Add → Existing Frameworks.
В противном случае может возникнуть ошибка компоновщика: "_ AudioSessionSetProperty", на которую ссылаются: - [OpenBook startRecording] в OpenBook.o
Ответ 6
В моем случае в дополнение к использованию опции AVAudioSessionCategoryOptionDefaultToSpeaker мне пришлось удалить изменяющийся режим аудиосессии с AVAudioSessionModeDefault на AVAudioSessionModeMeasurement.
Итак, если вы используете другие режимы, отличные от AVAudioSessionModeDefault, будьте осторожны.
Ответ 7
Я столкнулся с этим сегодня, и большинство ответов, похоже, не применяются к недавним изменениям iOS. Ответ Lucian выше с параметром defaultToSpeaker правильный, хотя по-прежнему кажется, что по-разному ведут себя в Simulator и на устройстве время от времени. Мне помогло установить категорию, режим и параметры в один вызов, который доступен в iOS 10+ следующим образом:
try session.setCategory(AVAudioSessionCategoryPlayAndRecord, mode: AVAudioSessionModeDefault, options: .defaultToSpeaker)
Использование этого аудио было до максимума и оставалось таким образом.