class StreamPlayer: NSObject {
fileprivate let sessionID = "StreamPlayerAssetDownloadURLSession"
var remoteURL: URL
var session: AVAssetDownloadURLSession!
var task: AVAssetDownloadTask?
var asset: AVURLAsset?
var player: AVPlayer?
var layer: AVPlayerLayer {
return AVPlayerLayer(player: player)
}
weak var delegate: StreamPlayerDelegate?
init(remoteURL: URL) {
self.remoteURL = remoteURL
super.init()
let config = URLSessionConfiguration.background(withIdentifier: sessionID)
session = AVAssetDownloadURLSession(configuration: config, assetDownloadDelegate: self, delegateQueue: .main)
}
func prepareToPlay() {
asset = AVURLAsset(url: remoteURL)
task = session.makeAssetDownloadTask(asset: asset!, assetTitle: "", assetArtworkData: nil, options: nil)
task!.resume()
let playerItem = AVPlayerItem(asset: task!.urlAsset)
player = AVPlayer(playerItem: playerItem)
}
func play() {
player?.play()
}
}
扩展StreamPlayer:AVAssetDownloadDelegate {
func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didFinishDownloadingTo location: URL) {
print(location)
}
func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didLoad timeRange: CMTimeRange, totalTimeRangesLoaded loadedTimeRanges: [NSValue], timeRangeExpectedToLoad: CMTimeRange) {
print(timeRange)
}
}
我读了苹果的guide,并编写了代码。功能非常简单,可以同时播放和下载视频。我初始化播放器,调用prepareToPlay()和play()方法,并将播放器层添加到视图中,然后视频播放顺利。但这两个代表的方法从未调用过,因此我无法保存视频URL或显示缓存的进度。 有人说是因为在模拟器上运行,但是我已经尝试过模拟器或真实设备,结果是一样的。顺便说一句,我已经尝试过" mp4"和" m3u8"格式,两者都可以播放,但不会调用委托方法。有人可以告诉我,我错过了什么吗?非常感谢!