我正在try 使用AVAudioPlayer播放存储在Firebase中的音频文件(未成功).

我收到以下错误消息:创建音频播放器时出错:操作无法完成.(操作系统状态错误2003334207.)

以下是我的音频播放器视图模型的代码:

class AudioPlayerViewModel: ObservableObject {
    
    private var audioPlayer: AVAudioPlayer?
    
    func playAudioFromUrl(from storagePath: String) {
        let storage = Storage.storage()
        let storageRef = storage.reference()
        let audioRef = storageRef.child(storagePath)
        
        audioRef.downloadURL { url, error in
            print(audioRef)
            guard let audioURL = url, error == nil else {
                print("Error fetching audio URL: \(error?.localizedDescription ?? "")")
                return
            }
            
            print("Audio URL: \(audioURL)")
            print("Audio URL String: \(audioURL.absoluteString)")
            
            do {
                self.audioPlayer = try AVAudioPlayer(contentsOf: audioURL)
                self.audioPlayer?.prepareToPlay()
                self.audioPlayer?.play()
            } catch {
                print("Error creating audio player: \(error.localizedDescription)")
                if let nsError = error as NSError? {
                    print("Error code: \(nsError.code)")
                }
            }
        }
    }
    
    func stopAudio() {
        audioPlayer?.stop()
    }
}

和我的视图的代码:

struct PlaybackControlsView: View {
    
    var audioPath: String
    
    @ObservedObject private var audioPlayerVM = AudioPlayerViewModel()
    
    var body: some View {
        
        VStack {
            // Add UI elements here, e.g., play and stop buttons
            Button("Play Audio") {
                audioPlayerVM.playAudioFromUrl(from: "Stories/\(audioPath).mp3")
            }
            .padding()
            
            Button("Stop Audio") {
                audioPlayerVM.stopAudio()
            }
            .padding()
        }
    }
}

#Preview {
    PlaybackControlsView(audioPath: "example")
}

不知道我在哪里做错了.任何帮助都将不胜感激.

推荐答案

您可以try 使用带有url的AVPlayer,而不是 AVAudioPlayer似乎只播放文件或缓冲区中的音频数据.

class AudioPlayerViewModel2: ObservableObject {
    
    private var audioPlayer: AVPlayer?  // <-- here
    
    func playAudioFromUrl(from storagePath: String) {
        let storage = Storage.storage()
        let storageRef = storage.reference()
        let audioRef = storageRef.child(storagePath)

        audioRef.downloadURL { url, error in
            print(audioRef)
            guard let audioURL = url, error == nil else {
                print("Error fetching audio URL: \(error?.localizedDescription ?? "")")
                return
            }

            print("Audio URL: \(audioURL)")
            print("Audio URL String: \(audioURL.absoluteString)")

            // --- here
            let playerItem = AVPlayerItem(url: audioURL)
            self.audioPlayer = AVPlayer(playerItem: playerItem)
            self.audioPlayer?.volume = 10
            self.audioPlayer?.play()
        }
    }
    
    func stopAudio() {
        audioPlayer?.pause()
    }
}

Swift相关问答推荐

在运行时检测蒸汽工人的类型

SwiftData/PersistentModel.swft:540:致命错误:不支持的关系密钥路径ReferenceWritableKeyPath

TimeZone 背后的目的

从 Obj-C 函数返回 swift 类的不兼容指针类型

在 RealityKit 中查找特定模型的 findEntity(named:) 方法的替代方法?

有没有一种方法可以访问封闭实例ObservableObject以从属性包装器中的任何位置调用objectWillChange.send()

如何修改下面的代码,使图像 Select 的顺序与使用快速并发的图像呈现的顺序相匹配?

无法使用 RealityKit 播放 USDZ 动画

iOS16 Bug 键盘在表单解雇 SwiftUI 时打破布局

在 Swift 中为(递归)扩展提供默认实例参数

从 Swift 列表中的行中检索值

单击按钮后的计时器发布者初始化计时器

如何在 SwiftUI 中正确实现Collection 夹?

Vapor - 流利的,将对象保存到 PostgreSQL

Swift在十进制格式中失go 精度

Swift 4 Decodable - 以枚举为键的字典

Swift - 导入我的 swift 类

Swift 2.0 中的 do { } catch 不处理从这里抛出的错误

两个 Date 对象之间的所有日期 (Swift)

UISearchbar TextField 的高度可以修改吗?