gpt4 book ai didi

ios - Swift 5 加载多个 AVAudioPlayer 导致打开文件过多错误

转载 作者:行者123 更新时间:2023-11-29 05:14:33 58 4
gpt4 key购买 nike

我有一个应用程序,大约有 10 个 ViewController,全部连接到一个选项卡栏。在大多数 ViewController 中,有多个按钮会导致播放不同的本地声音文件。所有 ViewController 中的所有内容都可以独立工作。声音文件播放正常。每个 ViewController 都会初始化并加载大约 20 到 70 个声音文件,因此如果用户循环使用所有 10 个 Controller ,应用程序可能会加载大约 500 个声音文件,并且永远不会卸载它们。我正在考虑添加更多选项卡,所以这被证明是一个问题。

对于每个 ViewController,我的代码(简化)如下:


class TrickyWordsViewController: UIViewController {
var musicEffect_hello: AVAudioPlayer = AVAudioPlayer()
// another 50 lines ...
var musicEffect_bye: AVAudioPlayer = AVAudioPlayer()

override func viewDidLoad() {
let musicFile_she = Bundle.main.path(forResource: "hello", ofType: ".m4a")
do {
try musicEffect_hello = AVAudioPlayer(contentsOf: URL (fileURLWithPath: musicFile_hello!))
}
catch { print(error) }
}

@IBAction func playSound(_ sender: Any) {
musicEffect_hello.play()
}
}

但是,当用户点击多个 ViewController 时,应用程序通常会崩溃

try musicEffect_sound = AVAudioPlayer(...

行,包含以下消息:

Error Domain=NSOSStatusErrorDomain Code=-42 "(null)"
Failed to open audio settings path fd. Error: (24) Too many open files

应用程序似乎加载了太多文件。

a) 我应该将所有声音文件的初始化从 viewDidLoad() 移至 playSound() 中吗?声音文件只有在按下按钮时才会被初始化和加载。理论上,每个声音文件都是在 IBAction 函数内按需创建、播放,然后在 IBAction 函数超出范围时销毁。每个 ViewController 中有 20 到 70 个声音文件。每个声音文件只有几秒钟长,大小在 10KB 到 150KB 之间。这会影响性能并延迟播放每个声音吗?

b) 当用户点击标签栏进入每个 ViewController 时,我是否应该计算应用程序中加载的声音文件的数量,以及如果声音文件的数量超过特定数量(似乎是 300 左右)声音文件,我会开始卸载以前的声音文件吗?如果是这样,如何卸载在另一个 ViewController 中加载的声音文件?

c) 在用户导航到另一个 ViewController 后我是否应该卸载声音文件?如果是这样,当用户按下另一个选项卡栏图标时,是否有一个功能可以覆盖?使用标签栏时似乎没有调用 viewDidDisappear() 和 viewWillDisappear() 。

d) 我应该处理调用的内存警告吗?我确实尝试过:

override func didReceiveMemoryWarning() { 
print("didReceiveMemoryWarning...")
super.didReceiveMemoryWarning()
}

但这似乎没有被调用,也没有做任何事情。

有什么想法吗?

最佳答案

也许您没有正确设置 bundle 。如果设置了 Bundle,则不应设置 url 路径。因为它在你的 bundle 中。简单

你应该尝试这样的事情:

func playSound() {
guard let url = Bundle.main.url(forResource: "hello", withExtension: "m4a") else { return }

do {
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
try AVAudioSession.sharedInstance().setActive(true)

/* iOS 11. */
player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)

/* iOS 10 :
player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileTypeMPEGLayer3) */

guard let player = player else { return }

player.play()

} catch let error {
print(error.localizedDescription)
}
}

我真的希望能帮到你=D

关于ios - Swift 5 加载多个 AVAudioPlayer 导致打开文件过多错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59314045/

58 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com