AVPlayer слишком длинный и с задержкой до readyToPlay и воспроизводить музыку сервера в быстрой

Я попытался буферизовать и немедленно воспроизвести аудио remote url с быстрым языком.

но проблема в том, чтобы долго readyToPlay дело и играть.

например, для запуска звукового URL требуется от 12 до 15 секунд.

это мой код:

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

private var playerItemContext = 0

let requiredAssetKeys = [ "playable","hasProtectedContent"]

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)

что в соответствии с этой (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)")
        }

    }
}

и это возвращается журнал:

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

в приведенном выше журнале, readyToPlay 1 4 секунды, чтобы появилось readyToPlay 1 затем 10 секунд, чтобы воспроизвести звук

Скорость работы сервера хороша, и я попытался воспроизвести серверный звук в Android и максимальное время для буферизации и воспроизведения звука составляет около 3 секунд (в приложении Android), но при полной буферизации IOS и воспроизведении звука полностью занимает около 15 секунд!

Спасибо за внимание

Ответ 1

Попытайтесь использовать это:

player.automaticallyWaitsToMinimizeStalling = false

Ответ 2

попытайтесь создать экземпляр вашего avPlayerItem с URL-адресом, а затем выберите другие активы в глобальном потоке, я думаю, что проблемы возникают из-за avPlayer что avPlayer пытается извлечь ресурсы в основной поток пользовательского интерфейса. У меня была такая же проблема, когда я пытался читать параметры субтитров из 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
                }

            })

        })

Ответ 3

У меня такая же проблема с задержкой воспроизведения с AVPlayer. Исходным URL-адресом является мой MAC, кроме моего iPhone в локальной сети. Время задержки составляет от 6 секунд до 12 секунд. https://stackoverflow.com/users/4083045/vlad-hatko @Vlad Hatko ответ помог разрешить его. Большое спасибо. Просто добавление "player.automaticallyWaitsToMinimizeStalling = false" решает проблему задержки как шарм!