Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios AVAudioPlayer在播放大量音频文件后停止播放:kAudio_TooManyFilesOpenError_Ios_Swift_Audio_Avaudioplayer - Fatal编程技术网

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

Ios AVAudioPlayer在播放大量音频文件后停止播放:kAudio_TooManyFilesOpenError,ios,swift,audio,avaudioplayer,Ios,Swift,Audio,Avaudioplayer,我遇到了前面提到的类似问题。显然,从他的发现来看,每个会话可以播放多少文件是有限制的 我尝试了作者发布的方法,但我想他的问题更多地与同步播放有关 我试图实现的是,我有大量的mp3文件(超过450个文件),我试图一次播放每个文件 代码如下: internal class NarrationPlayer { public var player: AVAudioPlayer? var narrationFile = [URL]() deinit { print

我遇到了前面提到的类似问题。显然,从他的发现来看,每个会话可以播放多少文件是有限制的

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

我试图实现的是,我有大量的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代码=-42

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


有什么方法可以清除加载文件的内存,或者有人能推荐我其他方法来加载和播放大量mp3文件吗?

我尝试了在互联网上找到的所有方法

这是一个很大的帮助。显然,AVAudioPlayer可以处理的音频文件的默认限制是256

为了改变这一点,我创建了一个函数,并在AppDelegate、func应用程序中调用了它(application:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionKey: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)
}