mackron/miniaudio

GitHub: mackron/miniaudio

单文件跨平台音频库,提供从底层到高层的完整音频播放与捕获功能。

Stars: 6579 | Forks: 537

miniaudio

一个单源文件的音频播放与捕获库。

discord x

功能 - 示例 - 构建 - 文档 - 支持的平台 - 安全性 - 许可证

miniaudio 是用 C 语言编写的,除了标准库外没有其他依赖项,并且应该可以在所有主要编译器上干净地编译,而无需安装任何额外的开发包。支持所有主要的桌面和移动平台。 # 功能 - 简单的构建系统,无外部依赖。 - 简单且灵活的 API。 - 用于直接访问原始音频数据的底层 API。 - 用于声音管理、混音、效果和可选 3D 空间化的高层 API。 - 用于高级混音和效果处理的灵活节点图系统。 - 用于加载声音文件的资源管理。 - 解码,内置支持 WAV、FLAC 和 MP3,此外还能够插入自定义解码器。 - 编码(仅限 WAV)。 - 数据转换。 - 重采样,包括自定义重采样器。 - 声道映射。 - 波形和噪声的基本生成。 - 基本效果和滤波器。 有关 miniaudio 可用功能的更完整描述,请参阅 [编程手册](https://miniaud.io/docs/manual/)。 # 示例 此示例展示了使用高层 API 播放声音的一种方法。 ``` #include "miniaudio/miniaudio.h" #include int main() { ma_result result; ma_engine engine; result = ma_engine_init(NULL, &engine); if (result != MA_SUCCESS) { return -1; } ma_engine_play_sound(&engine, "sound.wav", NULL); printf("Press Enter to quit..."); getchar(); ma_engine_uninit(&engine); return 0; } ``` 此示例展示了如何使用底层 API 解码和播放声音。 ``` #include "miniaudio/miniaudio.h" #include void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount) { ma_decoder* pDecoder = (ma_decoder*)pDevice->pUserData; if (pDecoder == NULL) { return; } ma_decoder_read_pcm_frames(pDecoder, pOutput, frameCount, NULL); (void)pInput; } int main(int argc, char** argv) { ma_result result; ma_decoder decoder; ma_device_config deviceConfig; ma_device device; if (argc < 2) { printf("No input file.\n"); return -1; } result = ma_decoder_init_file(argv[1], NULL, &decoder); if (result != MA_SUCCESS) { return -2; } deviceConfig = ma_device_config_init(ma_device_type_playback); deviceConfig.playback.format = decoder.outputFormat; deviceConfig.playback.channels = decoder.outputChannels; deviceConfig.sampleRate = decoder.outputSampleRate; deviceConfig.dataCallback = data_callback; deviceConfig.pUserData = &decoder; if (ma_device_init(NULL, &deviceConfig, &device) != MA_SUCCESS) { printf("Failed to open playback device.\n"); ma_decoder_uninit(&decoder); return -3; } if (ma_device_start(&device) != MA_SUCCESS) { printf("Failed to start playback device.\n"); ma_device_uninit(&device); ma_decoder_uninit(&decoder); return -4; } printf("Press Enter to quit..."); getchar(); ma_device_uninit(&device); ma_decoder_uninit(&decoder); return 0; } ``` 更多示例可以在 [examples](examples) 文件夹中或在线找到:https://miniaud.io/docs/examples/ # 构建 只需像编译其他源文件一样编译 miniaudio.c,并像包含普通头文件一样包含 miniaudio.h。无需安装任何依赖项。在 Windows 和 macOS 上,无需链接任何内容。在 Linux 和 BSD 上,只需链接 `-lpthread` 和 `-lm`。在 iOS 上,您需要编译为 Objective-C。如果遇到关于 `dlopen()` 等的错误,请链接 `-ldl`。 如果您遇到关于 `__sync_val_compare_and_swap_8`、`__atomic_load_8` 等的未定义引用错误,您需要链接 `-latomic`。 版本之间不保证 ABI 兼容性,因此如果编译为 DLL/SO,请务必注意。集成 miniaudio 的推荐方法是将其直接添加到您的源代码树中。 如果您愿意,也可以使用 CMake。 # 文档 在线文档可以在这里找到:https://miniaud.io/docs/ 文档也可以在 [miniaudio.h](https://raw.githubusercontent.com/mackron/miniaudio/master/miniaudio.h) 的顶部找到,这始终是关于如何使用 miniaudio 的最新且权威的信息来源。所有其他文档都是根据此代码内文档生成的。 # 支持的平台 - Windows - macOS, iOS - Linux - FreeBSD / OpenBSD / NetBSD - Android - Raspberry Pi - Emscripten / HTML5 miniaudio 应该可以在其他平台上干净地编译,但默认情况下不包含任何播放或捕获支持。要支持这一点,您需要实现自定义后端。您可以在无需修改 miniaudio 源代码的情况下执行此操作。请参阅 [custom_backend](examples/custom_backend.c) 示例。 ## 后端 - WASAPI - DirectSound - WinMM - Core Audio (Apple) - ALSA - PulseAudio - JACK - sndio (OpenBSD) - audio(4) (NetBSD 和 OpenBSD) - OSS (FreeBSD) - AAudio (Android 8.0+) - OpenSL|ES (仅限 Android) - Web Audio (Emscripten) - Null (静音) - Custom (自定义) # 安全性 请参阅 miniaudio [安全策略](.github/SECURITY.md)。 # 许可证 您可以选择公共领域或 [MIT No Attribution](https://github.com/aws/mit-0)。
标签:3D音效, FLAC, MP3解码, WAV, 信号处理, 单头文件库, 声卡驱动接口, 客户端加密, 嵌入式音频, 开源库, 搜索引擎爬虫, 数字信号处理, 无依赖, 混音, 游戏音频, 音频处理, 音频库, 音频录制, 音频播放, 音频编码, 音频解码