下载时播放音频而不下载文件两次?

时间:2015-09-09 15:49:14

标签: ios objective-c

我想编写一个iOS应用程序,只要有足够的数据同时继续下载,就会播放音频文件。您可以在下载完成后(Using NSURLProtocol to implement play while downloading for AVPlayer on iOS)下载和播放,也可以连续播放,而无需保存文件(Playing audio file while I download it)。有没有办法下载和播放同时没有下载文件的两个副本?

2 个答案:

答案 0 :(得分:4)

您可以在Package: Scripts Type: Package Title: What the package does (short line) Version: 0.0.1 Date: 2012-11-12 Author: Who wrote it Maintainer: Who to complain to <yourfault@somewhere.net> Description: More about what it does (maybe more than one line) License: GPL AVAssetResourceLoader

的帮助下完成此操作

以下是教程的链接

http://leshkoapps.com/wordpress/audio-streaming-and-caching-in-ios-using-avassetresourceloader-and-avplayer/

这是Github的回购

https://github.com/leshkoapps/AVAssetResourceLoader

答案 1 :(得分:0)

您可以在此处使用以下功能,而无需下载(流式传输)

import AVFoundation

var progressTimer:Timer?
{
    willSet {
        progressTimer?.invalidate()
    }
}

var playerStream: AVPlayer?
var playerItem: AVPlayerItem?

func playerStream(urlStream : String)
{
    if let playerStream = playerStream
    {
        if playerStream.isPlaying
        {
            stopProgressTimer()
            playerStream.pause()

        }
        else
        {

            startProgressTimer()
            playerStream.play()
        }

    }
    else
    {
        if let urlStr = urlStream.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
        {

            if let TempURL = URL.init(string: urlStr)
            {
                playerItem  = AVPlayerItem(url: TempURL)
                playerStream = AVPlayer(playerItem: playerItem)
                NotificationCenter.default.addObserver(self, selector: #selector(playerItemDidPlayToEndTime), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerItem)
            }

        }

    }

}

func playerItemDidPlayToEndTime() {

     stopProgressTimer()
     self.playProgressView.progress = 0.0
    if let playerStream = self.playerStream
    {
        playerStream.replaceCurrentItem(with: playerItem)
        playerStream.seek(to: kCMTimeZero)
       // playerStream.seek(to: .zero) swift 4.0
    }


}
func stopProgressTimer() {
    progressTimer?.invalidate()
    progressTimer = nil
}
func startProgressTimer()
{
    if #available(iOS 10.0, *) {

        progressTimer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true){_ in

            self.updateProgressTimer()
        }
    }
    else {

        progressTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.updateProgressTimer), userInfo: nil, repeats: true)
    }
}


@objc func updateProgressTimer()
{
    if let playerItem = playerItem
    {
        if let pa = playerStream
        {
            let floatTime = Float(CMTimeGetSeconds(pa.currentTime()))
            let floatTimeDu = Float(CMTimeGetSeconds(playerItem.duration))

            playProgressView.progress = Double(floatTime / floatTimeDu)
        }
    }
}