Wie AVAudioPlayer Ausgabe an den Lautsprecher erhalten
-
06-07-2019 - |
Frage
Ich bin die Aufzeichnung von Audio mit AVAudioRecorder wie in Wie zeichne ich Audio auf dem iPhone mit AVAudioRecorder?
Ich verwende AVAudioPlayer dann die Aufnahme abzuspielen. aus dem Ohr Lautsprecher aber der Ton kommt, nicht der Lautsprecher. Wie würde ich mich über den Ton der Lautsprecher umleiten?
TIA!
Lösung
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);
Andere Tipps
Ich weiß, diese Frage ziemlich alt ist, aber wenn ich mit dem gleichen Problem zu kämpfen habe, fand ich eine einfache Lösung, die hoffentlich jemanden helfen, die lauten Medien Lautsprecher Suche zu verwenden, wie der Empfängers Lautsprecher gegenüber. Die Methode, die ich verwendet wurde, die Einstellung der Audio-Sitzung mit der DefaultToSpeaker Option in AVAudioSessionCategoryOptions up:
In Swift (vorausgesetzt, Ihre Audio-Sitzung session
genannt wird) -
session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions:AVAudioSessionCategoryOptions.DefaultToSpeaker, error: nil)
In Obj-C -
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error: nil];
Swift 3
Vor der Aufnahme des Schalls I gesetzt:
AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)
und vor der Wiedergabe I gesetzt:
AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)
Objective C
vor der Aufzeichnung:
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryRecord error:nil];
vor der Wiedergabe:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
Dies funktioniert gut für mich in Swift2
let session = AVAudioSession.sharedInstance()
try! session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: AVAudioSessionCategoryOptions.DefaultToSpeaker)
Dies ist eine alte Frage, aber die andere Antwort mir nicht helfen ... Allerdings fand ich eine Lösung, die ich für die Zukunft, falls jemand wäre Entsendung (oder ich von der Zukunft!) Braucht es.
Die Lösung wird in dem folgenden Blog-Eintrag beschrieben: iOS: Kraft Audio-Ausgang an die Lautsprecher während der Kopfhörer in angeschlossen.
Sie brauchen neue Objective-C-Klasse AudioRouter in Ihrem Projekt zu erstellen. Dann importieren AudioRouter.h
in die Header-Datei der Klasse, wo Sie Audio-Funktionalität initiieren. Als nächstes wird in der entsprechenden .m
Datei die folgenden Zeilen innerhalb viewDidLoad
Methode:
AudioRouter *foobar = [[AudioRouter alloc] init];
[foobar initAudioSessionRouting];
[foobar forceOutputToBuiltInSpeakers];
Jetzt haben Sie Audio (z AVAudioPlayer) Ausgang zum Lautsprecher gezwungen! Beachten Sie, dass, wenn Sie stecken in Kopfhörer , während die App ausgeführt wird, dann werden alle Audio-Ausgang Kopfhörer geleitet wird.
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)")
}
Antwort Für 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 _ {
}
}
Dies ist der Schlüssel Linie zur Ausgabe auido Lautsprecher statt Mikrofon. Hinweis es während der Aufnahme eingestellt werden sollte
try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)
Im Folgenden finden Sie komplette Funktion zum Einrichten der Aufnahme
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.")
}
}