AKAudioPlayer:扬声器没有声音,只有耳机

时间:2017-12-06 22:45:10

标签: core-audio audiounit audiokit

使用AudioKit进行声音管理,我注意到这个非常简单的代码存在问题(错误?)。

import AudioKit

class MainViewController: UIViewController {

var audioFile: AKAudioFile?
var audioPlayer: AKAudioPlayer?

override func viewDidLoad() {
    super.viewDidLoad()
}

@IBAction func onPlayButtonClick(_ sender: Any) {

    do {
        audioFile = try AKAudioFile(forReading: Bundle.main.url(forResource: "3e", withExtension: "mp3")!)

        audioPlayer = try AKAudioPlayer(file: audioFile!)

        AudioKit.output = audioPlayer
        AudioKit.start()

        audioPlayer!.play()


    } catch {
        print(error)
    }
}
}

使用play()方法启动播放时,日志和进程中的一切正常(播放器持续时间,currentTime)。但是我没有听到扬声器中的音频 (只有一种风噪声)。一旦我插入耳机并再次点击按钮,我通常会听到音频。然后,我拔下我的耳机并点击按钮,我听不到声音(只有风声)。

我在iPhone 5S上面对此问题

在iPad5上面对此问题,我在模拟器上面对此问题。我没有其他设备试图重现。

两种设备:iOS 11.1.2和AudioKit:v4.0.4

注意:我的扬声器可以与任何其他应用程序正常工作,我已经检查了音量。未插入耳机时,默认的outputDevice设置为Speakers。

1 个答案:

答案 0 :(得分:6)

根据Configuring an Audio Session指南,默认情况下,AVAudioSessionCategory设置为

  

在iOS中,将响铃/静音开关设置为静音模式会使应用播放的任何音频静音。

由于iPad和模拟器不具备此开关,因此它们将始终播放到扬声器,但在硬件iPhone的情况下,它们仅在静音模式下播放耳机而不播放扬声器,除非会话类别已更改。

您可以直接使用AVAudioSession更改会话类别:

do {
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
catch {
    print("failed to set category")
}

或者你可以使用AudioKit的AKSettings包装器:

AudioKit.start()
do {
    try AKSettings.setSession(category: AKSettings.SessionCategory.playback)
} catch {
    print("failed to set category")
}

根据AVSessionCategory docs,播放类别为

  

播放录制音乐或其他声音的类别   成功使用您的应用程序的核心。

因此,假设用户希望在使用应用程序时覆盖静默模式。