Pergunta

Estou a gravação de áudio com AVAudioRecorder como visto em Como faço para gravar áudio no iPhone com AVAudioRecorder?

Eu, então, usar AVAudioPlayer para reproduzir a gravação. No entanto, o som está saindo do alto-falante, e não o alto-falante. Como eu iria sobre redirecionando o som para o alto-falante?

TIA!

Foi útil?

Solução

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

Outras dicas

Eu percebo esta pergunta é bastante antigo, mas quando eu estava lutando com o mesmo problema que eu encontrei uma solução simples que espero venha a ajudar alguém olhando para usar os alto-falantes de mídia mais alto em oposição aos alto-falantes do receptor. O método utilizado foi a criação da sessão de áudio com a opção DefaultToSpeaker em AVAudioSessionCategoryOptions:

Em Swift (assumindo a sua sessão de áudio é nomeado session) -

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

Em Obj-C -

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

Swift 3

Antes de gravar o conjunto de sons I:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)

e antes de conjunto de reprodução I:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)

Objective C

antes da gravação:

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

antes da reprodução:

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

Isso funciona muito bem para mim no Swift2

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

Esta é uma questão de idade, mas a outra resposta não me ajudou ... No entanto, eu encontrei uma solução que estou postando para referência futura no caso de alguém (ou a mim mesmo do futuro!) Precisa.

A solução é descrita no seguinte post: iOS: Força saída de áudio para alto-falantes, enquanto os auscultadores estão ligados .

Você precisa criar nova AudioRouter classe Objective-C em seu projeto. Em seguida, importe AudioRouter.h em seu arquivo de cabeçalho da classe onde você está iniciando uma funcionalidade de áudio. Em seguida, no arquivo .m correspondente adicione as seguintes linhas no método viewDidLoad:

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

Agora você tem de áudio (por exemplo AVAudioPlayer) saída forçada a alto-falante! Note que se você conectar fones de ouvido enquanto o aplicativo está em execução, em seguida, toda a saída de áudio é direcionado para fones de ouvido.

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)")
    }

Resposta 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 é a linha chave para auido saída falante vez no microfone. Nota deve ser definido durante a gravação

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

Abaixo é a função completa para gravação de configuração

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top