2016-11-16 73 views
0

我下載音頻消息首先使用Avaudioplayer使用AVAudioPlayer迅速

downloadTask = NSURLSession.sharedSession().downloadTaskWithURL(urlStr, completionHandler: { (URL, response, error) -> Void in 

      self.play(URL!) 


}) 
downloadTask 

這工作得很好,然後發揮它播放音頻文件,但如果我叫打(URL)方法保存,我已經存儲的響應URL後在NSUserDefaults中。這兩種情況下的URL都是相同的。我已經檢查過了。它是這樣的:

file:///Users/mymac/Library/Developer/CoreSimulator/Devices/X-CD91-XXXXXXX-XXX-XXXXXX/data/Containers/Data/Application/XXXXXXX-XXXX-XXXXXXXXXX/tmp/CFNetworkDownload_InUTA3.tmp

傳遞這個文件的URL:

func play(url : NSURL) { 

     do { 
      player = try AVAudioPlayer(contentsOfURL: url) 
      player.prepareToPlay() 
      player.play() 

     } catch let error as NSError { 
      //self.player = nil 
      print(error.localizedDescription) 

     } catch { 

      print("AVAudioPlayer init failed") 
     } 

    } 

URL路徑是一樣的,但audioPlayer無法播放聲音,它顯示了以下錯誤:

The operation couldn’t be completed. (OSStatus error 2003334207.)

任何人都可以在這方面指導我?

謝謝。

+0

所以......只是想了解你是正確的。如果您使用存儲在UserDefaults中的URL調用'play',它可以工作嗎?如果你在'downloadTaskWithURL'的完成處理程序中直接調用它,它不起作用...正確?或者是周圍的其他方式? – pbodsk

+0

您需要使用正確的文件擴展名將其存儲。 .tmp永遠不能播放,如果您知道文件的類型,請將其重命名爲該專有名稱。然後播放它。 –

+0

@pbodsk使用UserDefaults禁止URL不起作用正確當我在完成塊中調用Play()時它正常工作正確,它在下載後正常工作。 –

回答

0

從上面的評論可以看出,問題是下載的文件在完成downloadTask方法的completionHandler之前未被移動。

因爲它在location參數的description

The location of a temporary file where the server’s response is stored. You must move this file or open it for reading before your completion handler returns. Otherwise, the file is deleted, and the data is lost.

因此,在您的completionHandler您必須將文件移動到您結束completionHandler前控制另一個位置。

這可能也解釋了崩潰。如果「temp」URL被保存到completionHandler中的UserDefaults,那麼當completionHandler完成時,該URL不再有效。所以,當你再後來打電話

play(URL!) 

與現在是無效的力展開的URL,你得到一個崩潰。

因此,作爲額外的安全措施,儘量嘗試使用它之前展開的網址:

if let url = urlFromUserDefaults { 
    play(url) 
} 

希望幫助你。

+0

感謝它的工作。現在我已經完成文檔目錄中的文件完成處理程序並訪問路徑。謝謝 –

+0

不客氣,很高興你在最後工作:) – pbodsk

0

你可以簡單地寫這個...

do 
     { 
      self.player = try AVAudioPlayer(contentsOf:Url) 
      self.player?.numberOfLoops = 0 
      self.player?.prepareToPlay() 
      self.player?.volume = 1.0 
      self.player?.play() 
      self.player?.delegate=self 
     } 
     catch let error as NSError 
     { 
      print(error) 
     }