2017-01-22 147 views
-1

我试图实现身份认证和回放:渐进式下载与SWIFT 3

  • 与认证渐进式下载
  • 应该可以作为数据块玩自带(urlSession(_会议:URLSession,dataTask:URLSessionDataTask,didReceive数据:数据))

我试过至今:

  • 试图与AVAudioPlayer(data: tempData as Data),通过在URL会话接收到的数据数据添加到TempData。 但玩家播放第一组数据并停止。
  • 综合使用AVAsset
func initializePlayer() { 
     //audio session for handling interuptions - Done Appdelegate 
     /* 
     1. Create Asset (Asset represent a single media), AVAsset ->  AVAssetTrack 
     2. Resource properties like metadata, duration etc are loaded from asset, but if taken syncrn will block so use async 
     */ 

} 
 let audioPath = Bundle.main.path(forResource: "big_buck_bunny", ofType: "mp4") 
     let resourceUrl = URL(fileURLWithPath: audioPath!) 
     let asset = AVAsset(url: resourceUrl) 

     let playableKey = "playable" 


     // Load the "playable" property 

     asset.loadValuesAsynchronously(forKeys: [playableKey]) { [unowned self] in 

      var error: NSError? = nil 

      let status = asset.statusOfValue(forKey: playableKey, error: &error) 

      switch status { 

      case .loaded: 
       debugPrint("Sucessfuly loaded") 
       self.playerItem = AVPlayerItem(asset: asset) 
       self.playerItem?.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.status), options: [.old, .new], context: &audioPlayerInterfaceViewControllerKVOContext) 
       self.playerItem?.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.duration), options: [.new, .initial], context: &audioPlayerInterfaceViewControllerKVOContext) 
       self.player = AVPlayer(playerItem: self.playerItem) 
       let interval = CMTimeMake(1, 1) 
       self.timeObserveToken = self.player.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main) { [unowned self] time in 
        let timeElapsed = Float(CMTimeGetSeconds(time)) 
        UIView.animate(withDuration: 1.5, animations: { 
         self.durationSlider.setValue(Float(timeElapsed), animated: true) 

        }) 
        self.startTimeLabel.text = self.createTimeString(time: timeElapsed) 
       } 

       break 

       // Sucessfully loaded. Continue processing. 

      case .failed: 
       self.showErrorAlert(errorString: "Failed to load") 
       debugPrint("failed") 
       break 

       // Handle error 

      case .cancelled: 
       self.showErrorAlert(errorString: "Failed to load") 
       debugPrint("Cancelled") 
       break 

       // Terminate processing 

      default: 
       debugPrint("Error occured") 
       self.showErrorAlert(errorString: "Failed to load") 
       break 

       // Handle all other cases 

      } 

     } 
    } 

成功地扮演了本地文件。但是,我们如何将数据部分追加到AVAsset中,以便播放整个数据?

回答

0

AVAudioPlayer不适合从网络流式传输音频。您需要阅读音频文件流服务:https://developer.apple.com/reference/audiotoolbox/1669809-audio_file_stream_services

+0

谢谢,最后我们得到了流式url。所以现在使用带有URL选项的AVPlayer – jobsjobs001

+0

那么......现在一切都在为你工作?我对你的评论感到困惑。 –

+0

最初我的客户要求是 1.从认证的URL下载文件,当收到一小块数据时,它需要播放。 (非流式URL),但它似乎并没有很好地工作。 因此创建了一个具有流式传输功能的URL和另一个用于下载的URL。在AVPlayer的URL帮助下,问题得到了解决。谢谢 – jobsjobs001