ios – AVPlayer太久了,随时准备播放并迅速播放服务器音乐

前端之家收集整理的这篇文章主要介绍了ios – AVPlayer太久了,随时准备播放并迅速播放服务器音乐前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图缓冲并立即播放远程url音频与 swift语言.

但问题是长时间准备好播放的情况和播放.

例如,声音网址需要大约12到15秒才能运行.

这是我的代码

  1. var asset: AVAsset!
  2. var player: AVPlayer!
  3. var playerItem: AVPlayerItem!
  4.  
  5. private var playerItemContext = 0
  6.  
  7. let requiredAssetKeys = [ "playable","hasProtectedContent"]
  1. let url = URL(string: "http://sound_link.mp3")!
  2. asset = AVAsset(url: url)
  3.  
  4. playerItem = AVPlayerItem(asset: asset,automaticallyLoadedAssetKeys: requiredAssetKeys)
  5. playerItem.addObserver(self,forKeyPath: #keyPath(AVPlayerItem.status),options: [.old,.new],context: &playerItemContext)
  6.  
  7. player = AVPlayer(playerItem: playerItem)

根据这个(ExploringAVFoundation) documentation’ve done that

并且为了处理该播放器准备玩家玩我使用observeValue功能

  1. override func observeValue(forKeyPath keyPath: String?,of object: Any?,change: [NSKeyValueChangeKey : Any]?,context: UnsafeMutableRawPointer?) {
  2.  
  3. guard context == &playerItemContext else {
  4. super.observeValue(forKeyPath: keyPath,of: object,change: change,context: context)
  5. return
  6. }
  7.  
  8. if keyPath == #keyPath(AVPlayerItem.status) {
  9. let status: AVPlayerItemStatus
  10. if let statusNumber = change?[.newKey] as? NSNumber {
  11. status = AVPlayerItemStatus(rawValue: statusNumber.intValue)!
  12. } else {
  13. status = .unknown
  14. }
  15. // Switch over status value
  16. switch status {
  17. case .readyToPlay:
  18. print("readyToPlay \(status.rawValue)")
  19. player.play() // here play remote sound
  20. case .Failed:
  21. print("readyToPlay \(status.rawValue)")
  22. case .unknown:
  23. print("Failed \(status.rawValue)")
  24. }
  25.  
  26. }
  27. }

这是返回的日志:

  1. 2017-02-08 13:44:00.626036 [15144:3747850] [aqme] 255: AQDefaultDevice (1): skipping input stream 0 0 0x0
  2. readyToPlay 1
  3. 2017-02-08 13:44:02.631182 [15144:3747850] [aqme] 255: AQDefaultDevice (173): skipping input stream 0 0 0x0

在上面的日志中,需要4秒钟才能显示readyToPlay 1,然后10秒钟播放声音

服务器速度是好的,我试图在Android中播放服务器声音,最大时间缓冲播放声音约为3秒(在Android应用程序中),但在IOS缓冲和播放声音完全,大约需要15秒!

感谢您的关注

解决方法

尝试使用URL实例化您的avPlayerItem,然后在全局线程中获取其他资源,我认为问题发生是因为avPlayer正在尝试在主UI线程中获取资源
当我尝试从avAssets阅读字幕选项时,我遇到了同样的问题
在我的播放器中加载电影花了5-6秒

这是我如何解决我的问题(在Swift 2中),我希望它有助于:

  1. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),{
  2. let avMediaSelectionGroup : AVMediaSelectionGroup? = self.container.player.currentItem?.asset.mediaSelectionGroupForMediaCharacteristic(AVMediaCharacteristicLegible)
  3. dispatch_async(dispatch_get_main_queue(),{
  4.  
  5. if (avMediaSelectionGroup != nil && (avMediaSelectionGroup!.options.count != 0) && avMediaSelectionGroup?.options[0].valueForKey("title") != nil)
  6. {
  7. // show hide subtitle button
  8. }
  9.  
  10. })
  11.  
  12. })

猜你在找的iOS相关文章