首页 > 解决方案 > 音频播放器需要一段时间才能加载

问题描述

我有以下代码

         var downloadTask = URLSessionDownloadTask()
        downloadTask = URLSession.shared.downloadTask(with: url, completionHandler: { (url, response, error) in
            self.play(url: url!)
        })
        downloadTask.resume()


 func play (url: URL) {
        do {
            audioPlayer = try AVAudioPlayer(contentsOf: url as URL)
            audioPlayer.prepareToPlay()
            audioPlayer.volume = 1.0
            audioPlayer.enableRate = true
            
            updateCC()
            isReadyToPlay = true
            
            DispatchQueue.main.sync {
                self.remainingTimeLabel.text = self.stringFromTimeInterval(interval: audioPlayer.duration)
                
                self.slider.minimumValue = 0.0
                self.slider.maximumValue = Float(audioPlayer.duration)
                self.slider.setValue(0.0, animated: true)
                
                self.titleLabel.text = self.book.title
                self.artistLabel.text = self.book.author
                self.imageView.sd_setImage(with: URL(string: self.book.image as! String), placeholderImage: nil)
                self.imageView.layer.shadowColor = UIColor.gray.cgColor
                self.imageView.layer.shadowOpacity = 0.3
                self.imageView.layer.shadowOffset = CGSize(width: 4, height: 4)
                self.imageView.layer.shadowRadius = 5
                self.imageView.layer.masksToBounds = false
                
                NetworkActivityIndicatorManager.networkOperationFinished()
                LoadingIndicatorView.hide()
            }
            
        } catch let error as NSError {
            let params = [
                "Error Message": "Audio: \(error.localizedDescription)",
                "Method": "Audio",
                "UserId": MUser.sharedInstance.userId
            ];
            Flurry.logEvent("Error", withParameters: params);
            
        } catch {
            let params = [
                "Error Message": "AVAudio init failed",
                "Method": "Audio",
                "UserId": MUser.sharedInstance.userId
            ];
            Flurry.logEvent("Error", withParameters: params);
        }
    }

当我转换到加载音频播放器的屏幕时,加载/播放音频需要一段时间。有没有办法流式传输音频?或使其加载更快。

标签: iosswift

解决方案


您可能想AVAudioPlayer(contentsOf:)在后台队列中执行。在这里你如何做到这一点:

func play (url: URL) {
       do {
        URLSession.shared.dataTask(with: url) { (data, _, _) in
            self.audioPlayer = try AVAudioPlayer(data: data)
            self.audioPlayer.prepareToPlay()
            //...
        }.resume()
    }
}

推荐阅读