AVAudioPlayer 不认为它在播放时

Posted

技术标签:

【中文标题】AVAudioPlayer 不认为它在播放时【英文标题】:AVAudioPlayer does not think it is playing when it is 【发布时间】:2020-05-09 01:43:32 【问题描述】:

稍后我调用superPlay 函数开始音频播放我再次调用superPlay 函数停止播放。但这不起作用,因为即使知道声音显然在无限循环中播放,player.isPlaying 也是错误的。我不知道为什么请帮忙!

   func superPlay(timeInterval: TimeInterval, soundName: String) 
        do 
            alarmSound = soundName
            //set up audio session
            try AVAudiosession.sharedInstance().setCategory(.playAndRecord, options: [.defaultToSpeaker, .duckOthers])
            try AVAudioSession.sharedInstance().setActive(true)

            let url = Bundle.main.url(forResource: alarmSound, withExtension: "mp3")

            player = try! AVAudioPlayer(contentsOf: url!)
            player.numberOfLoops = -1
            //Start AVAudioPlayer
            print(timeInterval)
            print(time)
            let playbackDelay = timeInterval  // must be ≥ 0

            if player.isPlaying 
                player.stop()
             else 
                player.play(atTime: player.deviceCurrentTime + playbackDelay) //time is a TimeInterval after which the audio will start
            
        
        catch 
            print(error)
        
    

我现在又花了几天时间调试它。发生的事情是将原始播放分配给特定的 AudioPlayer ID,例如打印是:"Optional(<AVAudioPlayer: 0x600002802280>)" 当我再次调用该函数以停止播放时,为 AVAudioPlayer 分配了不同的 ID,因此它不会发现旧播放器仍在播放,而是在旧声音之上播放新声音。

我不确定如何存储 AVAudioPlayer ID,然后调用该函数以检查商店播放器是否为“.isPlaying”??

【问题讨论】:

如果发生延迟,说明播放器尚未播放。 我最终发现 audioPlayer 对象被保存在调用启动 audioPlayer 播放的函数的文件中。所以我在该文件中添加了停止,现在它可以工作了。 【参考方案1】:

发生这种情况是因为您在停止当前音频之前对其进行了初始化。试试这个方法:-

    func superPlay(timeInterval: TimeInterval, soundName: String) 

        //        If audio is playing already then stop it.
        if let audioPlayer = player 
            if player.isplaying 
                player.stop()
            
        
        //        Initilize audio player object with new sound
        do 
            alarmSound = soundName
            //set up audio session
            try AVAudioSession.sharedInstance().setCategory(.playAndRecord, options: [.defaultToSpeaker, .duckOthers])
            try AVAudioSession.sharedInstance().setActive(true)

            let url = Bundle.main.url(forResource: alarmSound, withExtension: "mp3")

            player = try! AVAudioPlayer(contentsOf: url!)
            player.numberOfLoops = -1
            //Start AVAudioPlayer
            print(timeInterval)
            print(time)
            let playbackDelay = timeInterval  // must be ≥ 0

            player.play(atTime: player.deviceCurrentTime + playbackDelay) //time is a TimeInterval after which the audio will start
        
        catch 
            print(error)
        
    

【讨论】:

非常感谢您的帮助。这并没有解决问题,声音仍在播放,实际上第二个声音开始在第一个声音之上播放。我调试了一下它没有输入“if let audioPlayer.isplaying”条件代码。

以上是关于AVAudioPlayer 不认为它在播放时的主要内容,如果未能解决你的问题,请参考以下文章

如何播放与 AVAudioPlayer 重叠的相同声音?

触发 AVAudioPlayer 以停止所有声音并播放选定的声音,除非单击播放(选定)按钮

AVAudioPlayer认为它不在播放中

如何在 ios5 中播放本地方法的 AVAudioPlayer?

AVAudioPlayer:简单的声音不播放

Swift AVAudioPlayer (Xcode) - 在应用程序包外播放音频文件