首页 / 资讯中心 / 文章详情

goo-engine 内嵌音频引擎 Audaspace 全解析:从设备播放到 3D 音效的 C++/Python 音频库

goo-engine 内嵌音频引擎 Audaspace 全解析:从设备播放到 3D 音效的 C++/Python 音频库 ★ FEATURED ARTICLE
图形学3D渲染【免费下载链接】goo-engineCustom build of blender with some extra NPR features.项目地址https://gitcode.com/gh_mirrors/go/goo-engine点击查看免费下载Audaspace读作 outer space是一个用 C 编写、附带 Python 语言绑定的高级音频库最初作为三维建模应用 Blender 的音频引擎起步现已作为独立库对外发布。在本仓库 goo-engine基于 Blender 的定制构建中Audaspace 以 extern/audaspace/README.md 所述的方式被内嵌为第三方依赖并经由 source/blender/blenkernel/intern/sound.cc 等模块的AUD_Sound_*/AUD_Device_*C API 深度集成进 Blender 的音频系统。读完本文你将掌握 Audaspace 的设备与插件架构、文件读写、滤波器/效果、波形生成、重规格化respecification与音频序列编排等全部核心能力并能直接使用其 Python 绑定写出可运行的播放、音效合成与 3D 定位音频程序。Audaspace 是什么源自 Blender 的独立音频库Audaspace 的设计目标是提供一个高层high level的音频库应用开发者不必直接面对各个底层音频后端ALSA、CoreAudio、WASAPI 等的差异而是通过统一的抽象接口完成设备打开、声音播放与播放控制。根据 extern/audaspace/README.md它以 C 实现并提供 C 与 Python 语言绑定发源于 Blender 的音频引擎如今作为独立库发布名称发音为 outer space读音近似外太空。在 goo-engine 中Audaspace 的定位是内嵌第三方库而非独立项目这一点可以从 extern/audaspace/README.blender 得到佐证——该文件记录了上游版本信息Upstream version: 1.4对应 0d18fe7, 2024 Jan 2与本地修改Local modifications: JOSResampleReader default quality set to MEDIUM即把 JOS 重采样器的默认质量档设为 MEDIUM。同时extern/audaspace/CMakeLists.txt 声明库版本AUDASPACE_VERSION 1.4并在非独立构建模式下AUDASPACE_STANDALONE为 FALSE 时作为 Blender 的一部分参与整体构建。在 Blender 侧source/blender/blenkernel/intern/sound.cc 大量调用 Audaspace 的 C 绑定例如BKE_sound_new_file经由AUD_Sound_file加载声音文件BKE_sound_cache使用AUD_Sound_cache建立缓存BKE_sound_init则通过AUD_DeviceSpecs配置并打开默认音频设备。可以推断Blender 场景中的音频序列、视频预览播放source/blender/windowmanager/intern/wm_playanim.cc等能力都建立在 Audaspace 之上。底层抽象ISound / IReader / IDevice / IHandle 四件套理解 Audaspace 的功能首先要理解它的四个核心抽象接口它们构成了声音描述 → 可读流 → 设备播放 → 播放控制的完整数据链路接口头文件职责ISoundextern/audaspace/include/ISound.h一种声音源的描述保存必要参数通过工厂方法createReader()创建可播放的 readerIReaderextern/audaspace/include/IReader.h可作为流或缓冲被读取的声音源提供seek、getLength、getPosition、getSpecs与read等接口IDeviceextern/audaspace/include/devices/IDevice.h声音输出设备抽象可对应 SDL、OpenAL 等跨平台后端或平台特定后端甚至是文件、RAM 缓冲IHandleextern/audaspace/include/devices/IHandle.h一次具体播放的句柄用于暂停、恢复、停止、定位、调音量、调音高与设置循环等关键设计要点如下ISound对象本身只是声音的描述不会立即产生声音只有调用createReader()才会生成真正可读取采样数据的IReader。Python 教程中也特别强调At this point nothing is playing back yet, Sound objects are just descriptions of sounds.IReader以样本数samples为单位描述位置与长度seek(int position)中从时间秒换算到样本数只需乘以采样率getLength()返回负值表示长度未知。IDevice::play()同时接受std::shared_ptrIReader与std::shared_ptrISound两种重载并可通过keep参数让声音播完后转为暂停而非删除见 extern/audaspace/include/devices/IDevice.h。IHandle定义了Status枚举STATUS_INVALID句柄失效、STATUS_PLAYING播放中、STATUS_PAUSED已暂停、STATUS_STOPPED已停止但保留在设备中loop_count为负值表示无限循环还支持设置stopCallback在播放到达末尾时回调extern/audaspace/include/devices/IHandle.h。核心特性详解extern/audaspace/README.md 以可能不完整的列表形式列出了 Audaspace 支持的功能下面结合仓库源码逐一展开。输入 / 输出设备Audaspace 支持输入来自麦克风、line in 等录音设备输出包括 3D 音频支持在内的多种输出设备。在仓库中设备能力通过插件plugins形式提供见 extern/audaspace/plugins 目录openal/跨平台 OpenAL 输出设备OpenALDevice支持 3D 音频定位pulseaudio/Linux 下的 PulseAudio 设备支持运行时动态加载DYNLOAD_PULSEAUDIOjack/专业音频 JACK 设备同样可动态加载DYNLOAD_JACKcoreaudio/macOS 的 CoreAudio 设备还额外实现了CoreAudioSynchronizer用于精确音画同步wasapi/Windows 的 WASAPI 设备sdl/跨平台 SDL 输出设备可选用 SDL2对应USE_SDL2选项。设备打开流程由 extern/audaspace/src/devices/DeviceManager.cpp 承担DeviceManager::openDefaultDevice()打开系统默认设备DeviceManager::getDeviceFactory(name)按名称获取指定类型的设备工厂再通过IDeviceFactory::openDevice()实例化设备。仓库还内置了NULLDevice静默空设备、ReadDevice将设备输出读取回内存、SoftwareDevice软件混音与ThreadedDevice线程化播放等参考实现见 extern/audaspace/src/devices 与 extern/audaspace/CMakeLists.txt。文件读写Audaspace 支持音频文件的读取与写入主要依赖两个文件格式插件plugins/ffmpeg/基于 FFmpeg 的通用媒体读取/写入FFMPEGReader、FFMPEGWriter覆盖面广plugins/libsndfile/基于 libsndfile 的SndFileReader/SndFileWriter。文件层的核心实现位于 extern/audaspace/src/file包括File按文件名/缓冲创建声音、FileManager通过插件查找并解析文件与FileWriter写出文件。在 Python 绑定中对应aud.Sound.file()类方法在 Blender 中BKE_sound_new_file与AUD_Sound_bufferFile从内存缓冲直接加载都建立在它之上。滤波器与效果extern/audaspace/include/fx 与 extern/audaspace/src/fx 提供了丰富的效果处理类README 中提到的包括低通 / 高通滤波Lowpass、Highpass均基于 Butterworth 滤波器系数计算见ButterworthCalculator、Butterworth以及通用的IIRFilter/DynamicIIRFilter延迟Delay含DelayReader反向播放Reverse淡入淡出Fader配合FaderReader音量控制Volume/VolumeSound/VolumeStorage支持可写入的渐进式音量存储更多实用效果ADSR包络、Envelope、Pitch变调、Limiter、Threshold、Modulator、Accumulator、Loop、MutableSound、SoundList、Source与Sum等。以Threshold为例extern/audaspace/include/fx/Threshold.h其作用是把任意信号转换为方波振幅 ≥ 阈值的样本置 1≤ −阈值置 −1介于两者之间置 0。它通过CallbackIIRFilterReader的thresholdFilter回调实现这解释了 README 特性中滤波器/效果为何能与波形生成组合出丰富的合成音色。简单波形生成器extern/audaspace/include/generator 与 extern/audaspace/src/generator 提供了 README 提到的几个基础波形发生器Silence静音Sine正弦波参数为频率与目标采样率见 extern/audaspace/include/generator/Sine.hSquare方波Triangle三角波Sawtooth锯齿波README 列表中虽未明确写出但源码已实现。在 Python 绑定中它们以aud.Sound.sine(frequency, rate48000)、aud.Sound.square(...)、aud.Sound.sawtooth(...)、aud.Sound.triangle(...)、aud.Sound.silence(...)等类方法暴露见 extern/audaspace/bindings/python/PySound.cpp 的方法表。Python 文档字符串明确建议rate参数最好与播放设备的采样率一致以避免不必要的重采样开销。重规格化Respecification重规格化是 Audaspace 用来描述改变音频流参数的术语覆盖三个维度README 原述声道数channel count声道重映射对应 extern/audaspace/src/respec/ChannelMapper.cpp 的ChannelMapper可把立体声转单声道、指定各声道到目标声道的映射关系等采样格式sample format库内部统一使用 32 位浮点sample_t。extern/audaspace/include/respec/Specification.h 定义了SampleFormat枚举FORMAT_U8、FORMAT_S16、FORMAT_S24、FORMAT_S32、FORMAT_FLOAT32、FORMAT_FLOAT64其中格式的低 4 位编码字节数AUD_FORMAT_SIZE宏。外部音频文件/设备通常以这些格式输入库内部统一转为 32 位浮点处理后再按需转出采样率sample rate重采样。实现包括LinearResample线性插值低开销与JOSResampleJulius O. Smith 风格的高质量重采样按系数表分 High / Medium / Low 三档质量统一由ResampleReader驱动extern/audaspace/src/respec。值得一提的仓库细节goo-engine 对 Audaspace 的唯一本地修改就是把JOSResampleReader的默认质量档设为 MEDIUM记录于 extern/audaspace/README.blender在保证重采样质量的同时控制了计算开销读者在使用该库时也可按需调整此档位。此外Specification.h还定义了声道布局枚举CHANNELS_MONO到CHANNELS_SURROUND71、声道名称枚举CHANNEL_FRONT_LEFT、CHANNEL_LFE等以及默认采样率枚举RATE_8000至RATE_192000并提供了Specs源规格采样率 声道数与DeviceSpecs设备规格在源规格基础上增加采样格式两个核心数据结构。音频序列编排README 将序列能力分为两类简单序列叠加superposition同时播放多路声音并混合、连接joining按顺序先后播放两段声音与乒乓ping-pong即正向播放后接反向播放等价于声音 其反向的连接。对应 extern/audaspace/src/sequence/Superpose.cpp、extern/audaspace/src/sequence/Double.cpp 与 extern/audaspace/src/sequence/PingPong.cpp复杂序列非线性音频编辑Sequence/SequenceEntry/SequenceData/SequenceHandle体系支持把多段声音按时间轴位置精确排布、独立控制每条 entry 的播放与静音extern/audaspace/src/sequence。在 Python 绑定中aud.Sound.join(sound)对应Double要求两个声音的规格声道数与采样率一致aud.Sound.mix(sound)对应Superposeaud.Sound.pingpong()对应PingPong见 extern/audaspace/bindings/python/PySound.cpp 的文档与实现。aud.Sequence/aud.SequenceEntry则用于时间轴编排。Python 绑定实战从简单播放到 3D 定位音效Audaspace 的 Python 绑定只有少数几个核心类aud.Device、aud.Sound、aud.Handle以及aud.Sequence、aud.SequenceEntry教程文档见 extern/audaspace/bindings/doc/tutorials.rst完整示例代码位于 extern/audaspace/bindings/python/examples。1. 极简播放simple.pyextern/audaspace/bindings/python/examples/simple.py 完整展示了打开设备 → 生成声音 → 应用效果 → 播放 → 等待的全部基本构件#!/usr/bin/python import aud, time device aud.Device() sine aud.Sound.sine(440) square sine.threshold() handle device.play(square) time.sleep(3)要点aud.Device()不传参数时打开系统默认设备。其构造参数见 extern/audaspace/bindings/python/PyDevice.cpp依次为type设备类型名默认自动选择、rate采样率默认 48000、channels声道数默认立体声、format采样格式默认FORMAT_FLOAT32、buffer_size缓冲大小必须 ≥ 128、name设备名aud.Sound.sine(440)只创建 440 Hz 正弦波的描述尚未发声sine.threshold()把正弦波整形为方波——这是 README 滤波器/效果与生成器组合的经典范例虽然直接aud.Sound.square(440)更高效但示例意在展示效果链device.play(square)返回aud.Handle用于后续播放控制。2. 简易音乐播放器player.pyextern/audaspace/bindings/python/examples/player.py 展示了从文件加载声音并等待播放结束#!/usr/bin/python import aud, sys, time device aud.Device() sound aud.Sound.file(sys.argv[1]) handle device.play(sound) while handle.status: time.sleep(0.1)这里aud.Sound.file()即文件读取能力handle.status属性对应IHandle::getStatus在声音播完后变为非真值循环结束。教程还留下练习扩展为按顺序播放命令行传入的任意多个文件。3. 环绕头顶的警报声siren.pyextern/audaspace/bindings/python/examples/siren.py 演示了效果链、无限循环与 3D 音频定位#!/usr/bin/python import aud, math, time length 0.5 fadelength 0.05 device aud.Device() high aud.Sound.sine(880).limit(0, length).fadein(0, fadelength).fadeout(length - fadelength, length) low aud.Sound.sine(700).limit(0, length).fadein(0, fadelength).fadeout(length - fadelength, length).volume(0.6) sound high.join(low) handle device.play(sound) handle.loop_count -1 start time.time() while time.time() - start 10: angle time.time() - start handle.location [math.sin(angle), 0, -math.cos(angle)]技术要点效果函数返回新的Sound因此可以链式调用limit截取 0 ~ length 区间、fadein/fadeout淡入淡出、volume音量文档建议取值 [0, 1] 以避免削波见 extern/audaspace/bindings/python/PySound.cpphigh.join(low)把两段 0.5 秒的声音首尾连接成 1 秒的警报音join要求两声音规格一致handle.loop_count -1无限循环handle.location是三维向量程序以运行时间驱动角度计算让声音在 XZ 平面绕听众画圆。立体声至少能听到左右声像移动在多声道且输出设备支持 3D 音频时效果更明显。教程还提示正确设置handle.velocity还能触发多普勒效应对比参考 extern/audaspace/bindings/python/examples/siren2.py。4. 用 Sequence 编排俄罗斯方块音乐tetris2.pyextern/audaspace/bindings/python/examples/tetris2.py 演示了非线性音频编辑用aud.Sequence按时间轴添加音符替代用 join 拼出极端不平衡的二叉树的做法position 0 sequence aud.Sequence() # ...解析乐谱循环中... note aud.Sound.square(freq, rate).fadein(0, fadelength).fadeout(length - fadelength, fadelength) entry sequence.add(note, position, position length, 0) if char p: entry.muted True position lengthsequence.add(note, begin, end, skip)返回aud.SequenceEntry可对其设置muted属性实现休止符静音最后以sequence.limit(0, position)收尾。相比join链Sequence的时间轴模型在编排大量音符时更清晰、更易维护。更复杂的完整实现还可参考 extern/audaspace/bindings/python/examples/tetris.py 与 extern/audaspace/bindings/python/examples/tetris3.py。构建配置与插件体系Audaspace 使用 CMake 构建extern/audaspace/CMakeLists.txt其构建选项同样佐证了 README 的特性列表AUDASPACE_STANDALONE是否作为独立库构建在本仓库中作为 Blender 依赖时为 FALSEWITH_C/WITH_PYTHON是否构建 C / Python 绑定WITH_PYTHON_MODULE控制 Python 模块audaspace-pySEPARATE_C控制 C 绑定是否独立成库WITH_FFMPEG/WITH_LIBSNDFILE文件读写插件WITH_OPENAL/WITH_PULSEAUDIO/WITH_JACK/WITH_SDL/WITH_COREAUDIO/WITH_WASAPI各类输出设备插件按平台自动启用对应项如 macOS 默认 CoreAudio、Windows 默认 WASAPIWITH_FFTW启用卷积 / 双耳binaural/ HRTF / 均衡器Equalizer等进阶功能对应src/fx下的Convolver、BinauralSound、HRTF、Equalizer等类WITH_STRICT_DEPENDENCIES依赖缺失时报错REQUIRED而非降级警告DYNLOAD_JACK/DYNLOAD_PULSEAUDIOJACK / PulseAudio 插件改为运行时动态加载BUILD_DEMOS构建audainfo、audaplay、audaconvert、audaremap、signalgen、randsounds、dynamicmusic、playbackmanager等命令行演示程序。插件采用静态注册机制STATIC_PLUGIN_CLASS/STATIC_PLUGIN_REGISTER宏把各设备插件注册进PluginManager既支持独立.so/.dll动态插件也支持静态链接进主程序。默认插件安装/加载路径在 Unix 上为${CMAKE_INSTALL_PREFIX}/share/audaspace/pluginsWindows/macOS 上为当前目录。许可证Audaspace 采用 Apache License 2.0 许可extern/audaspace/README.md 中的 License 一节版权归 Jörg Müller 所有Copyright © 2009-2023。这与仓库根目录的 COPYING 及 release/license/Apache-2.0.txt 中声明的第三方许可策略一致。使用 Audaspace 源码时需保留 Apache 2.0 许可证文本并满足其条款如保留版权声明、显著修改声明等。赞分享图形学3D渲染【免费下载链接】goo-engineCustom build of blender with some extra NPR features.项目地址https://gitcode.com/gh_mirrors/go/goo-engine点击查看免费下载相关推荐MPV视频编辑功能快速剪辑与转换教程MPV视频编辑功能快速剪辑与转换教程 MPV作为一款轻量级媒体播放器不仅支持高清视频播放还隐藏着强大的视频编辑功能。本文将带你探索如何利用MPV实现快速剪文档教程libopenmpt多平台部署Windows、Linux与macOS实现方案libopenmpt多平台部署Windows、Linux与macOS实现方案 libopenmpt是一款强大的开源模块音乐库支持在Windows、LinuxReact 360 音频播放指南从环境背景音到 3D 空间化音效的 AudioModule 全解React 360 音频播放指南从环境背景音到 3D 空间化音效的 AudioModule 全解 导读 在 React 360 应用中声音是构建沉浸感不可或前端3D渲染上一篇深度解析Godot PCK解包器高效提取游戏资源的完整实战指南下一篇Git 中的 Dry Run安全预览命令执行效果的实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站