2010-06-23 2 views
8

У меня проблема с AVAudioRecorder и AVAudioPlayer.AVAudioRecorder & AVAudioPlayer - Звуковой выход на внутренний динамик, как его изменить?

При использовании проигрывателя и записи одновременно (например, для воспроизведения звука во время записи) звук находится в тихом внутреннем динамике. Я искал StackOverflow и все, что я нашел, был этот код:

UInt32 *audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); 

Но это мне не помогает :( Когда я CopyPaste его, я получил ошибки Что я могу сделать, чтобы записывать и воспроизводить громкоговоритель в. дно?

Я ничего не использовать, как SCLister Одер что-то ...

Спасибо заранее

Макс

ответ

1

Единственное, что я нашел по этой теме заключается в следующем:

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

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

P.S. Убедитесь, что вы добавили фреймы AudioToolbox и AVFoundation к вашему проекту и включили их в свои .m-файлы.

+1

Да, это необходимо, но я получил его. Без изменений :( Функция сама в порядке, вы можете взорвать микрофон и услышать звук, но только с внутренним динамиком. –

16

Это немного устарело, но это сообщение помогло мне, и я хотел обновить его для всех, кому это может понадобиться в будущем. Код, размещенный в верхней части, верен - звук будет воспроизводиться через громкоговоритель телефона и направит его на громкоговоритель внизу. В коде есть незначительная опечатка, поэтому он дает ошибки. Вот правильный фрагмент кода, который позволит решить эту проблему:

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); 

Убедитесь, что вы также активировать аудио сессии сразу же после установки этого, перед созданием аудио плеер/рекордер:

[[AVAudioSession sharedInstance] setActive:YES error:nil]; 

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

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

OSStatus propertySetError = 0; 
UInt32 allowMixing = true; 
propertySetError = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing); 

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); 

NSLog(@"Mixing: %x", propertySetError); // This should be 0 or there was an issue somewhere 

[[AVAudioSession sharedInstance] setActive:YES error:nil]; 

Надеюсь, что кто-то поможет!

+0

, кстати, это должно быть 'error: NULL' not' error: nil' – user102008

+2

Существует довольно немного кода примера Apple, который показывает ошибку: нуль, а также ошибку: NULL, поэтому, похоже, это приемлемо для использования. Это, безусловно, не вызовет никаких проблем. –

+0

спасибо, друг Это очень помогло мне! – Warewolf

0

Если вы в настоящее время играет через тихие динамики, и вы хотите, чтобы играть через динамик в нижней части iPhone, используйте этот код:

UInt32 doChangeDefaultRoute = 1; 

AudioSessionSetProperty (
         kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, 
         sizeof (doChangeDefaultRoute), 
         &doChangeDefaultRoute 
         ); 
0

Это старый вопрос, но ни один из другие ответы мне помогли ... Тем не менее, я нашел решение, которое я отправляю для будущей справки, если кому-то это понадобится.

Решение описано в следующем сообщении в блоге: iOS: Force audio output to speakers while headphones are plugged in.

Вам необходимо создать в своем проекте новый класс Objective-C AudioRouter. Затем импортируйте AudioRouter.h в свой заголовочный файл класса, в котором вы запускаете аудиофункции.Теперь в файле corrseponding .m добавьте следующие строки в viewDidLoad метода:

AudioRouter *foobar = [[AudioRouter alloc] init]; 
[foobar initAudioSessionRouting]; 
[foobar forceOutputToBuiltInSpeakers]; 

Теперь у вас есть аудио (например, AVAudioPlayer) выход вынужден громкоговоритель!

0

AudioSessionSetProperty устарел с iOS7, но следующее работало для меня.

AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error]; 
2

Я ответил уже здесь: How to get AVAudioPlayer output to the speaker

Короче говоря, используйте перед записью:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil]; 

... и использовать это перед воспроизведением (на громкоговорители или наушники, если они забито)

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil]; 
+0

Ты мужчина! – CSawy

Смежные вопросы