使用AVAudioPlayer swift播放音频文件

时间:2016-11-16 08:37:47

标签: swift audio swift2 avaudioplayer

我首先下载音频信息然后使用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。)

有人可以在这方面指导我吗?

感谢。

2 个答案:

答案 0 :(得分:0)

从上面的评论中可以看出,问题是在完成completionHandler方法的downloadTask之前未下载下载的文件。

正如location参数

description中所述
  

存储服务器响应的临时文件的位置。在完成处理程序返回之前,您必须移动此文件或将其打开以供阅读。否则,文件将被删除,数据将丢失。

因此,在您的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)
        }