You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AVAudioPlayer播放Firebase音频文件失败求助

解决AVAudioPlayer播放Firebase音频报错OSStatus 2003334207的问题

OSStatus错误2003334207的核心原因是AVAudioPlayer不支持直接加载网络HTTPS URL,它仅能处理本地文件URL或音频二进制数据。你当前用Firebase Storage返回的网络URL初始化AVAudioPlayer,这就是触发报错的根本问题。

以下是两种可行的解决方案:

方案1:下载音频到本地临时目录后播放

先将Firebase存储的音频文件下载到设备临时目录,再用本地URL初始化AVAudioPlayer:

class AudioPlayerViewModel: ObservableObject {
    
    private var audioPlayer: AVAudioPlayer?
    private var localAudioURL: URL? // 保存本地临时文件路径
    
    func playAudioFromUrl(from storagePath: String) {
        let storage = Storage.storage()
        let audioRef = storage.reference().child(storagePath)
        
        // 创建临时文件路径
        let tempDir = FileManager.default.temporaryDirectory
        localAudioURL = tempDir.appendingPathComponent("\(UUID().uuidString).mp3")
        
        // 下载文件到本地
        audioRef.write(toFile: localAudioURL!) { [weak self] url, error in
            guard let self = self, let localUrl = url, error == nil else {
                print("音频下载失败: \(error?.localizedDescription ?? "未知错误")")
                return
            }
            
            do {
                self.audioPlayer = try AVAudioPlayer(contentsOf: localUrl)
                self.audioPlayer?.prepareToPlay()
                self.audioPlayer?.play()
            } catch {
                print("创建音频播放器失败: \(error.localizedDescription)")
            }
        }
    }
    
    func stopAudio() {
        audioPlayer?.stop()
        audioPlayer = nil
        // 可选:停止后删除临时文件释放空间
        if let url = localAudioURL {
            try? FileManager.default.removeItem(at: url)
            localAudioURL = nil
        }
    }
}

方案2:改用AVPlayer支持网络流媒体播放

AVPlayer原生支持网络URL流式播放,无需下载完整文件,更适合在线音频场景:

import AVKit

class AudioPlayerViewModel: ObservableObject {
    
    private var player: AVPlayer?
    private var playerItem: AVPlayerItem?
    
    func playAudioFromUrl(from storagePath: String) {
        let storage = Storage.storage()
        let audioRef = storage.reference().child(storagePath)
        
        audioRef.downloadURL { [weak self] url, error in
            guard let self = self, let audioURL = url, error == nil else {
                print获取音频URL失败: \(error?.localizedDescription ?? "未知错误")")
                return
            }
            
            self.playerItem = AVPlayerItem(url: audioURL)
            self.player = AVPlayer(playerItem: self.playerItem)
            self.player?.play()
        }
    }
    
    func stopAudio() {
        player?.pause()
        player?.seek(to: .zero)
        player = nil
        playerItem = nil
    }
}

额外检查项

  • 确认Firebase Storage中的音频文件格式为AVFoundation支持的类型(如MP3、AAC),可在控制台查看文件元信息。
  • 若需要后台播放音频,需在Info.plist中添加UIBackgroundModes键,并勾选audio选项。
  • 验证Firebase Storage的文件权限设置,确保App具备访问该文件的权限(可临时设置为公开测试,后续再配置Auth授权)。

内容的提问来源于stack exchange,提问作者Booysenberry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 12:48:10