web-dev-qa-db-fra.com

AVPlayer trop long et avec du retard pour readyToPlay et écouter de la musique serveur rapidement

j'ai essayé de mettre en mémoire tampon et de lire immédiatement remote url audio avec la langue Swift.

mais le problème est avec le temps long pour readyToPlay cas et jouer.

par exemple, une URL de son prend environ 12 à 15 secondes.

c'est mon code:

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)

que selon cette (ExploringAVFoundation) la documentation a fait cela

et pour gérer ce joueur est prêt à jouer, j'utilise 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)")
        }

    }
}

et ceci est renvoyé log:

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

dans le journal ci-dessus, prenez 4 secondes pour apparaître readyToPlay 1 puis prenez 10 secondes pour lire le son

la vitesse du serveur est bonne et j’ai essayé de jouer le son du serveur en Android et le temps maximum pour la mise en mémoire tampon et la lecture du son est d’environ 3 secondes (dans l’application Android), mais en IOS pour mettre le son en mémoire tampon et jouer totalement, prenez environ 15 secondes!

Merci de votre attention

17
Saeid

Essayez d'utiliser ceci:

player.automaticallyWaitsToMinimizeStalling = false
11

essayez d’instancier votre URL avPlayerItem avec une URL, puis récupérez d’autres ressources dans le fil global, je pense que le problème se pose car avPlayer tente de récupérer des actifs dans le fil principal de l’interface utilisateur essayait de lire les options de sous-titres de avAssetsit prenait 5-6 secondes de plus pour charger le film dans mon lecteur

voici comment j'ai résolu mon problème (dans Swift 2), j'espère que cela aide:

            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
                }

            })

        })
5
Mohy G

J'ai le même problème de lecture différée avec AVPlayer. L'URL source est mon MAC à côté de mon iPhone dans le réseau local sam. Et le délai est compris entre 6 et 12 secondes. https://stackoverflow.com/users/4083045/vlad-hatko @ La réponse de Vlad Hatko a aidé à résoudre le problème. Merci beaucoup. Ajouter simplement "player.automaticallyWaitsToMinimizeStalling = false" résout le problème de délai comme un charme! 

1
RogerHunter