首页 > 解决方案 > 使用 AVKit 和 Swift 播放预下载的音频文件

问题描述

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

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

@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)
    
}

有什么好方法可以让这个过程更有效率?我考虑下载列表中的前三个项目,以创造一种更同步的感觉。

标签: google-cloud-firestoreswiftuiavfoundationfirebase-storageavkit

解决方案


推荐阅读