【问题标题】:How can I close an AKAudioFile (or AVAudioFile) that has opened for reading?如何关闭已打开以供阅读的 AKAudioFile(或 AVAudioFile)?
【发布时间】:2021-02-03 02:13:29
【问题描述】:

我在开发的应用程序中遇到问题,最终导致打开太多音频文件。我还没有找到任何关闭文件的方法,所以我尝试将不习惯的文件设置为 nil,但问题仍然存在。

我已将音频文件声明为非可选文件,例如:

let audioFile1 = AKAudioFile!

在初始化它们的方法中,初始化失败(在打开太多文件后)在以下代码块中(audioUrl 是方法的参数之一):

 var audioFileOpt: AKAudioFile?
        
        do {
            audioFileOpt = try AKAudioFile(forReading: audioUrl)
            
        } catch let error {
            print("Error reading url: ", audioUrl)
            print(error.localizedDescription)
        }

这是返回的错误:The operation couldn\U2019t be completed. (com.apple.coreaudio.avfaudio error -42.),这是一个 CoreAudio 错误 (kAudio_TooManyFilesOpenError)。

对于如何解决此问题的任何建议,我将不胜感激。

【问题讨论】:

  • 我希望不持有对对象的引用就足够了。你打开了多少音频文件?在 OS X 上,您可以尝试使用lsof 命令查看进程打开了哪些文件描述符,并验证音频文件是否是主要攻击者。

标签: swift xcode runtime-error core-audio audiokit


【解决方案1】:

虽然这不是关闭文件(我也找不到这样做的方法),但以下解决了您遇到的错误:

您需要增加打开文件的数量以避免 com.apple.coreaudio.avfaudio 错误 -42 - CoreAudio 错误 (kAudio_TooManyFilesOpenError。AVAudioPlayer 可以处理的音频文件的默认限制是 256。这是一个 Objective-C 解决方案。

在 AppDelegate.h 中插入这个

#include <stdio.h>
#include <sys/resource.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

在 AppDelegate.m 中插入这个,didFinishLaunchingWithOptions 方法

struct rlimit limit;
getrlimit(RLIMIT_NOFILE, &limit);
limit.rlim_cur = 5120; // This gives 20x more than default, but change accordingly
setrlimit(RLIMIT_NOFILE, &limit);
getrlimit(RLIMIT_NOFILE, &limit);

【讨论】:

    猜你喜欢
    • 2020-06-17
    • 2012-04-22
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多