Domanda

Sto registrando l'audio con AVAudioRecorder come visto in Come posso registrare l'audio su iPhone con AVAudioRecorder?

Uso quindi AVAudioPlayer per riprodurre la registrazione. Tuttavia, il suono viene emesso dall'altoparlante, non dall'altoparlante. Come farei per reindirizzare il suono verso l'altoparlante?

TIA!

È stato utile?

Soluzione

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

Altri suggerimenti

Mi rendo conto che questa domanda è piuttosto vecchia, ma quando stavo lottando con lo stesso problema, ho trovato una soluzione semplice che spero possa aiutare chiunque altro a cercare di utilizzare gli altoparlanti multimediali più rumorosi rispetto agli altoparlanti del ricevitore. Il metodo che ho usato è stato impostare la sessione audio con l'opzione DefaultToSpeaker in AVAudioSessionCategoryOptions:

In Swift (supponendo che la tua sessione audio sia denominata session ) -

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

In Obj-C -

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

Swift 3

Prima di registrare l'audio che ho impostato:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)

e prima della riproduzione ho impostato:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)

Obiettivo C

prima della registrazione:

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

prima della riproduzione:

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

Questo funziona alla grande per me in Swift2

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

Questa è una vecchia domanda, ma l'altra risposta non mi ha aiutato ... Tuttavia, ho trovato una soluzione che sto pubblicando per riferimento futuro nel caso in cui qualcuno (o me stesso del futuro!) ne abbia bisogno.

La soluzione è descritta nel seguente post di blog: iOS: Force uscita audio agli altoparlanti mentre sono collegate le cuffie .

Devi creare un nuovo AudioRouter di classe Objective-C nel tuo progetto. Quindi importare AudioRouter.h nel file di intestazione della classe in cui si avvia la funzionalità audio. Successivamente, nel corrispondente file .m aggiungi le seguenti righe nel metodo viewDidLoad :

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

Ora hai l'uscita audio (ad es. AVAudioPlayer) forzata verso l'altoparlante! Tieni presente che se colleghi gli auricolari mentre l'app è in esecuzione, tutta l'uscita audio viene indirizzata agli auricolari.

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

Risposta per 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 _ {
    }
}

questa è la linea chiave per emettere l'audio nell'altoparlante anziché nel microfono. Non dovrebbe essere impostato durante la registrazione

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

Di seguito è riportata la funzione completa per impostare la registrazione

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.")
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top