gpt4 book ai didi

ios - 停止 AVPlayer 循环

转载 作者:行者123 更新时间:2023-11-28 12:28:50 26 4
gpt4 key购买 nike

我正在开发一个音乐流媒体应用程序,可以从数据库中流式传输音乐。我的代码为数据库中的每首歌曲动态创建按钮,当单击这些按钮时,它们会播放 mp3 文件。但是,我不知道如何暂停音乐,当我不止一次单击按钮时,歌曲会自动播放,因此会同时播放两首歌曲。我已经尝试过 player.pause() 等等,但没有什么能阻止音乐播放/流式传输和循环播放。

import UIKit
import AVKit
import AVFoundation


class ViewController: UIViewController {

var songArray: [Array<String>] = [] //array to contain song names and filepaths

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.

//connect to website
let url = URL(string:"http://cgi.soic.indiana.edu/~team22/SongData.php")
let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
if error != nil
{
print("error")
}
else
{
if let content = data
{
do
{
//download JSON data from php page, display data
let JSON = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as! [[String]]
print(JSON)

//Make buttons with JSON array
var buttonY: CGFloat = 20
for song in JSON {
//add information to array
self.songArray.append(song)
let SongButton = UIButton(frame: CGRect(x: 50, y: buttonY, width: 250, height: 30))
buttonY = buttonY + 50 // 50px spacing

SongButton.layer.cornerRadius = 10 //Edge formatting for buttons

SongButton.backgroundColor = UIColor.darkGray //Color for buttons

SongButton.setTitle("\(song[0])", for: UIControlState.normal) //button title

SongButton.titleLabel?.text = "\(song[0])" // set title label

SongButton.addTarget(self,action: #selector(self.songButtonPressed(_:)), for: UIControlEvents.touchUpInside) //button press / response

self.view.addSubview(SongButton) // adds buttons to view
}
}
catch
{

}
}
}
}
task.resume()
print(songArray)

}


func songButtonPressed(_ sender:UIButton!) { // Streaming function for buttons when pressed
for song in songArray {
if "\(song[0])" == sender.titleLabel?.text { //compare loop element to name of button pressed



let URL = NSURL(string: song[1]) //plug loop element into audio player
let player = AVPlayer(url: URL! as URL)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = self.view.bounds
self.view.layer.addSublayer(playerLayer)
player.play()
}
}
}
}

最佳答案

这里的问题是每次单击按钮时都会创建一个新播放器,而不是保留对它的引用。所以你不能停止/暂停甚至之后访问播放器。

你应该只有一个玩家在 View 中并且一次只能播放一个项目,你可以使用 AVQueuePlayer 管理要播放的项目的“播放列表”这样您就可以按顺序播放项目。

AVQueuePlayer 是 AVPlayer 的子类,因此您仍然可以调用所有常用函数,例如暂停/停止。

你用一组项目初始化它(它可以只是一个开始)然后添加项目。

不管你怎么处理这个,你都不应该有这个

let player = AVPlayer(url: URL! as URL)

在函数中, View 中有一个单独的播放器或AVQueuePlayer,然后您可以稍后引用它。 self.player.pause()

也是如此

关于ios - 停止 AVPlayer 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42651275/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com