尝试在uitableview中通过AVPlayer播放音乐,但正在播放错误的音乐(错误的音乐正在从Firebase加载)



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

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

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

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

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

之后触发audioPlayer.play()

相关内容

  • 没有找到相关文章

最新更新