Pregunta

Estoy grabando audio con AVAudioRecorder como se ve en ¿Cómo grabo audio en iPhone con AVAudioRecorder?

Luego uso AVAudioPlayer para reproducir la grabación. Sin embargo, el sonido sale del altavoz, no del altavoz. ¿Cómo haría para redirigir el sonido al altavoz?

TIA!

¿Fue útil?

Solución

De http://www.iphonedevsdk.com/forum/iphone-sdk-development-advanced-discussion/12890-audiosessionsetproperty-problem-playing-sound-listening-mic.html -

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

Otros consejos

Me doy cuenta de que esta pregunta es bastante antigua, pero cuando estaba luchando con el mismo problema, encontré una solución simple que, con suerte, ayudará a cualquier otra persona que busque usar los altavoces de medios más fuertes en lugar de los altavoces del receptor. El método que utilicé fue configurar la sesión de audio con la opción DefaultToSpeaker en AVAudioSessionCategoryOptions:

En Swift (suponiendo que su sesión de audio se llame session ) -

session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions:AVAudioSessionCategoryOptions.DefaultToSpeaker, error: nil)

En Obj-C -

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

Swift 3

Antes de grabar el sonido que configuré:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)

y antes de la reproducción configuré:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)

Objetivo C

antes de grabar:

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

antes de la reproducción:

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

Esto funciona muy bien para mí en Swift2

let session = AVAudioSession.sharedInstance()
try! session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: AVAudioSessionCategoryOptions.DefaultToSpeaker)

Esta es una vieja pregunta, pero la otra respuesta no me ayudó ... Sin embargo, encontré una solución que estoy publicando para referencia futura en caso de que alguien (¡o yo mismo del futuro!) la necesite.

La solución se describe en la siguiente publicación de blog: iOS: Force salida de audio a los altavoces mientras los auriculares están conectados .

Necesita crear un nuevo AudioRouter de clase Objective-C en su proyecto. Luego importe AudioRouter.h en su archivo de encabezado de la clase donde está iniciando la funcionalidad de audio. A continuación, en el archivo .m correspondiente, agregue las siguientes líneas dentro del método viewDidLoad :

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

¡Ahora tiene salida de audio (por ejemplo, AVAudioPlayer) forzada a altavoz! Tenga en cuenta que si conecta los auriculares mientras la aplicación se está ejecutando, toda la salida de audio se dirige a los auriculares.

Swift2:

try session.setCategory(AVAudioSessionCategoryPlayAndRecord,
    withOptions:AVAudioSessionCategoryOptions.DefaultToSpeaker)

Swift 3

 let audioSession = AVAudioSession.sharedInstance()

    do {
        try audioSession.overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)
    } catch let error as NSError {
        print("Audio Session error: \(error.localizedDescription)")
    }

Respuesta para Swift 4.0

func SetSessionPlayerOn()
{
    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)
    } catch _ {
    }
    do {
        try AVAudioSession.sharedInstance().setActive(true)
    } catch _ {
    }
    do {
        try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)
    } catch _ {
    }
}
func SetSessionPlayerOff()
{
    do {
        try AVAudioSession.sharedInstance().setActive(false)
    } catch _ {
    }
}

esta es la línea clave para emitir audio en el altavoz en lugar del micrófono. No se debe configurar durante la grabación

try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)

A continuación se muestra la función completa para configurar la grabación

private func setupRecorder() {

    if isAudioRecordingGranted {
        let session = AVAudioSession.sharedInstance()
        do {

            if #available(iOS 10.0, *) {
                try! session.setCategory(.playAndRecord, mode:.spokenAudio)
            }
            else {
                // Workaround until https://forums.swift.org/t/using-methods-marked-unavailable-in-swift-4-2/14949 isn't fixed
               session.perform(NSSelectorFromString("setCategory:error:"), with: AVAudioSession.Category.playback)
            }
            try session.setActive(true)
            try session.overrideOutputAudioPort(AVAudioSession.PortOverride.speaker)

            let settings = [
                AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
                AVSampleRateKey: 44100,
                AVNumberOfChannelsKey: 2,
                AVEncoderAudioQualityKey:AVAudioQuality.high.rawValue
            ]
            audioRecorder = try AVAudioRecorder(url: fileUrl(), settings: settings)
            audioRecorder.delegate = self
            audioRecorder.isMeteringEnabled = true
            audioRecorder.prepareToRecord()
            self.recorderState = .Ready
        }
        catch let error {
            recorderState = .error(error)
        }
    }
    else {
        recorderState = .Failed("Don't have access to use your microphone.")
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top