即使 iPhone 处于静音状态,AVAudioPlayer 仍在播放环境声音

Posted

技术标签:

【中文标题】即使 iPhone 处于静音状态,AVAudioPlayer 仍在播放环境声音【英文标题】:AVAudioPlayer still playing ambient sound even when iPhone is on silent 【发布时间】:2021-06-22 05:56:43 【问题描述】:

我有一个可观察对象,它为我的应用程序提供功能,让我可以在需要时(重复)播放相同的铃声。

问题是它在 iPhone 处于静音状态时播放,我无法停止它。我尽可能多地在 Google 上搜索,发现人们建议将音频类别设置为“环境”,但是,这似乎仍然无法解决我的问题。

这是我的 Chime 课程:

class Chime: ObservableObject 
    
    let chimeSoundUrl = URL(fileURLWithPath: Bundle.main.path(forResource: "chime.wav", ofType: nil)!)
    
    private var audioPlayer: AVAudioPlayer?
    
    init() 
        let audiosession = AVAudioSession.sharedInstance()

        do 
            try audioSession.setCategory(.ambient, options: .duckOthers)
            try audioSession.setActive(true)
         catch 
            print("Failed to activate audio session: \(error.localizedDescription)")
        

        do 
            audioPlayer = try AVAudioPlayer(contentsOf: chimeSoundUrl)
            audioPlayer?.prepareToPlay()
            audioPlayer?.volume = 1.0
         catch 
            print("Failed to prepare audio player: \(error.localizedDescription)")
        
    
    
    func play() 
        audioPlayer?.currentTime = 0
        audioPlayer?.play()
    

我尝试在 Chime 类的 init 函数中设置音频类别,在应用程序的顶层在播放铃声的视图的 onAppear 中,以及在 Chime 类的“播放”方法中(这实际上导致应用性能问题)- 这些似乎都不起作用。

非常感谢任何帮助。谢谢

【问题讨论】:

【参考方案1】:

不确定您是否在真实设备上尝试过,但这是我发现的:

使用模拟器,如果在打开应用程序时静音开关已经处于活动状态,它的行为就好像它没有处于静音状态并播放声音。如果在打开应用后激活静音开关,它会按预期工作。

当我尝试在真实设备上运行它时,它在两种情况下都能正常运行,所以可能是模拟器中的错误

如果您只是播放简短的警报类型的声音,您可能应该使用Audio Services 而不是 AVAudioPlayer。可能看起来像这样:

class Chime 

    let chimeSoundUrl = URL(fileURLWithPath: Bundle.main.path(forResource: "alert.mp3", ofType: nil)!)
    let chimeSoundID: SystemSoundID

    init()
        var soundID:SystemSoundID = 0
        AudioServicesCreateSystemSoundID(chimeSoundUrl as CFURL, &soundID)
        chimeSoundID = soundID
    

    func play()
        AudioServicesPlaySystemSound(chimeSoundID)
    
    

在模拟器中运行上述程序,静音开关没有任何效果,声音总是在播放,在真实设备上它按预期工作。

【讨论】:

我尝试实施您使用音频服务的建议。当视图结构调用“play()”方法时,我现在无法听到铃声,但是,如果它在 Chime 类的“init()”方法中播放,我确实听到了铃声,这很奇怪。跨度> 我已将范围缩小为从视图的*** VStack onChange 处理程序调用 chime.play(),当我从那里调用 chime.play() 时,没有声音发生,但是,如果我移动 chime .play() 到 onAppear 处理程序,声音播放!为什么 onAppear 有效而 onChange 无效?

以上是关于即使 iPhone 处于静音状态,AVAudioPlayer 仍在播放环境声音的主要内容,如果未能解决你的问题,请参考以下文章

即使手机处于静音或振动状态,如何让视频播放声音? [复制]

即使在静音模式下也能在 iPhone 上播放声音 [重复]

iPhone静音时的UILocalNotification警报

iphone,即使在静音或静音模式下如何播放声音?

即使在准备销售后,我的 iPhone 应用程序仍处于“测试广告”状态

在 iOS 5 中检测 iPhone 静音开关