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
Essayez d'utiliser ceci:
player.automaticallyWaitsToMinimizeStalling = false
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 avAssets
it 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
}
})
})
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!