AVAudioPlayer 播放大量音频文件后停止播放:kAudio_TooManyFilesOpenError

Posted

技术标签:

【中文标题】AVAudioPlayer 播放大量音频文件后停止播放:kAudio_TooManyFilesOpenError【英文标题】:AVAudioPlayer stops playing after playing a lot of audio files: kAudio_TooManyFilesOpenError 【发布时间】:2019-09-05 22:23:08 【问题描述】:

我遇到了here提到的类似问题。显然,根据他的发现,每个会话可以播放的文件数量是有限的。

我尝试了作者发布的方法,但我猜他的问题更多与同时播放有关。

我想要实现的是,我有大量 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
    

播放一定数量的文件后,它会停止播放并出现以下错误:

无法创建音频播放器:错误域=NSOSStatusErrorDomain Code=-42

AVAudioPlayer 工作正常,直到应用程序达到 49 个文件的阈值(或任何阈值),问题不取决于实际文件,而是文件总数。自从那篇文章的作者使用它以来,我也尝试过 SwiftySound,但结果是一样的。

有没有办法清理加载文件的内存,或者谁能推荐我其他方法来加载和播放大量的 mp3 文件?

【问题讨论】:

【参考方案1】:

我尝试了所有可以在互联网上找到的东西。

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)

【讨论】:

以上是关于AVAudioPlayer 播放大量音频文件后停止播放:kAudio_TooManyFilesOpenError的主要内容,如果未能解决你的问题,请参考以下文章

iOS 在特定时间停止音频播放(AVAudioPlayer 结束时间)

AVAudioPlayer 突然不再播放整个音频源

录制音频并保存到文档目录后无法使用 AVAudioPlayer 播放音频文件

在很短的时间后多次播放音频文件?

AVAudioPlayer 没有响应停止命令?

AVAudioPlayer 正在再次播放而不被称为播放。