2015-11-23 9 views
5

sto streaming audio utilizzando AVPlayer. Funziona bene. Ma ora ho bisogno di fare un cursore per spostare l'audio avanti e indietro, come un tipico lettore musicale. Ho usato la funzione seekToTime che funziona benissimo con il file audio locale. Ma quando eseguo il flusso del brano dall'URL del web, la funzione arresta l'audio quando faccio scorrere il cursore in avanti con un intervallo ampio.SeekToTime in AVPlayer interrompe la riproduzione audio in streaming, quando avanti

La mia ipotesi è che il brano sia in fase di download e se sposto lo slider in avanti con un ampio intervallo, è possibile che il sistema non abbia scaricato i pacchetti di dati del brano per quel tempo, quindi interrompe il lettore.

Diciamo che ho appena colpito un pulsante per lo streaming di canzone, ma ora mi muovo subito cursore a 0 alla seconda 100 °. In questo caso il sistema non funziona e arresta il lettore. A causa della mancanza di pacchetti di dati per quel tempo.

Ha qualcuno sa come superare questo problema o c'è qualche altro approccio. Sto usando SWIFT per lo sviluppo. Sono disposto a utilizzare qualsiasi libreria anche se funzionerebbe in modo rapido. Questa è la mia funzione:

func forward() { 
    timeGap = slider.value 
    let preferredTimeScale : Int32 = 1 
    let targetTime : CMTime = CMTimeMake(timeGap, preferredTimeScale) 

    player.seekToTime(targetTime, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero) 

} 

Grazie in anticipo.

risposta

8

Questa risposta è fortemente basato su questo: https://stackoverflow.com/a/7195954/765298. Qualsiasi credito dovrebbe andare lì in quanto si tratta semplicemente di una traduzione rapida.

Hai ragione a pensare che quando si cerca in avanti per una parte che non è stato tamponato ancora il giocatore si ferma. Il problema è che memorizza ancora i dati, ma non si avvia automaticamente quando è pronto. Così, per riformulare la risposta legata alla rapida:

Per impostare i vostri osservatori:

player.currentItem?.addObserver(self, forKeyPath: "playbackBufferEmpty", options: .New, context: nil) 
player.currentItem?.addObserver(self, forKeyPath: "playbackLikelyToKeepUp", options: .New, context: nil) 

nota, che, al fine di essere in grado di osservare i valori, i passati self deve ereditare da NSObject.

E per gestirli:

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 

    guard keyPath != nil else { // a safety precaution 
     super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) 
     return 
    } 

    switch keyPath! { 
     case "playbackBufferEmpty" : 
      if player.currentItem!.playbackBufferEmpty { 
       print("no buffer") 
       // do something here to inform the user that the file is buffering 
      } 

     case "playbackLikelyToKeepUp" : 
      if player.currentItem!.playbackLikelyToKeepUp { 
       self.player.play() 
       // remove the buffering inidcator if you added it 
      } 
    } 
} 

è possibile anche ottenere informazioni sul tempo avaiable va dalla fase di riproduzione AVPlayerItem (si può acces via player.currentItem se non avete creato voi stessi). Ciò consente all'utente di indicare quali parti del file sono pronte per l'uso.

Come sempre si può leggere ancora un po 'nella documentazione: AVPlayerItem e AVPlayer

Per saperne di più sul valore-chiave osservazione (KVO): here

+0

ho notato che quando inizio un video in diretta streaming la il buffer è vuoto fin dall'inizio ('playbackBufferEmpty == true') e il flag playbackBufferEmpty non cambia mai il suo stato in falso. C'è un modo per avviare manualmente il buffering usando AVFoundation? – svrs

Problemi correlati