-1
我试图实现身份认证和回放:渐进式下载与SWIFT 3
- 与认证渐进式下载
- 应该可以作为数据块玩自带(urlSession(_会议:URLSession,dataTask:URLSessionDataTask,didReceive数据:数据))
我试过至今:
- 试图与
AVAudioPlayer(data: tempData as Data)
,通过在URL会话接收到的数据数据添加到TempData。 但玩家播放第一组数据并停止。 - 综合使用AVAsset
func initializePlayer() { //audio session for handling interuptions - Done Appdelegate /* 1. Create Asset (Asset represent a single media), AVAsset -> AVAssetTrack 2. Resource properties like metadata, duration etc are loaded from asset, but if taken syncrn will block so use async */ }
let audioPath = Bundle.main.path(forResource: "big_buck_bunny", ofType: "mp4")
let resourceUrl = URL(fileURLWithPath: audioPath!)
let asset = AVAsset(url: resourceUrl)
let playableKey = "playable"
// Load the "playable" property
asset.loadValuesAsynchronously(forKeys: [playableKey]) { [unowned self] in
var error: NSError? = nil
let status = asset.statusOfValue(forKey: playableKey, error: &error)
switch status {
case .loaded:
debugPrint("Sucessfuly loaded")
self.playerItem = AVPlayerItem(asset: asset)
self.playerItem?.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.status), options: [.old, .new], context: &audioPlayerInterfaceViewControllerKVOContext)
self.playerItem?.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.duration), options: [.new, .initial], context: &audioPlayerInterfaceViewControllerKVOContext)
self.player = AVPlayer(playerItem: self.playerItem)
let interval = CMTimeMake(1, 1)
self.timeObserveToken = self.player.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main) { [unowned self] time in
let timeElapsed = Float(CMTimeGetSeconds(time))
UIView.animate(withDuration: 1.5, animations: {
self.durationSlider.setValue(Float(timeElapsed), animated: true)
})
self.startTimeLabel.text = self.createTimeString(time: timeElapsed)
}
break
// Sucessfully loaded. Continue processing.
case .failed:
self.showErrorAlert(errorString: "Failed to load")
debugPrint("failed")
break
// Handle error
case .cancelled:
self.showErrorAlert(errorString: "Failed to load")
debugPrint("Cancelled")
break
// Terminate processing
default:
debugPrint("Error occured")
self.showErrorAlert(errorString: "Failed to load")
break
// Handle all other cases
}
}
}
成功地扮演了本地文件。但是,我们如何将数据部分追加到AVAsset中,以便播放整个数据?
谢谢,最后我们得到了流式url。所以现在使用带有URL选项的AVPlayer – jobsjobs001
那么......现在一切都在为你工作?我对你的评论感到困惑。 –
最初我的客户要求是 1.从认证的URL下载文件,当收到一小块数据时,它需要播放。 (非流式URL),但它似乎并没有很好地工作。 因此创建了一个具有流式传输功能的URL和另一个用于下载的URL。在AVPlayer的URL帮助下,问题得到了解决。谢谢 – jobsjobs001