代码之家  ›  专栏  ›  技术社区  ›  ddp

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

  •  2
  • ddp  · 技术社区  · 7 年前

    使用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)
        }
    }
    }
    

    当启动playback with play()方法时,日志和过程中的一切都正常(播放器持续时间、当前时间)。但我听不到音频 在扬声器中 (只是一种风噪)。当我插上耳机并再次点击按钮时,我通常会听到音频。然后,我拔下耳机并点击按钮,我听不到音频(只有风的噪音)。

    我在iPhone 5S上面对这个问题 .

    我愿意 在iPad5上面对这个,我知道 在模拟器上面对这一点。我没有其他设备来复制。

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

    注:我的扬声器与任何其他应用程序正常工作,我检查了音量。未插入耳机时,默认输出设备设置为扬声器。

    1 回复  |  直到 7 年前
        1
  •  9
  •   c_booth    7 年前

    根据 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 ,播放类别为

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

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