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

ddp*_*ddp 2 core-audio audiounit audiokit

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

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)
    }
}
}
Run Code Online (Sandbox Code Playgroud)

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

我在iPhone 5S上面对此问题.

我在iPad5上没有面对这个问题,我在模拟器上没有面对这个问题.我没有其他设备尝试重现.

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

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

c_b*_*oth 7

根据配置音频会话指南,默认情况下,AVAudioSessionCategory设置为

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

由于iPad和模拟器没有这个开关,它们总是会播放到扬声器,但是在硬件iPhone的情况下,它们只能在静音模式下播放耳机而不播放扬声器,除非会话类别被更改.

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

do {
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
catch {
    print("failed to set category")
}
Run Code Online (Sandbox Code Playgroud)

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

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

根据AVSessionCategory文档,播放类别是

用于播放录制音乐或其他声音的类别,这些声音对于成功使用您的应用至关重要.

因此,它将假定用户希望在使用应用程序时覆盖静默模式.