从 url 下载时如何播放音频?

Posted

技术标签:

【中文标题】从 url 下载时如何播放音频?【英文标题】:How play audio while downloading from url? 【发布时间】:2016-09-10 12:30:24 【问题描述】:

我需要创建音频播放器。我从 url 获取音频,然后从 url 下载音频然后播放。但是我需要在下载音频的同时播放音频我该怎么做?

这是我的代码如何从 url 播放它:

 func URLSession(session: NSURLSession,
                downloadTask: NSURLSessionDownloadTask,
                didFinishDownloadingToURL location: NSURL)
    do 
        loadingView.hidden=true
        actInd.stopAnimating()
        UIApplication.sharedApplication().networkActivityIndicatorVisible = false
        player=try AVAudioPlayer(contentsOfURL: location)
        player?.delegate=self
        selectedAudio.status=true
        selectedAudio.isDownload=true
        player?.enableRate=true
        switch speedType_Index 
        case 0:
            appDelegate.player?.rate=Float(1)
            break
        case 1:
            appDelegate.player?.rate=Float(1.5)
            break
        case 2:
            appDelegate.player?.rate=Float(2)
            break
        case 3:
            appDelegate.player?.rate=Float(0.5)
            break
        default:
            break
        
        switch playingType_Index 
        case 0:
            appDelegate.player?.numberOfLoops = 0
            break
        case 1:
            appDelegate.player?.numberOfLoops = -1
            break
        default:
            break
        
        player?.volume=Float(volume)
        player?.play()
        self.tableView.reloadData()

    catch let error as NSError
        print(error.localizedDescription)
    


func URLSession(session: NSURLSession,
                downloadTask: NSURLSessionDownloadTask,
                didWriteData bytesWritten: Int64,
                             totalBytesWritten: Int64,
                             totalBytesExpectedToWrite: Int64)
    let progress=Float(totalBytesWritten) / Float(totalBytesExpectedToWrite);
    bite.text=String(format: "%.1f%%",progress * 100)

【问题讨论】:

【参考方案1】:

AVAudioPlayer 不能 - 立即 - 从远程 URL 流式传输内容。

正如documentation for AVAudioPlayer 中所说的

Apple 建议您将此类用于音频播放除非您正在播放从网络流中捕获的音频或需要非常低的 I/O 延迟。

例如,另请参阅this thread,或this answer。

如果您想从远程 URL 进行流式传输,您可以使用 AVPlayer 而不是 AVAudioPlayer。文档可以找到here

要创建一个能够流式传输的播放器,您需要按照这些思路进行操作。

var player = AVPlayer() //declared as a property on your class

if let url = NSURL(string: "https://archive.org/download/testmp3testfile/mpthreetest.mp3") 
    player = AVPlayer(URL: url)
    player.volume = 1.0
    player.play()

希望对你有所帮助。

【讨论】:

我如何处理流式处理,例如在滑块流式中显示 抱歉,我没有任何经验,但也许您可以查看AVPlayerViewController (developer.apple.com/library/ios/documentation/AVFoundation/…),它会为您提供控件,包括进度滑块。否则我确定其他人也遇到过这个问题,所以你应该能够找到解决方案。例如,尝试使用谷歌搜索 AVPlayer audio streaming controls 简单实现player.play()时,是不是需要先下载整个文件再播放?或者它会自动做正确的工作?

以上是关于从 url 下载时如何播放音频?的主要内容,如果未能解决你的问题,请参考以下文章

从远程 url 播放音频文件时如何生成音频频谱?

如何从 Swift 文件管理器播放音频文件?

不和谐.py |从 url 播放音频

如何快速播放下载的音频文件

从 URL 流式传输和下载音频

将 URL 投射到 Chromecast 时,如何向它播放音频?