Question

Je suis en train d'enregistrer de l'audio avec AVAudioRecorder, comme indiqué dans Comment enregistrer de l'audio sur iPhone avec AVAudioRecorder?

J'utilise ensuite AVAudioPlayer pour lire l'enregistrement. Cependant, le son sort du haut-parleur et non du haut-parleur. Comment pourrais-je rediriger le son vers le haut-parleur?

TIA!

Était-ce utile?

La solution

De http://www.iphonedevsdk.com/forum/iphone-sdk-development-advanced-iscussion/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);

Autres conseils

Je me rends compte que cette question est assez ancienne, mais lorsque je me débattais avec le même problème, j’ai trouvé une solution simple qui, espérons-le, aidera tous ceux qui cherchent à utiliser les haut-parleurs multimédias les plus puissants, par opposition aux haut-parleurs récepteurs. La méthode que j’ai utilisée consistait à configurer la session audio avec l’option DefaultToSpeaker dans AVAudioSessionCategoryOptions:

Dans Swift (en supposant que votre session audio s'appelle session ) -

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

Dans Obj-C -

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

Swift 3

Avant d'enregistrer le son que j'ai réglé:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)

et avant la lecture, j'ai défini:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)

Objectif C

avant d’enregistrer:

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

avant la lecture:

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

Cela fonctionne très bien pour moi dans Swift2

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

C’est une vieille question, mais l’autre réponse ne m’a pas aidé ... Cependant, j’ai trouvé une solution que je vous présente pour référence future au cas où quelqu'un (ou moi-même du futur!) en aurait besoin.

La solution est décrite dans l'article suivant du blog: iOS: Forcer sortie audio vers les haut-parleurs lorsque les écouteurs sont branchés .

Vous devez créer un nouveau AudioRouter de classe Objective-C dans votre projet. Importez ensuite AudioRouter.h dans votre fichier d’en-tête de la classe où vous lancez la fonctionnalité audio. Ensuite, dans le fichier .m correspondant, ajoutez les lignes suivantes dans la méthode viewDidLoad :

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

Vous avez maintenant une sortie audio (par exemple, AVAudioPlayer) forcée vers le haut-parleur! Notez que si vous branchez des écouteurs pendant que l'application est en cours d'exécution, toutes les sorties audio sont alors dirigées vers les écouteurs.

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

Réponse pour 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 _ {
    }
}

c'est la ligne de touche pour la sortie audio dans le haut-parleur plutôt que dans le microphone. Non, il devrait être réglé pendant l’enregistrement

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

La fonction ci-dessous complète pour configurer l'enregistrement

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.")
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top