- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试将 AVAudioUnitEffect
连接到 AVAudioEngine
的实例,如下所示:
required init(inputFormat: AVAudioFormat, outputFormat: AVAudioFormat, andAVAudioEngine avAudioEngine:AVAudioEngine) {
self.inputFormat = inputFormat
self.outputFormat = outputFormat
self.avAudioEngine = avAudioEngine
self.myAudioUnit = MyAVAudioUnit()
super.init()
avAudioEngine.attach(myAudioUnit)
avAudioEngine.connect(myAudioUnit, to: avAudioEngine.outputNode, format: self.inputFormat)
}
总体类只是 NSObject
的子类,MyAudioUnit
是 AVAudioUnitEffect
的子类。
在看似随机的时间,此初始化程序的最后一行(调用 connect
)将抛出一个 SIGABRT 并出现以下错误:com.apple.coreaudio.avfaudio: error -10875
相当于 kAudioUnitErr_FailedInitialization
。
任何人都可以阐明这个错误以及这里可能发生的事情吗?我想也许 MyAVAudioUnit
的初始化器失败了,但它的内部初始化器 (init(audioComponentDescription: AudioComponentDescription)
) 没有抛出任何错误并且有一个非可选的返回类型.有没有其他人遇到过这个特定错误?
更新
下面是inputFormat
的初始化:
guard let stereoFormat = AVAudioFormat(commonFormat: .pcmFormatFloat32,
sampleRate: 44100,
channels: 2,
interleaved: false) else {
return
}
let numChannels = UInt32(10)
guard let multiChannelLayout = AVAudioChannelLayout(layoutTag: kAudioChannelLayoutTag_Unknown | numChannels) else {
return
}
inputFormat = AVAudioFormat(commonFormat: stereoFormat.commonFormat,
sampleRate: stereoFormat.sampleRate,
interleaved: stereoFormat.isInterleaved,
channelLayout: multiChannelLayout)
MyAVAudioUnit
包含一个额外的自定义参数 (volumeParameter
) 并按如下方式初始化:
required override init() {
var componentDescription = AudioComponentDescription()
componentDescription.componentType = kAudioUnitType_Effect
componentDescription.componentSubType = xxxxx
componentDescription.componentManufacturer = xxxxx
componentDescription.componentFlags = 0
componentDescription.componentFlagsMask = 0
AUAudioUnit.registerSubclass(MyAVAudioUnit.self,
as: componentDescription,
name:"MyAVAudioUnit",
version: UInt32.max)
super.init(audioComponentDescription: componentDescription)
guard let paramTree = self.auAudioUnit.parameterTree else { return }
volumeParameter = paramTree.value(forKey: "volumeParameter") as? AUParameter
}
最佳答案
以下是最终解决此问题的方法。我从崩溃日志中注意到,在尝试连接音频单元之前打印出的音频图显示如下:
“________ GraphDescription ________ AVAudioEngineGraph 0x101538ba0: initialized = 1, running = 0, number of nodes = 23”
有趣的是,running
为 false,initialized
为 true。关于这条initialized
信息的含义的文档并不多,但我发现它在 AVAudioEngine 之前已启动但暂停 时显示为 true。现在,我没有明确地从任何地方调用 avAudioEngine.pause()
,但我认为系统可能会启动暂停作为 AVAudioSessionRouteChangeNotification
的一部分(这就是我我在这一系列事件中做出回应)。
很多都是推测,但很明显,调用 avAudioEngine.connect()
而引擎的打印输出显示 initialized = 1
(或通过推断, 引擎暂停) 将导致此崩溃。
在尝试连接音频单元之前,音频引擎必须完全停止。我的问题是我尝试调用 avAudioEngine.stop()
时被包裹在 if
语句中,如下所示:
if avAudioEngine.isRunning {
avAudioEngine.stop()
}
当然,这个 if
语句被跳过了,因为音频引擎实际上并没有运行。所以 stop()
从未被调用过。删除 if
语句并调用 stop()
无疑会在引擎上设置 initialized = 0
并允许连接而不会发生此崩溃。
希望这对其他人有帮助。我花了很长时间才弄明白。
关于ios - AVAudioEngine.connect 上的 CoreAudio 错误和崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57379376/
我正在尝试动态修改附加到 AVAudioEngine 的节点图,但该图在每次重新连接后输出静音。 在下面的示例中,我想将 player 动态连接到 engine.mainMixerNode,但是每当我
我正在尝试使用 AVAudioEngine 播放 AVAudioFile。代码大部分取自苹果开发者在线视频,但没有回放。花了一些时间浏览论坛,但似乎没有任何线索。 我有两种方法。第一个调用标准的打开文
我的应用程序动态添加和删除为 mainMixerNode 提供数据的节点。发生这种情况时,我会听到咔哒声或爆裂声,因为音量并未减弱。 建立连接时如何实现平滑过渡?我是否需要在 AudioUnit 中自
我正在尝试查找有关如何使用 AVAudioEngine 的详细文档。有谁知道我在哪里可以找到它? 我找到了这个,但与文档丰富的 UI 内容相比,它似乎非常简陋。 https://developer.a
这里是第一个 stackoverflow 问题,所以请多多包涵!在为 MacOS 设计更大的音频程序的过程中,我试图创建一个测试应用程序,它可以简单地从任何系统音频输入中获取音频并将其发送到任何输出。
我正在用 Swift 编写一个 iOS 应用程序,该应用程序正在录制用户的声音,然后可以使用一些语音效果进行播放,但问题是使用内置 iPhone 麦克风时播放非常安静。带耳机就没问题。 录制代码: l
我正在使用 AVAudioEngine 进行测量。我从界面中播放刺激声音,并使用 micTap 记录返回的信号。 我现在正在研究支持多种不同格式的不同音频接口(interface)。我通过混合器转换
我成功地将 AVAudioPlayer 节点附加到我的 AVAudioEngine。但是,我需要稍后检查这些节点是否已附加到它(因此我不会重新添加它们)。 引擎上是否有任何特定属性可供我检查以查看其是
简单的问题。如何使用 AVAudioEngine 播放多声道音频文件(> 2 声道),以便我可以听到默认 2 声道输出(耳机/扬声器)上的所有声道。以下代码(去除了用于呈现的错误检查)播放文件的前两个
我正在创建一个基本的音板应用程序。我有两个开关。一种在激活时将使音频变慢且音调更低,另一种则使其变得更快和更高。我有一个 if else if if 语句,它查看这些开关,然后相应地播放音频,但是当我
我正在开发一键通功能,发送者可以将字节数组形式的音频发送到服务器,接收者可以通过套接字连接实时收听它。 当我尝试使用 AVAudioEngine 在接收端播放视频时,它不起作用。 let bu
我正在尝试制作音频处理应用程序。有没有办法使用 AVAudioEngine 将音频效果应用于音频文件? 最佳答案 是的,你当然可以,你可以使用: AVAudioPlayerNode AVAudioUn
我正在尝试设置一个 AudioQueue 以从 iPhone 上的麦克风传输音频。 我创建我的音频引擎: var audioEngine = AVAudioEngine() 还有我的音频队列:
我正在使用一个 AVAudioEngine 对象,它附有许多 AVAudioPlayerNodes。音频一切正常,除了它会停止 iPhone 在后台播放的任何音频(即来自 iTunes 或其他音乐应用
我正在设置一个 AVAudioEngine 实现以从麦克风获取音频并将其流式传输到 websocket 连接。首先,我已经点击了麦克风输入和一个中间混音器,该混音器将麦克风的音频从 44khz 下采样
在我下面的代码中,我创建了两个声音,sound1 和 sound2。每个声音都包含多个样本,允许同时播放相同的声音。问题是,如果我创建看似超过 6 到 8 个 AVAudioPlayerNode,每个
我已经设置了我的音频引擎并连接了几个节点,以便制作如下所示的音频图: // //AVAudioPlayerNode --> AVAudioMixerNode --> AVAudioUnitVarisp
我正在使用 AVAudioPlayerNode 播放歌曲,我正在尝试使用 UISlider 来控制它的时间,但我无法弄清楚如何使用 AVAUdioEngine. 最佳答案 经过反复试验,我想我终于弄明
我在对从麦克风获取的音频进行下采样时遇到问题。我正在使用 AVAudioEngine 通过以下代码从麦克风中采集样本: assert(self.engine.inputNode != nil) let
我正在尝试运行来自 their website here 的 Apple SpeakToMe:将语音识别与 AVAudioEngine 结合使用示例.我的问题是,当您停止 AVAudioEngine
我是一名优秀的程序员,十分优秀!