ios - 使用 AVAudioPlayer 无法通过 Swift 4 播放 .m4a
问题描述
我使用 Alamofire 下载 iTunes 搜索 Api 的试用音乐。
当我下载完成后,我想播放音乐。
我尝试修复它,但它也没有声音可以播放。
如何解决这个问题呢?
谢谢。
import UIKit
import AVFoundation
import Alamofire
import CryptoSwift
class FirstViewController: UIViewController {
let urlString = "https://audio-ssl.itunes.apple.com/apple-assets-us-std-000001/AudioPreview18/v4/9c/db/54/9cdb54b3-5c52-3063-b1ad-abe42955edb5/mzaf_520282131402737225.plus.aac.p.m4a"
override func viewDidLoad() {
super.viewDidLoad()
let destination: DownloadRequest.DownloadFileDestination = { _, _ in
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let fileName = self.urlString.md5()
let fileURL = documentsURL.appendingPathComponent("\(fileName).m4a")
return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
}
Alamofire.download(urlString, to: destination).response { response in
if response.error == nil {
var audioPlayer: AVAudioPlayer!
do {
audioPlayer = try AVAudioPlayer(contentsOf: response.destinationURL!)
audioPlayer.prepareToPlay()
audioPlayer.play()
} catch {
print("Error:", error.localizedDescription)
}
}
}
}
}
解决方案
这个问题是由audioPlayer
一个局部变量引起的,因此当你离开完成闭包的范围时它会被释放。因为audioPlayer
没有保留在其他任何地方,所以当您离开闭包的范围时,audioPlayer
引用计数等于0
,这会导致 ARC 释放它。
此外,您使用强制展开运算符 - !
- 很多,即:
1)不正确
2)不安全
使用if let
构造或guard
语句
您需要将播放器存储为FirstViewController
类的实例变量。
class FirstViewController: UIViewController {
let urlString = "https://audio-ssl.itunes.apple.com/apple-assets-us-std-000001/AudioPreview18/v4/9c/db/54/9cdb54b3-5c52-3063-b1ad-abe42955edb5/mzaf_520282131402737225.plus.aac.p.m4a"
var audioPlayer : AVAudioPlayer?
override func viewDidLoad() {
super.viewDidLoad()
// (...)
Alamofire.download(urlString, to: destination).response { [weak self] (response) in
if response.error == nil {
guard let url = response.destinationURL else { return }
do {
self?.audioPlayer = try AVAudioPlayer(contentsOf: url)
self?.audioPlayer?.prepareToPlay()
self?.audioPlayer?.play()
} catch {
print("Error:", error.localizedDescription)
}
}
}
}
}
推荐阅读
- python - Python - 给出一维数组。数组必须至少是二维的
- python - 在 Python 中对数据框的所有先前值求和
- python - ModuleNotFoundError:即使模块存在,也没有名为“请求”的模块
- c# - 应用下载的纹理并通过 EncodeToPNG 转换回 PNG 后,PNG 文件在 Unity 中增长
- java - 持久化实体时出错:FROM 中的子查询必须有别名
- python - 如何在 beautifulsoup 中选择一个属性不知道该属性值的标签?
- java - Java 的 gradle 构建问题:10.0.2,Gradle:4.7
- powershell - Get-AzureDeployment 未返回预期结果
- flask - Flask requests.args 在新的应用程序路由中保持变量
- version - 在运行 Web 应用程序中动态获取 Vaadin Flow 的版本