AVAudioPlayer 在播放大量音频文件后停止播放:kAudio_TooManyFilesOpenError
AVAudioPlayer stops playing after playing a lot of audio files: kAudio_TooManyFilesOpenError
我遇到了类似的问题。从他的发现来看,显然每个会话可以播放的文件数量是有限制的。
我尝试了作者 post 提供的方法,但我猜他的问题更多地与同步播放有关。
我想要实现的是,我有大量的 mp3 文件(超过 450 个文件),我试图一次播放每个文件。
代码如下:
internal class NarrationPlayer {
public var player: AVAudioPlayer?
var narrationFile = [URL]()
deinit {
print("deinit NarrationPlayer")
}
internal func initNarration() {
if player != nil {
player = nil
}
}
public func loadNarration(_ filename: String) {
if narrationFile.count >= 1 {
narrationFile.removeLast(1)
}
let url = Bundle.main.url(forResource: filename, withExtension: "mp3")
if (url == nil) {
print("Could not find file: \(filename)")
return
}
do {
narrationFile.append(url!)
var error: NSError? = nil
do {
player = try AVAudioPlayer(contentsOf: narrationFile[narrationFile.count - 1])
} catch let error1 as NSError {
error = error1
player = nil
}
if let player = player {
player.prepareToPlay()
player.volume = 1
player.play()
} else {
print("Could not create audio player: \(error!)")
}
} catch let error as NSError {
print("error retrieving data: \(error)")
}
}
internal func clearNarration() {
print("[clearNarration]")
if let player = player {
player.stop()
}
narrationFile.removeAll()
player = nil
}
}
播放一定数量的文件后,停止播放并出现以下错误:
Could not create audio player: Error Domain=NSOSStatusErrorDomain Code=-42
AVAudioPlayer 工作正常,直到应用程序达到 49 个文件的阈值(或任何阈值),并且问题不取决于实际文件,而是文件总数。我也尝试过 SwiftySound,因为 post 的作者正在使用它,但结果是一样的。
有什么方法可以清理加载文件的内存,或者有人可以推荐我其他加载和播放大量 mp3 文件的方法吗?
我尝试了我在互联网上能找到的一切。
osstatus 帮了大忙。显然,AVAudioPlayer 可以处理的音频文件的默认限制是 256。
为了改变这一点,我创建了一个函数并在 AppDelegate 中调用它,func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?)
func extendAudioFileLimit() {
var limit:rlimit = rlimit()
getrlimit(RLIMIT_NOFILE, &limit)
// change this value to suit your needs
limit.rlim_cur = 500
setrlimit(RLIMIT_NOFILE, &limit)
getrlimit(RLIMIT_NOFILE, &limit)
}
我遇到了类似的问题
我尝试了作者 post 提供的方法,但我猜他的问题更多地与同步播放有关。
我想要实现的是,我有大量的 mp3 文件(超过 450 个文件),我试图一次播放每个文件。
代码如下:
internal class NarrationPlayer {
public var player: AVAudioPlayer?
var narrationFile = [URL]()
deinit {
print("deinit NarrationPlayer")
}
internal func initNarration() {
if player != nil {
player = nil
}
}
public func loadNarration(_ filename: String) {
if narrationFile.count >= 1 {
narrationFile.removeLast(1)
}
let url = Bundle.main.url(forResource: filename, withExtension: "mp3")
if (url == nil) {
print("Could not find file: \(filename)")
return
}
do {
narrationFile.append(url!)
var error: NSError? = nil
do {
player = try AVAudioPlayer(contentsOf: narrationFile[narrationFile.count - 1])
} catch let error1 as NSError {
error = error1
player = nil
}
if let player = player {
player.prepareToPlay()
player.volume = 1
player.play()
} else {
print("Could not create audio player: \(error!)")
}
} catch let error as NSError {
print("error retrieving data: \(error)")
}
}
internal func clearNarration() {
print("[clearNarration]")
if let player = player {
player.stop()
}
narrationFile.removeAll()
player = nil
}
}
播放一定数量的文件后,停止播放并出现以下错误:
Could not create audio player: Error Domain=NSOSStatusErrorDomain Code=-42
AVAudioPlayer 工作正常,直到应用程序达到 49 个文件的阈值(或任何阈值),并且问题不取决于实际文件,而是文件总数。我也尝试过 SwiftySound,因为 post 的作者正在使用它,但结果是一样的。
有什么方法可以清理加载文件的内存,或者有人可以推荐我其他加载和播放大量 mp3 文件的方法吗?
我尝试了我在互联网上能找到的一切。
osstatus 帮了大忙。显然,AVAudioPlayer 可以处理的音频文件的默认限制是 256。
为了改变这一点,我创建了一个函数并在 AppDelegate 中调用它,func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?)
func extendAudioFileLimit() {
var limit:rlimit = rlimit()
getrlimit(RLIMIT_NOFILE, &limit)
// change this value to suit your needs
limit.rlim_cur = 500
setrlimit(RLIMIT_NOFILE, &limit)
getrlimit(RLIMIT_NOFILE, &limit)
}