ios - Swift 中的音频播放未恢复到原始音量

标签 ios swift avaudioplayer avaudiosession

我正在尝试播放“叮”声来提醒用户发生了事件。 “叮”播放,但背景音频(在本例中为默认 Music.App)在播放“叮”后未恢复到其原始音量。但是,关闭应用程序后它将恢复正常音量。这是我的:

这是我设置 Audio Session 类别的地方:

     public override func viewDidLoad() {
            super.viewDidLoad()
            do {
                try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, withOptions: AVAudioSessionCategoryOptions.DuckOthers)
                //refer to this link for swift's sound reference: https://developer.apple.com/ios/human-interface-guidelines/interaction/audio/
            } catch {
                print("unable to load audio session")
            }
            ....
     }

这是我调用函数的地方:

if(!currentTimer.launchedNotification){
            playFinishedSound()
            AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate)) //handles phone vibration
            audioPlayerDidFinishPlaying(audioPlayer!, successfully: true)

        }

这是我的私有(private)函数:

private func playFinishedSound(){
        if let pathResource = NSBundle.mainBundle().pathForResource("Ding", ofType: "wav"){
            let soundToPlay = NSURL(fileURLWithPath: pathResource)
            do {
                audioPlayer = try AVAudioPlayer(contentsOfURL: soundToPlay)
                if(audioPlayer!.prepareToPlay()){
                    print("preparation success")
                    audioPlayer!.delegate = self
                    setAVAudioSession()
                    if(audioPlayer!.play()){
                        print("Sound play success")
                    }else{
                        print("Sound file could not be played")
                    }
                }else{
                    print("preparation failure")
                }

            }catch{
                print("Sound file could not be found")
            }
        }else{
            print("path not found")
        }
    }

这里是我设置 Audio Session 的地方:

private func setAVAudioSession() {
        let session:AVAudioSession = AVAudioSession.sharedInstance()
        do{
            try session.setActive(true)
            print("session is active")
        }catch{
            print("could not make session active")
        }
    }

这是 AVAudioPlayerDelegate 协议(protocol)的委托(delegate)方法:

public func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) {
        do {
            player.stop()
            try AVAudioSession.sharedInstance().setActive(false, withOptions: AVAudioSessionSetActiveOptions.NotifyOthersOnDeactivation)
            player.prepareToPlay()
            print("Session stopped successfully")
        }catch{
            print("Could not end audio session")
        }
    }

同样,问题是如果在后台播放音乐,音乐音量会变小,但当 Audio Session 处于非事件状态时,音乐音量不会恢复正常。

最佳答案

经过试验,我的解决方案运行良好。这里唯一需要注意的是,如果您尝试快速连续播放倒计时声音或其他声音,设备播放声音会出现延迟,因此可能需要一些线程管理或其他方法来解决该问题。欢迎对此解决方案进行任何改进。

private let session = AVAudioSession.sharedInstance()

private func setSession(isActive: Bool) {
    if isActive {
        try! session.setCategory(AVAudioSession.Category.playback, options: AVAudioSession.CategoryOptions.duckOthers)
    } else {
        try! session.setCategory(AVAudioSession.Category.ambient, options: AVAudioSession.CategoryOptions.mixWithOthers)
    }
    try! self.session.setActive(isActive, options: .notifyOthersOnDeactivation)
}

当您要播放、暂停或停止音频时,调用此方法。

  1. 将类别设置为 playback 并将选项设置为 duckOthers 确保您的播放声音最大,其他音频的音量降低。

  2. 将类别设置为 ambient 并将选项设置为 mixWithOthers 确保您的播放与其他音频类型相同,这会导致音频增加回原来的音量在播放之前。

  3. 最后将音频状态设置为事件或非事件(setActive)

警告:

使用 try! 当然不是推荐的做法,我提供这段代码是为了让您的工作顺利进行。在适用的情况下实现最佳安全实践。

关于ios - Swift 中的音频播放未恢复到原始音量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38836412/

相关文章:

iphone - 如何指定 AVAudioPlayer 中循环之间的时间?

类似viewDidLoad()的iOS函数

ios - 在 GADBannerView 内调整图像大小

ios - 将所有捆绑资源复制到 Documents 目录内的单独文件夹中

ios - 如何在 UITextView 中像 block 引号一样格式化文本

ios - 无法在 Playgrounds 中使用 Alamofire 查找符号错误

ios - 麦克风输入到 iOS 中的扬声器输出?

ios - 在 Xcode 描述长度太长时上传应用程序时 iTunes Store 操作失败

ios - 将纬度和经度坐标传递到第二个 View Controller

ios - 有没有办法使用 AVAudioPlayer 倒带音乐?