2015-04-08 9 views
7

Mam aplikację, która nagrywa, a następnie odtwarza plik audio. Obecnie odtwarzanie dźwięku odbywa się przez głośnik słuchawki. Czy ktoś mógłby mi powiedzieć, w jaki sposób Swift miałby sobie z tym poradzić, żeby zamiast tego wymusić na głośniku dźwięk?Wymuś odtwarzanie pliku audio za pomocą głośnika iPhone przy użyciu Swift

Poniżej znajduje się jeden z przypadków używam do odtwarzania plików audio:

@IBAction func playAudioVader(sender: UIButton) { 
    playAudioWithVariablePitch(-1000) 
    } 

    func playAudioWithVariablePitch(pitch: Float){ 
    audioPlayer.stop() 
    audioEngine.stop() 
    audioEngine.reset() 

     var audioPlayerNode = AVAudioPlayerNode() 
     audioEngine.attachNode(audioPlayerNode) 

     var changePitchEffect = AVAudioUnitTimePitch() 
     changePitchEffect.pitch = pitch 
     audioEngine.attachNode(changePitchEffect) 

     audioEngine.connect(audioPlayerNode, to: changePitchEffect, format: nil) 
     audioEngine.connect(changePitchEffect, to: audioEngine.outputNode, format: nil) 

     audioPlayerNode.scheduleFile(audioFile, atTime: nil, completionHandler: nil) 
     audioEngine.startAndReturnError(nil) 

     audioPlayerNode.play() 

} 

    override func viewDidLoad() { 

    super.viewDidLoad() 

    audioPlayer = AVAudioPlayer(contentsOfURL:receivedAudio.filePathURL, error: nil) 
    audioPlayer.enableRate = true 
    audioEngine = AVAudioEngine() 
    audioFile = AVAudioFile(forReading:receivedAudio.filePathURL, error: nil) 


} 
+0

W stackoverflow należy udostępnić jakiś kod, czego próbował, aby uzyskać pomoc ... –

+0

Nie, przepraszam! Mam nadzieję, że daje to lepsze wyobrażenie o tym, co próbuję osiągnąć. – Unconquered82

Odpowiedz

11

EDIT lipca 2017: Patrz odpowiedź Husam dla rozwiązania Swift 2.0.

Od wersji Swift 1.2 używa się przesłonięciaOutputAudioPort i AVAudioSessionPortOverride. Może on być realizowany przez robi coś takiego:

if !session.overrideOutputAudioPort(AVAudioSessionPortOverride.Speaker, error:&error) { 
    println("could not set output to speaker") 
    if let e = error { 
     println(e.localizedDescription) 
    } 
} 

pracuję nad aplikacją, która wykorzystuje to teraz i mam funkcję o nazwie setSessionPlayandRecord, który wygląda tak:

func setSessionPlayAndRecord() { 
    let session:AVAudioSession = AVAudioSession.sharedInstance() 
    var error: NSError? 
    if !session.setCategory(AVAudioSessionCategoryPlayAndRecord, error:&error) { 
     println("could not set session category") 
     if let e = error { 
      println(e.localizedDescription) 
     } 
    } 
    if !session.overrideOutputAudioPort(AVAudioSessionPortOverride.Speaker, error:&error) { 
     println("could not set output to speaker") 
     if let e = error { 
      println(e.localizedDescription) 
     } 
    } 
    if !session.setActive(true, error: &error) { 
     println("could not make session active") 
     if let e = error { 
      println(e.localizedDescription) 
     } 
    } 
} 
+0

Nieważne .. Rozumiem, co mówisz teraz i mam to działa. Dziękuję bardzo za odpowiedź! Żałuję, że nie mam więcej przedstawicieli, więc mogłem upomnieć o tym! Ty facet/gale rock! – Unconquered82

11

Swift 2,0 kod

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 _ { 
    } 
} 
Powiązane problemy