Низкая громкость записи в сочетании с AVAudioSessionCategoryPlayAndRecord - PullRequest
21 голосов
/ 11 февраля 2010

Когда я установил:

[[AVAudioSession sharedInstance] setCategory:
    AVAudioSessionCategoryPlayAndRecord error:NULL];

… запись и воспроизведение работают нормально, просто громкость воспроизведения примерно на 60% ниже, чем когда бы я просто воспроизводил тот же звук без записи и настроек PlayAndRecord.

Мне нужно получить пики высокой громкости (чтобы проверить, не ударил ли пользователь по микрофону), для этого я начал сеанс записи. Но без настроек AVAudio..PlayandRecord я пока не могу воспроизвести ни одного звука. Вот почему я реализовал эту команду.

Любая помощь?

Спасибо Крис

Ответы [ 7 ]

26 голосов
/ 11 февраля 2010

Для всех с такой же проблемой, перенаправьте ваш вывод на динамик:

[[AVAudioSession sharedInstance] setCategory:
    AVAudioSessionCategoryPlayAndRecord error:NULL];
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute,
    sizeof(audioRouteOverride), &audioRouteOverride);

Это работает.

24 голосов
/ 19 декабря 2013

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

Похоже, что работает следующее, обеспечивая полную громкость через динамики, но автоматически направляя звук на наушники, если они подключены до запуска приложения:

[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error: nil];

И если вы предпочитаете, чтобы звук воспроизводился через динамики на полной громкости, даже если наушники подключены, это также работает:

[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
14 голосов
/ 28 ноября 2011

Я обнаружил (см. Листинг 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>
3 голосов
/ 11 августа 2010

Не забудьте инструкцию по импорту. Возможно, это очевидно для более опытных программистов ...

#import <AudioToolbox/AudioServices.h>
2 голосов
/ 27 ноября 2017

Я столкнулся с этим сегодня, и большинство ответов, похоже, не относятся к последним изменениям iOS. Ответ Люциана, приведенный выше с параметром defaultToSpeaker, является правильным, хотя, похоже, время от времени в Simulator и на устройстве он по-разному работает. Для меня помогло установить категорию, режим и параметры в одном вызове, который доступен в iOS 10+ следующим образом:

try session.setCategory(AVAudioSessionCategoryPlayAndRecord, mode: AVAudioSessionModeDefault, options: .defaultToSpeaker)

Использование этого аудио было максимально возможным и оставалось таким же.

0 голосов
/ 07 октября 2016

В моем случае, помимо использования опции AVAudioSessionCategoryOptionDefaultToSpeaker, мне пришлось убрать изменение режима audioSession с AVAudioSessionModeDefault на AVAudioSessionModeMeasurement.

Так что если вы используете режимы, отличные от AVAudioSessionModeDefault, будьте осторожны.

0 голосов
/ 04 июня 2011

Кроме того, необходимо добавить платформы AudioToolbox и AVFoundation в ваш проект, щелкнув правой кнопкой мыши на Frameworks -> Add -> Existing Frameworks.

В противном случае может получиться ошибка компоновщика: "_ AudioSessionSetProperty", на которую ссылаются из: - [OpenBook startRecording] в OpenBook.o

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...