2017-02-02 1 views
0

Voici mon code pour jouer à AVQueueplayer avec une URL Web, mais il faut environ 10-20 secondes pour jouer la première chanson. J'ai 10 chansons, mais pour référence et pour le rendre petit, je viens de garder une chanson ici.AVQueuePlayer prend beaucoup de temps pour jouer la première chanson

arrSongs = ["http://radiotaj.com/music/1/1836.mp3"] 
    let index = 0 
    let strSong = (arrSongs.object(at: index)) as? String 
    playerItem = AVPlayerItem(url: URL(string:strSong!)! 
    let playerItems = [playerItem] 
    player = AVQueuePlayer(items : playerItems as! [AVPlayerItem]) 
    player.play() 

Voici les solutions que je l'ai déjà essayé

  1. Ajout CMTime
  2. Rendre une pause et jouer à nouveau
  3. Il fonctionne parfaitement bien si le fichier est local.

Toute aide est grandement appréciée.

Merci!

+0

http://stackoverflow.com/a/40079765/6656894 renvoyer cette réponse –

+0

ne fonctionne pas, est AVPlayer J'ai besoin pour AVQueuePlayer et que trop dans SWIFT – Aks

+0

si vous avoir une seule URL pour jouer audio alors je vous suggère d'utiliser AVPlayer et dans plusieurs URL puis utiliser A VQueuePlayer –

Répondre

0

Vous pouvez essayer le code suivant, ça marche pour moi. Voici la version sans Alamofire (remplacer yourURL avec le lien réel):

override func viewDidLoad() { 
    super.viewDidLoad() 
    downloadFileFromURL(url: URL(string: yourURL)!) 
} 

func play(url: URL) { 
    do { 
     let songData = try Data(contentsOf: url, options: NSData.ReadingOptions.mappedIfSafe) 
     try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
     try AVAudioSession.sharedInstance().setActive(true) 
     player = try AVAudioPlayer(data: songData, fileTypeHint: AVFileTypeAppleM4A) 
     player!.prepareToPlay() 
     player!.play() 
    } catch { 
     print(error) 
    } 
} 


func downloadFileFromURL(url: URL) { 
    var downloadTask = URLSessionDownloadTask() 
    downloadTask = URLSession.shared.downloadTask(with: url, completionHandler: { 
     customURL, response, error in 

     self.play(url: customURL!) 
    }) 
    downloadTask.resume() 
} 

à l'aide Alamofire est plus rapide, il télécharge essentiellement le fichier dans le dossier Documents et joue d'ici (ne pas oublier d'installer Alamofire et le type en dehors de la classe import Alamofire:..

func play(url: URL) { 
    do { 
     let songData = try Data(contentsOf: url, options: NSData.ReadingOptions.mappedIfSafe) 
     try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
     try AVAudioSession.sharedInstance().setActive(true) 
     player = try AVAudioPlayer(data: songData, fileTypeHint: AVFileTypeAppleM4A) 
     player!.prepareToPlay() 
     player!.play() 
    } catch { 
     print(error) 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    let destination: DownloadRequest.DownloadFileDestination = { _, _ in 
     var documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] 
     documentsURL.appendPathComponent("song."+"mp3") 
     return (documentsURL, [.removePreviousFile]) 
    } 

    Alamofire.download(yourURL, to: destination).response { response in 
     if response.destinationURL != nil { 
      songURL = response.destinationURL! 
      self.play(url: songURL!) 
     } 
    } 
}