首页 > 解决方案 > 来自远程 URL 的音频开始播放需要将近 10 秒

问题描述

我可以从一个 URL 播放声音。但播放音频需要将近 10 秒。

@IBAction func playBtnTap(_ sender: Any) {
    let url = URL(string: muscUrl!)!
    let playerItem = AVPlayerItem(url: url)
    self.player = AVPlayer(playerItem: playerItem)
    self.player!.play()
}

我是 iOS 新手。我不确定,如何下载 URL 音频然后播放该音频?我不希望 10 秒的延迟来播放音频。

更新,我试过了:

override func viewDidLoad() {
    super.viewDidLoad()
    let urlstring = "http://radio.spainmedia.es/wp-content/uploads/2015/12/tailtoddle_lo4.mp3"
    let url = NSURL(string: urlstring)
    print("the url = \(url!)")
    downloadFileFromURL(url: url!)
}

func downloadFileFromURL(url:NSURL){
    var downloadTask:URLSessionDownloadTask
    var request = URLRequest(url:url as URL)
    downloadTask = URLSession.shared.downloadTask(with: request, completionHandler: { (URL, response, error) -> Void in
        self.play(url: URL as! NSURL)
    })

    downloadTask.resume()
}

func play(url:NSURL) {
    print("Playing \(url)")

    do {
        self.player = try AVAudioPlayer(contentsOf: url as URL)
        player!.prepareToPlay()
        player!.volume = 1.0
        player!.play()
    } catch let error as NSError {
        //self.player = nil
        print(error.localizedDescription)
    } catch {
        print("AVAudioPlayer init failed")
    }
}

在控制台中出现错误:

操作无法完成。(OSStatus 错误 1954115647。)

排队self.player = try AVAudioPlayer(contentsOf: url as URL)

标签: iosswiftavplayer

解决方案


您的第一个代码是正确的。当我在我的设备上运行它时,我没有遇到任何明显的延迟。自然,在缓慢的 Internet 连接上,在开始播放之前可能需要一些时间来填充缓冲区;但是您的第二个代码,下载然后播放,因此会更慢。

如果您想知道 AVPlayer 的缓冲区发生了什么,请使用 KVO 跟踪其timeControlStatus.


推荐阅读