AVPlayer太长,延迟到readyToPlay并在swift中播放服务器音乐

Sae*_*eid 20 ios avplayer swift avplayeritem

我试图remote url用快速语言缓冲并立即播放音频.

但问题是需要很长时间才能完成 readyToPlay案例和游戏.

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

这是我的代码:

var asset: AVAsset!
var player: AVPlayer!
var playerItem: AVPlayerItem!

private var playerItemContext = 0

let requiredAssetKeys = [ "playable","hasProtectedContent"]
Run Code Online (Sandbox Code Playgroud)
let url = URL(string: "http://sound_link.mp3")!
asset = AVAsset(url: url)

playerItem = AVPlayerItem(asset: asset,
                              automaticallyLoadedAssetKeys: requiredAssetKeys)
playerItem.addObserver(self,
                       forKeyPath: #keyPath(AVPlayerItem.status),
                       options: [.old, .new],
                       context: &playerItemContext)

player = AVPlayer(playerItem: playerItem)
Run Code Online (Sandbox Code Playgroud)

根据这个(ExploringAVFoundation)文档已经完成了

并且对于玩家准备玩家玩的手柄我使用observeValue func:

override func observeValue(forKeyPath keyPath: String?,of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

   guard context == &playerItemContext else {
        super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
        return
    }

    if keyPath == #keyPath(AVPlayerItem.status) {
        let status: AVPlayerItemStatus
        if let statusNumber = change?[.newKey] as? NSNumber {
            status = AVPlayerItemStatus(rawValue: statusNumber.intValue)!
        } else {
            status = .unknown
        }
        // Switch over status value
        switch status {
        case .readyToPlay:
            print("readyToPlay \(status.rawValue)")
            player.play() // here play remote sound
        case .failed:
            print("readyToPlay \(status.rawValue)")
        case .unknown:
            print("failed \(status.rawValue)")
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

这是返回的日志:

2017-02-08 13:44:00.626036 [15144:3747850] [aqme] 255: AQDefaultDevice (1): skipping input stream 0 0 0x0
readyToPlay 1
2017-02-08 13:44:02.631182 [15144:3747850] [aqme] 255: AQDefaultDevice (173): skipping input stream 0 0 0x0
Run Code Online (Sandbox Code Playgroud)

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

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

感谢您的关注

Vla*_*tko 15

试着用这个:

player.automaticallyWaitsToMinimizeStalling = false
Run Code Online (Sandbox Code Playgroud)

  • 我在玩 avpalyerItem 时非常努力。而你,我的朋友是救命稻草.. (2认同)

Moh*_*hyG 5

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

这就是我解决问题的方法(在Swift 2中),我希望它有所帮助:

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
            let avMediaSelectionGroup : AVMediaSelectionGroup? = self.container.player.currentItem?.asset.mediaSelectionGroupForMediaCharacteristic(AVMediaCharacteristicLegible)
            dispatch_async(dispatch_get_main_queue(), {

                if  (avMediaSelectionGroup != nil && (avMediaSelectionGroup!.options.count != 0) && avMediaSelectionGroup?.options[0].valueForKey("title") != nil)
                {
                  // show hide subtitle button
                }

            })

        })
Run Code Online (Sandbox Code Playgroud)