【问题标题】:Trying to play music through AVPlayer in a uitableview, but the wrong music is being played (wrong music is being loaded from Firebase)尝试在 uitableview 中通过 AVPlayer 播放音乐,但正在播放错误的音乐(从 Firebase 加载了错误的音乐)
【发布时间】:2021-11-04 13:08:23
【问题描述】:

所以我有一个 UITableViewController,每个单元格内都有一个播放按钮和一个暂停按钮,以便播放音乐。当您按下播放按钮时,它应该播放特定于该单元格的音乐,但是当我运行我的代码时,它会播放随机音频,而不是我专门为它加载的音频。此外,当我滚动浏览 tableview 时,音频停止播放。为什么会这样,我该如何解决?如果按下不同单元格中的播放按钮,我还希望它切换歌曲。

这是我用来加载唯一字符串(由post.mp3 生成)以在我的 AVPlayer 中查找 url 文件的函数:

func loadAudio(post: CompPost, completion: @escaping (URL) -> ())
    {
        let audioRef = Storage.storage().reference().child("cPosts").child(post.uid).child("Audio").child(post.mp3)
        audioRef.downloadURL
        { (url, error) in
            print("mp3filename: " + post.mp3)
            guard error == nil else
            {
                print(error!.localizedDescription)
                return /**alert**/
            }
            self.audioPlayer = AVPlayer(playerItem: AVPlayerItem(url: url!))
            completion(url!)
        }
    }

这是为每个单元格加载唯一 url 的代码:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cPostCell", for: indexPath) as! cPostCell
            
        cell.delegate = self
        cell.index = indexPath
        
        //other code omitted for brevity

        loadAudio(post: compPosts[indexPath.row])
        { (url) in
            print("THIS IS THE URL")
            print(url)
        }
        
        return cell
    }

点击播放按钮的功能:

func playMusic(index: Int)
    {
        audioPlayer.play()
        isPlaying = true
        print("playing now")
    }

【问题讨论】:

    标签: ios swift firebase uitableview avplayer


    【解决方案1】:

    问题是当您触发 audioPlayer.play() 时,您没有将新的 AVPlayerItem 加载到您的 AVPlayer 中,因此当您点击播放按钮时,播放器开始播放您上次加载的 tableViewCell 中加载的项目。尝试将所有 playerItems 保存到带有一些索引的数组中,当用户点击带有索引的按钮时,您会加载音频并在加载时将新的 AVPlayerItem 分配给 AVPlayer

     audioPlayer = AVPlayer(playerItem: yourPlayerItemArray[index]))
    

    然后你触发audioPlayer.play()

    【讨论】:

    • 这个概念奏效了。单击同一单元格的播放按钮两次时出现错误,因此我只创建了一个 URL 数组。好消息,不再是随机播放的歌曲,坏消息,播放的歌曲不正确,数组被洗牌。有什么想法吗?
    • 另外,数组每次的顺序都不一样,但每个单元格仍然播放它分配的歌曲。 ://
    • @EAO123 它的顺序不同,因为 playerCells 被重用,尝试保存项目不是通过附加到数组,而是插入到你的 cellIndexpath.row 的数组位置,或者使用你的 cellIndexpath.row 的字典匹配字典中的键,例如这样的字典:[Int: AVPlayerItem]
    • 我试过了,但它给出了错误。我刚刚更新了将数据保存到数据库的方式,而不是音频文件名,我做了音频 url,所以我不必处理异步 bs,它有效。
    • @EAO123 我很高兴听到它终于奏效了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多