mackron/miniaudio
GitHub: mackron/miniaudio
单文件跨平台音频库,提供从底层到高层的完整音频播放与捕获功能。
Stars: 6579 | Forks: 537
一个单源文件的音频播放与捕获库。
功能 -
示例 -
构建 -
文档 -
支持的平台 -
安全性 -
许可证
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, 信号处理, 单头文件库, 声卡驱动接口, 客户端加密, 嵌入式音频, 开源库, 搜索引擎爬虫, 数字信号处理, 无依赖, 混音, 游戏音频, 音频处理, 音频库, 音频录制, 音频播放, 音频编码, 音频解码