我首先下载音频信息然后使用Avaudioplayer播放
downloadTask = NSURLSession.sharedSession().downloadTaskWithURL(urlStr, completionHandler: { (URL, response, error) -> Void in
self.play(URL!)
})
downloadTask
这样可以正常工作,但是如果在保存我存储在NSUserDefaults中的响应URL后调用play(URL)方法。两种情况下的URL都相同。我检查了一下。它的内容如下:
文件:///Users/mymac/Library/Developer/CoreSimulator/Devices/X-CD91-XXXXXXX-XXX-XXXXXX/data/Containers/Data/Application/XXXXXXX-XXXX-XXXXXXXXXX/tmp/CFNetworkDownload_InUTA3.tmp < / p>
将此文件网址传递给:
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无法播放声音,显示以下错误:
无法完成操作。 (OSStatus错误2003334207。)
有人可以在这方面指导我吗?
感谢。
答案 0 :(得分:0)
从上面的评论中可以看出,问题是在完成completionHandler
方法的downloadTask
之前未下载下载的文件。
正如location
参数
存储服务器响应的临时文件的位置。在完成处理程序返回之前,您必须移动此文件或将其打开以供阅读。否则,文件将被删除,数据将丢失。
因此,在您的completionHandler
中,您必须将文件移至您控制的其他位置,然后才能结束completionHandler
。
这也可能解释了崩溃。如果“{temp”网址已保存到completionHandler
中的UserDefaults,则completionHandler
完成后该网址将不再有效。所以当你稍后再打电话
play(URL!)
使用强制解包的URL现在无效,您将崩溃。
因此,作为额外的安全措施,请尝试在尝试使用之前解开URL:
if let url = urlFromUserDefaults {
play(url)
}
希望对你有所帮助。
答案 1 :(得分: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)
}