使用 AVKit 和 Swift 播放预先下载的音频文件

问题描述

在我的应用程序中,我在单个视图中有一个简短的音频文件列表。我想下载预下载音频列表中的前 3 个项目,以便用户无需等待下载音频。下载音频文件列表中的前三项并在这文件之间提供无缝事务的好方法是什么?

数据存储在 Firebase Storage 中并使用以下代码获取

@Published var fons = [Fon]()

init(fonId: String) {
    fetchData(fonId: fonId)
}

func fetchData(fonId: String) {
    Firestore.firestore().collection("fons").document(fonId).collection("fons").getDocuments { (snap,err) in
        if let err = err {
            print(err.localizedDescription)
            return
        }
        guard let documents = snap?.documents else { return }
        
        for doc in documents {
            
            let docData = doc.data()
            
            let id = docData["id"] as? String ?? "error"
            let audioURL = docData["audioURL"] as? String ?? "error"
            
            let storage = Storage.storage().reference(forURL: audioURL)

            storage.downloadURL { (url,err) in
                if let err = err {
                    print(err.localizedDescription)
                    return
                }
                                    
                self.fons.append(Fon(audioURL: audioURL,id: id))
            }
        }
    }

此后,一旦单击列表中的项目,我将使用以下代码播放声音。项目列表的呈现方式是用户最有可能点击列表中的前三个项目,这就是为什么我想预先下载这些音频文件,即使没有进入特定的视图。目前,我在结构中定义了 AVPlayer:

@State var player = AVPlayer()

然后我通过传入列表中的 URL 使用以下函数播放音频

func playAudio(url: String) {
    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback)
    }
    catch {
        print(error)
    }
    player = AVPlayer(playerItem: AVPlayerItem(url: URL(string: url)!))
    
    player.play()
    
    let generator = UINotificationFeedbackGenerator()
    generator.notificationOccurred(.success)
    
}

有什么好方法可以提高这个过程的效率?我想过下载列表中的前三项,以创建更并发的感觉。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)