SwiftUI 上出现 AVAudioPlayer 多次播放

Posted

技术标签:

【中文标题】SwiftUI 上出现 AVAudioPlayer 多次播放【英文标题】:SwiftUI on appear AVAudioPlayer plays multiple times 【发布时间】:2021-07-06 00:34:35 【问题描述】:

我正在尝试在我的应用程序上添加背景音乐的 AVAudioPlayer,我正在主屏幕上启动播放器,尝试在应用程序打开时开始播放但出现意外行为... 它播放并立即不断创建新的播放器并播放这些播放器,因此同时播放数十种相同的声音 音乐的启动和播放功能

if let path = Bundle.main.path(forResource: sound, ofType: type) 
    do 
        backgroundPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: path))
        backgroundPlayer?.play()
     catch 
        print("BACKGROUND MUSIC ERROR")
    

出现对函数
.onAppear 
    audioController.backgroundMusic(sound: "bg", type: "wav")

的调用

编辑:示例代码 ...

import SwiftUI
import AVKit

struct ContentView: View 
    @ObservedObject var audioController = AudioController()

    var body: some View 
         Text("Hello, world!")
             .onAppear 
                 audioController.playBackgroundMusic(sound: "bg", type: "wav")
             
    


class AudioController: ObservableObject 
     var player: AVAudioPlayer?    

     func playBackgroundMusic(sound: String, type: String) 
        if let path = Bundle.main.path(forResource: sound, ofType: type) 
            do 
                player = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: path))
                player?.play()
             catch 
                print("BACKGROUND MUSIC ERROR")
            
        
    

【问题讨论】:

尝试包含minimal reproducible example。这没有足够的代码来调试问题。 【参考方案1】:

你可以试试这样的:

func playBackgroundMusic(sound: String, type: String) 
    if !(player?.isPlaying ?? false) 
        if let path = Bundle.main.path(forResource: sound, ofType: type) 
            do 
                player = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: path))
                player?.play()
             catch 
                print("BACKGROUND MUSIC ERROR")
            
        
    

【讨论】:

我正在尝试做这样的事情,正在苦苦挣扎,感谢分享这种方法【参考方案2】:

发现它实际上只是一个“模拟器”错误,当从 xcode 构建打开应用程序时,它会一遍又一遍地播放声音......但在关闭并重新打开应用程序后,声音会按预期播放。

【讨论】:

以上是关于SwiftUI 上出现 AVAudioPlayer 多次播放的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 的播放/停止按钮

音频未在 SwiftUI 中播放

AVAudioPlayer 错误域=NSOSStatusErrorDomain 代码=-43

AVAudioPlayer 失败并出现错误“无法完成操作。(OSStatus 错误 2003334207。)”

AVAudioPlayer 在 5.0 中工作正常,在 4.0-4.3.5 中出现问题

SwiftUI:只允许导航栏出现在主页/首页