AVAudioSession 音频调光错误:停用正在运行 I/O 的音频会话

Agg*_*sor 5 audio xcode avaudioplayer avaudiosession swift

我正在播放几种声音,每个声音都会使背景音频变暗。完成后,我恢复背景音频。每次播放其中一个音频文件时,背景都会变暗(根据需要)。当最后一个音频完成播放时,背景音频将恢复(也需要)。但是,大约 5 秒后,它会抛出此错误并再次使音频变暗(这不是我想要的,因为现在所有声音都已完成)。

错误:[0x19c9af310] AVAudioSession.mm:646:-[AVAudioSession setActive:withOptions:error:]:停用正在运行 I/O 的音频会话。在停用音频会话之前,应停止或暂停所有 I/O。

据我所知,我正在停止并删除所有音频。

我在这里找到了 1 个帖子:

iOS8 AVAudioSession setActive 错误

但该解决方案对我不起作用。这是我的音频播放器类。如果你能告诉我可能会发生什么,我将不胜感激。

import Foundation
import AVFoundation

private var _singleton:O_Audio? = O_Audio()
private var _avAudioPlayers:Array<AVAudioPlayer> = []

//Manages dimming and resuming background audio
class O_Audio:NSObject, AVAudioPlayerDelegate
{
    class var SINGLETON:O_Audio
    {
        if(_singleton == nil)
        {
            _singleton = O_Audio()
        }
        return _singleton!
    }

    class func dimBackgroundAudio()
    {
        AVAudioSession.sharedInstance().setActive(true, error: nil)
    }

    class func restoreBackgroundAudio()
    {
        AVAudioSession.sharedInstance().setActive(false, error: nil)
    }

    class func playSound(path:String)
    {
        var sound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(path, ofType: "m4a")!)
        var audioPlayer = AVAudioPlayer(contentsOfURL: sound, error: nil)
        _avAudioPlayers.append(audioPlayer)
        audioPlayer.delegate = O_Audio.SINGLETON
        audioPlayer.prepareToPlay()
        audioPlayer.play()
    }

    func audioPlayerDidFinishPlaying(player: AVAudioPlayer!, successfully flag: Bool)
    {
        //this was from the 1 stack post I found but these
        //two lines do not solve my problem
        player.stop()
        player.prepareToPlay()

        var index:Int!
        for i in 0..._avAudioPlayers.count - 1
        {
            if(_avAudioPlayers[i] == player)
            {
                index = i
                break
            }
        }

        _avAudioPlayers.removeAtIndex(index)

        if(_avAudioPlayers.count == 0)
        {
            O_Audio.restoreBackgroundAudio()
        }
    }

    func audioPlayerDecodeErrorDidOccur(player: AVAudioPlayer!, error: NSError!)
    {
        println("error")
    }
}
Run Code Online (Sandbox Code Playgroud)

重要更新

所以我找到了我认为问题的粗略原因。我们的应用程序建立在 Cordova 之上。所以我们有很多 Safari(浏览器)调用。每当我们播放视频(通过 Safari 播放)时,就会发生此错误。似乎 Safari 以某种方式使音频变暗并保持运行的 I/O 线程。

Agg*_*sor 1

问题是 MPMoviePlayerController 对象正在播放。事实上任何 AVPlayerItem 都会导致这种情况。如果您播放电影并尝试调暗音频,您将收到此错误。

目前,在 iOS 上播放的任何电影都具有不可变的音轨(即使电影文件上没有音频)。这将永久导致鸭子问题(它是源代码中的错误)。我尝试了很多解决方法,但没有任何效果。我确信这是 Xcode 源代码错误。