2010-02-11 14 views
18

Cuando establece:volumen de grabación de baja en combinación con AVAudioSessionCategoryPlayAndRecord

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

... grabación y reproducción funciona bien, sólo el volumen de reproducción es de alrededor de 60% más baja que cuando me acaba de jugar el mismo sonido sin grabación y ajustes PlayAndRecord.

Necesito obtener picos de volumen alto (para comprobar si un usuario se funde en el micrófono) para eso comencé una sesión de grabación. Pero sin la configuración AVAudio..PlayandRecord, no puedo reproducir ningún sonido mientras tanto. Esa es la razón por la que implementé este comando.

¿Algún consejo?

Thx Chris

Respuesta

25

Para cada uno con el mismo problema, redirigir su salida al altavoz:

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

que funciona.

+0

¡Gracias! Esto resuelve mi problema con el retraso de cambiar entre AVAudioSessionCategoryPlay y AVAudioSessionCategoryRecord –

+1

Actualización ... intenté la solución de Jonas y funciona mucho mejor –

+0

esto funcionó para mí – blueether

3

No olvide la instrucción de importación. Tal vez obvia para los programadores más experimentados ...

#import <AudioToolbox/AudioServices.h> 
+0

¡muy importante !, ¡gracias! – MaKo

0

Además, tienen que añadir marcos AudioToolbox y AVFoundation a su proyecto mediante el botón derecho del Cliking sobre Marcos -> Añadir -> Marcos existentes.

de otro modo podrían obtener error enlazador: "_ AudioSessionSetProperty", referenciado a partir de: - [OpenBook startRecording] en OpenBook.o

15

descubrí (cf. Listado 7-9 en the iOS documentation) que la solución se sugirió anteriormente en anulando la ruta de audio deja de funcionar después de enchufar y quitar los auriculares.

Por lo tanto, si desea que el cambio en la ruta de audio a ser permanente en la sesión de audio actual (Listado 7-10 en the iOS documentation) la misma fuente se puede establecer la ruta de audio predeterminado en lugar de utilizar por

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]; 

y, por supuesto, asegúrese de vincular el marco AudioToolbox e importarlos usando

#import <AudioToolbox/AudioServices.h> 
+0

Gracias! Esta es una gran solución. – inorganik

+0

AudioSessionSetProperty está en desuso en iOS 7.0 – chakrit

+0

¡Gracias! ¡Esto me estaba volviendo loco! – SamYoungNY

22

me encontré con este problema hoy y parece que esta respuesta es un poco anticuado. AudioSessionsSetProperty (...) ahora está en desuso.

El siguiente parece que funciona, sin embargo, que proporciona todo volumen por los altavoces, pero el enrutamiento de forma automática el audio a los auriculares si están conectados antes de la aplicación se ejecute:

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

Y si prefieres la reproducción de audio a través de los altavoces a todo volumen, incluso si los auriculares están conectados, esto funciona también:

[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil]; 
+2

Eso resolvió mis problemas en iOS8 e iOS9. Gracias! –

+0

Mejor respuesta reciente. – NSDeveloper

0

en mi caso, además de utilizar la opción AVAudioSessionCategoryOptionDefaultToSpeaker tuve que quitar el cambio de modo de audioSession de AVAudioSessionMo deDefault a AVAudioSessionModeMeasurement.

Así que si está utilizando modos distintos de AVAudioSessionModeDefault, tenga cuidado.

0

Me encontré con esto hoy, y la mayoría de las respuestas no parecen aplicarse a los cambios recientes de iOS. La respuesta de Lucian anterior con la opción predeterminada ToSpeaker es correcta, aunque todavía parece comportarse de manera diferente en el simulador y en el dispositivo de vez en cuando. Lo que ayudó para mí era establecer la categoría, el modo y opciones en una llamada, que está disponible en iOS 10+ así:

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

El uso de este audio fue todo el camino hasta el máximo y se quedó de esa manera.

Cuestiones relacionadas