- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在使用 AVPlayer 从远程源流式传输音乐。我得到 URL,使用一个来创建一个 AVPlayerItem,然后我将其与我的 AVPlayer 实例相关联。我向与播放器相关联的项目添加了一个观察者,以在项目完成播放时进行观察 (AVPlayerItemDidPlayToEndTimeNotification
)。当观察者在项目结束时通知我时,我然后创建一个新的 AVPlayerItem 并重新做一遍。这在 iOS 9.2 的前台和后台运行良好。
问题:因为我已经更新到 iOS 9.3,所以这在后台不起作用。相关代码如下:
var portionToBurffer = Double()
var player = AVPlayer()
func prepareAudioPlayer(songNSURL: NSURL, portionOfSongToBuffer: Double){
self.portionToBuffer = portionOfSongToBuffer
//create AVPlayerItem
let createdItem = AVPlayerItem(URL: songNSURL)
//Associate createdItem with AVPlayer
player = AVPlayer(playerItem: createdItem)
//Add item end observer
NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerItemDidReachEnd:", name: AVPlayerItemDidPlayToEndTimeNotification, object: player.currentItem)
//Use KVO to see how much is loaded
player.currentItem?.addObserver(self, forKeyPath: "loadedTimeRanges", options: .New, context: nil)
}
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
if keyPath == "loadedTimeRanges" {
if let loadedRangeAsNSValueArray = player.currentItem?.loadedTimeRanges {
let loadedRangeAsCMTimeRange = loadedRangeAsNSValueArray[0].CMTimeRangeValue
let endPointLoaded = CMTimeRangeGetEnd(loadedRangeAsCMTimeRange)
let secondsLoaded = CMTimeGetSeconds(endPointLoaded)
print("the endPointLoaded is \(secondsLoaded) and the duration is \(CMTimeGetSeconds((player.currentItem?.duration)!))")
if secondsLoaded >= portionToBuffer {
player.currentItem?.removeObserver(self, forKeyPath: "loadedTimeRanges")
player.play()
}
}
}
}
func playerItemDidReachEnd(notification: NSNotification){
recievedItemEndNotification()
}
func recievedItemEndNotification() {
//register background task
bgTasker.registerBackgroundTask()
if session.playlistSongIndex == session.playlistSongTitles.count-1 {
session.playlistSongIndex = 0
} else {
session.playlistSongIndex += 1
}
prepareAudioPlayer(songURL: session.songURLs[session.playlistSongIndex], portionOfSongToBuffer: 30.00)
}
我设置了断点以查看 player.play()
在后台被调用。当我打印 player.rate
时,它显示为 0.0
。我检查了 AVPlayerItem 的属性 playbackLikelyToKeepUp
,它是 true
。我还确认新 URL 已成功用于创建新 AVPlayerItem 并在应用程序处于后台时与 AVPlayer 相关联。我已经打开音频和 airplay 后台功能,甚至打开了一个有限长度的后台任务(在上面的代码中为 bgTasker.registerBackgroundTask
)。不知道发生了什么。
我找到了 THIS但我不确定它是否有帮助。任何建议都很好,谢谢
最佳答案
When the observer notifies me at the item end, I then create a new AVPlayerItem and do it all over again
但问题是同时播放停止,规则是后台播放只有在你在前台播放并继续在后台播放时才允许。
我建议使用 AVQueuePlayer 而不是 AVPlayer。这将允许您在当前项目仍在播放时将下一个项目加入队列——因此,我们可能希望,这将被视为继续播放。
关于ios - 为什么 AVPlayer 在后台时不继续播放下一首歌曲?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36348332/
我是 Android 编程的新手,我正在尝试制作一个简单的媒体播放器应用程序,该应用程序可以从用户的 SD 卡中提取歌曲并使用户能够播放歌曲。我面临的问题是,当一首歌正在播放时,如果用户点击其他歌曲,
使用 AVAudioPlayer 我们可以使用这种方法循环播放多首歌曲: - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player suc
这是一道系统设计题。 假设我们有一个服务可以在听到歌曲时通知我们。让我们设计一个新服务,它能够返回过去 24 小时内听得最多的前 K 首歌曲。假设我们有大约 10 亿首歌曲和大约 2 亿用户。 将您的
由于我是 Flash CS6 actionscript 3 的新手,有人可以具体地举一个详细的例子,向我解释一下如何向我的播放器添加 2 首歌曲,并且仍然使用当前的播放和暂停按钮来控制它们吗? 非常感
我是一名优秀的程序员,十分优秀!