2015-04-08 3 views
7

У меня есть приложение, которое записывает, а затем воспроизводит аудиофайл. В настоящее время воспроизведение звука осуществляется через динамик динамика. Может ли кто-нибудь сказать мне, как Swift будет обрабатывать кодирование, чтобы заставить звук выходить из громкоговорителя?Принудительное воспроизведение аудиофайлов через громкоговоритель iPhone с помощью Swift

Ниже приведен один из экземпляров, которые я использую для воспроизведения аудио файла:

@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

в StackOverflow вы должны поделиться некоторый код, что вы пробовали, чтобы получить помощь ... –

+0

Там, жаль об этом! Надеюсь, это даст вам лучшее представление о том, чего я пытаюсь достичь. – Unconquered82

ответ

11

EDIT Июль 2017: Обратитесь к ответу Husam для решения Swift 2.0.

Начиная с Swift 1.2, вы используете overrideOutputAudioPort и AVAudioSessionPortOverride. Это может быть реализовано путем делать что-то вроде этого:

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

Я работаю над приложением, которое использует это сейчас, и у меня есть функция под названием setSessionPlayandRecord, которая выглядит как:

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

Nevermind .. Я понимаю, что вы сейчас говорите, и у меня это работает. Большое вам спасибо за ответ! Мне жаль, что у меня не было больше репутации, чтобы я мог вытащить из него все! Ты парень/галс рок! – Unconquered82

11

Swift 2,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 _ { 
    } 
}