簡體   English   中英

AVPlayer使用UISlider Swift的進度

[英]AVPlayer progress with UISlider Swift

我試圖使用滑塊控制音頻,並且一切正常,但是當我嘗試使滑塊值等於播放器當前時間時,它崩潰了。
但是,如果我在updateSlider函數內部打印某些內容,它將顯示並正常工作。

override func viewDidLoad() 
{    
    songTitle.text = mainSongTitle
    background.image = image
    mainImageView.image = image    
    downloadFileFromURL(url: URL(string: previewURL)!)             
    var time = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(self.updateSlider), userInfo: nil, repeats: true)  
}    

func downloadFileFromURL(url : URL)
{
    var downloadTask = URLSessionDownloadTask()
    downloadTask = URLSession.shared.downloadTask(with: url, completionHandler: 
    {   
        customURL , response , error in
        self.play(url: customURL!)
        self.slider.maximumValue = Float(player.duration)
    })
    downloadTask.resume()
}

func play(url : URL)
{
    do
    {
        player = try AVAudioPlayer(contentsOf: url)
        player.prepareToPlay()
        player.play()      
    }
    catch 
    {
        print(error)
    }
}

@IBAction func PlayPressed(_ sender: Any) 
{            
    if player.isPlaying
    {
        player.pause()                
    }
    else
    {
        player.play()
    }
}

@IBAction func ChangerTimePlayer(_ sender: Any) 
{
    player.stop()
    player.currentTime = TimeInterval(slider.value)
    player.prepareToPlay()
    player.play()
}

func updateSlider()
{
    slider.value = Float(player.currentTime)
}

也許您應該執行以下操作:

func updateSlider(){
    slider.value = Float(player.currentTime/player.duration)
}

您需要在主線程上調用您的下載完成任務,以安全地使用UIKit (您的滑塊):

DispatchQueue.main.async {
    self.play(url: customURL!)
    self.slider.maximumValue = Float(player.duration)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM