JUCE AUv3 插件开发:手把手让 iOS 音频插件在真机上跑起来
发布时间:2026/9/19 14:31:25 作者:尧图编辑部 阅读量:1,286

JUCE AUv3 插件开发手把手让 iOS 音频插件在真机上跑起来【免费下载链接】JUCEJUCE is an open-source cross-platform C application framework for desktop and mobile applications, including VST, VST3, AU, AUv3, LV2 and AAX audio plug-ins.项目地址: https://gitcode.com/GitHub_Trending/ju/JUCE在 GarageBand 里装了自己的插件界面死活打不开碰一下参数宿主直接闪退。JUCE AUv3 就是为这种翻车准备的JUCE 是开源的跨平台 C 应用框架你用 C 写好音频算法同一份代码同时跑在 iOS 和 macOS 上不用为苹果生态单独重写。 30 秒搞懂核心概念AUv3Audio Unit v3是苹果给 iOS/macOS 的音频插件格式。打个比方宿主 AppGarageBand、AUM 这类是电网你的插件是电器AUv3 就是插座标准——电器按标准做插进任何电网都能用。老一代 AUv2 的插件跑在宿主进程里一崩全崩。AUv3 把你的插件装进 App Extension苹果叫应用扩展就是宿主里的独立沙盒进程崩了宿主没事界面也由宿主按需打开和关闭。你要做的其实只有三件事定义参数比如混响大小是个 0~1 的浮点数实现processBlock把每块音频缓冲区处理掉画个编辑器界面可选Apple 的 CoreAudioKit 和你的 C 类之间的胶水代码JUCE 都写好了就在 modules/juce_audio_plugin_client/ 这个模块里。 从零创建第一个 AUv3 插件并跑通真机环境要求很朴素macOS Xcode部署目标 iOS 10 以上即可JUCE 7 以上。仓库里现成有个可运行的合成器示例examples/Plugins/AUv3SynthPluginDemo.h。它是个 PIP 文件Projucer 能读的插件工程片段步骤如下克隆仓库git clone https://gitcode.com/GitHub_Trending/ju/JUCE用 Projucer仓库内 extras/Projucer/ 有完整工程打开这个 PIP确认插件格式里勾了 AUv3然后生成 Xcode 工程设置签名 Team选真机Build Run在 GarageBand 或 AUM 的插件列表里找 AUv3 Synth加到轨道上PIP 文件开头声明了要构建的格式其中这行就是开关告诉 JUCE 额外生成一份 AUv3 代码extraPluginFormats: AUv3怎么算跑通了在 GarageBand 里点喇叭图标能弹出编辑器拖动 Room Size 滑杆能听到混响变化点 Record 能录音。做到这三步恭喜你的第一个 JUCE AUv3 插件已经在工作。 读懂从宿主到音频缓冲区的数据流一次声音信号的旅程是这样的宿主 App 在扩展沙盒里实例化你的插件CoreAudioKit 把音频缓冲区递进来JUCE 的JuceAudioUnitv3类实现见 modules/juce_audio_plugin_client/juce_audio_plugin_client_AUv3.mm接住缓冲区转手调你的processBlock处理完原路返回。界面走的是另一条线宿主想看 UI 时JUCE 建一个 UIViewController把你createEditor()返回的组件渲染进去。示例里的编辑器就这么简单——一个录音按钮加一条滑杆滑杆通过setParameterValue通知处理器。参数是两条线交汇的地方。注册一个参数它会自动出现在宿主的自动化通道和系统级 UI 里addParameter (roomSizeParam new AudioParameterFloat ({ roomSize, 1 }, Room Size, 0.0f, 1.0f, 0.5f));顺带一提modules/juce_audio_plugin_client/AU/ 目录下那套AUBase.h等文件是 AUv2 风格的 SDK 垫片是给老 API 编译用的读代码时看到别被它带偏。 四个高频翻车点的现象、原因与解法现象插件不出现在宿主列表里。原因扩展没嵌进 App或扩展和 App 用了不同的签名 Team。 解法在 App target 的 Build Phases 里确认 Embed App Extensions 有你的扩展签名 Team 改成一致Clean 后重编。现象喇叭图标点了没反应。原因宿主认为你没有 UI。 解法确认hasEditor()返回 true且createEditor()真的 new 出了组件示例里这两个都在。现象编辑器里动滑杆有用宿主的自动化没反应。原因改了参数值但没通知宿主。 解法写参数一律走setValueNotifyingHost()别直接改内存里的值。现象开麦克风后崩溃。原因扩展的沙盒里没声明麦克风用途。 解法在 App 的 Info.plist 加这一项重新构建keyNSMicrophoneUsageDescription/key string插件需要访问麦克风/string 走向生产的可选清单状态存取实现getStateInformation/setStateInformation示例里就是写两个 float。不实现的话用户重开插件参数全丢。实时线程纪律processBlock里不分配内存、不加锁、不打日志。缓冲区在prepareToPlay里一次分好。声道约束用isBusesLayoutSupported限制输出布局示例只放行立体声省掉单声道/环绕声的边界 case。进阶能力MIDI 输入PIP 里标pluginWantsMidiIn、和宿主协商屏幕尺寸都是 JUCE 9 已经接好的开配置项即可。分发前验证真机上测宿主杀掉进程再恢复时参数是否还在这是 AUv3 状态路径最容易被漏掉的场景。收尾一句话总结胶水层 JUCE 替你写完了你只写算法和界面剩下的交给 Projucer 生成的 Xcode 工程。下一步就一件事用 Projucer 打开示例 PIP把 AUv3 Synth 改成你的插件名连上真机跑一遍。【免费下载链接】JUCEJUCE is an open-source cross-platform C application framework for desktop and mobile applications, including VST, VST3, AU, AUv3, LV2 and AAX audio plug-ins.项目地址: https://gitcode.com/GitHub_Trending/ju/JUCE创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考