使用 AVAudioPlayer 播放音频文件 swift
Play audio file using AVAudioPlayer swift
我先下载语音信息然后用Avaudioplayer播放
downloadTask = NSURLSession.sharedSession().downloadTaskWithURL(urlStr, completionHandler: { (URL, response, error) -> Void in
self.play(URL!)
})
downloadTask
这很好用,但是如果我在保存我存储在 NSUserDefaults 中的响应 URL 后调用 play(URL) 方法。 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.)
谁能在这方面指导我?
谢谢。
从上面的评论可以看出,问题是下载的文件在完成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 现在无效,你会崩溃。
因此,作为一项额外的安全措施,请在使用前尝试打开 URL 包装:
if let url = urlFromUserDefaults {
play(url)
}
希望对你有所帮助。
你可以简单地这样写...
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)
}
我先下载语音信息然后用Avaudioplayer播放
downloadTask = NSURLSession.sharedSession().downloadTaskWithURL(urlStr, completionHandler: { (URL, response, error) -> Void in
self.play(URL!)
})
downloadTask
这很好用,但是如果我在保存我存储在 NSUserDefaults 中的响应 URL 后调用 play(URL) 方法。 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.)
谁能在这方面指导我?
谢谢。
从上面的评论可以看出,问题是下载的文件在完成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 现在无效,你会崩溃。
因此,作为一项额外的安全措施,请在使用前尝试打开 URL 包装:
if let url = urlFromUserDefaults {
play(url)
}
希望对你有所帮助。
你可以简单地这样写...
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)
}