我是Swift的新手并使用AVAudioPlayer
制作音频应用。我正在使用一个远程URL mp3文件作为音频,这在静态时可以正常工作。
对于我的用例,我想从JSON数组中提取mp3文件的URL,然后将其传递到AVAudioPlayer
以运行。
如果我将AVAudioPlayer
块移动到ViewDidLoad
并使mp3文件成为静态URL,它将正常运行。
然后,当我将此代码移动到从JSON中提取mp3网址的块中时,我可以{URL}成功print
。但是当我将它传递给我的音频播放器时,会出现问题。这是代码。
override func viewDidLoad() {
super.viewDidLoad()
let url = URL(string: "http://www.example.com/example.json")
URLSession.shared.dataTask(with:url!, completionHandler: {(data, response, error) in
guard let data = data, error == nil else { return }
let json: Any?
do{
json = try JSONSerialization.jsonObject(with: data, options: [])
}
catch{
return
}
guard let data_list = json as? [[String:Any]] else {
return
}
if let foo = data_list.first(where: {$0["episode"] as? String == "Example Preview"}) {
self.audiotest = (foo["audio"] as? String)!
print(self.audiotest) // this prints
// where i'm passing it into the audio player
if let audioUrl = URL(string: self.audiotest) {
// then lets create your document folder url
let documentsDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
// lets create your destination file url
let destinationUrl = documentsDirectoryURL.appendingPathComponent(audioUrl.lastPathComponent)
//let url = Bundle.main.url(forResource: destinationUrl, withExtension: "mp3")!
do {
audioPlayer = try AVAudioPlayer(contentsOf: destinationUrl)
} catch let error {
print(error.localizedDescription)
}
} // end player
// ....
具体来说,点击连接到音频播放器的播放按钮Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
时出现错误IBAction
。最后,该动作函数如下所示:
@IBAction func playPod(_ sender: Any) {
audioPlayer.play()
}
你知道我哪里出错吗?我很困惑为什么我不能打印URL并且在同一个块中得到URL为nil的响应,但这可能是异步的。
答案 0 :(得分:1)
问题是你没有将mp3文件保存到文档并尝试播放
这一行
audioPlayer = try AVAudioPlayer(contentsOf: destinationUrl)
假设该路径中存在已保存的mp3文件,但实际上没有文件即时添加音频扩展名
除了从远程服务器传输音频外,还要使用 AVPlayer 而不是AVAudioPLayer。 AVPlayer Documentation
同时尝试使用从json
解析的网址 var urlStr = (foo["audio"] as? String)!
self.audiotest = urlStr.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)