PortAudio 是一款跨平台音频 I/O 库,支持 Windows、Linux、macOS 等系统,其核心设计基于异步回调机制,适用于实时音频采集与播放场景。主要负责音频流的采集与播放,其原生接口仅支持PCM格式的原始音频数据处理,不包含内置的音频编码模块。
一、核心特性
跨平台支持
提供统一 API 接口,适配多种音频后端(如 ALSA、PulseAudio、Core Audio 等)。回调驱动模型
通过注册回调函数实现音频数据实时处理,支持非阻塞式音频流操作。设备枚举与管理
可动态获取系统音频设备列表,并指定输入/输出设备进行数据流操作。
二、开发流程
环境配置
- Linux (Ubuntu):直接安装开发库,或者下载源码编译。
安装开发库sudo apt-get install portaudio19-dev
源码编译。下载pa_stable_v190700_20210406.tgz,编译即可。 - Windows:下载预编译库或源码编译,配置 Visual Studio 包含路径。
下载pa_stable_v190700_20210406.tgz+ASIO SDK,编译即可。
- Linux (Ubuntu):直接安装开发库,或者下载源码编译。
初始化与终止
Pa_Initialize(); // 初始化 PortAudio Pa_Terminate(); // 释放资源
音频流操作
- 打开默认流
Pa_OpenDefaultStream(&stream, inputChannels, outputChannels, format, sampleRate, framesPerBuffer, callback, userData);
- 启动/停止流
Pa_StartStream(stream); // 启动音频流 Pa_StopStream(stream); // 停止音频流
- 打开默认流
回调函数实现
static int callback( const void *inputBuffer, // 输入音频数据(如麦克风输入) void *outputBuffer, // 输出音频数据(如扬声器输出) unsigned long framesPerBuffer, // 每个缓冲区的帧数 const PaStreamCallbackTimeInfo* timeInfo, // 时间信息(时间戳、缓冲区间隔等) PaStreamCallbackFlags statusFlags, // 流状态标志(如缓冲区溢出/欠载) void *userData // 用户自定义数据(可传递参数到回调函数) );
参数详解:
inputBuffer:输入音频数据的缓冲区指针(若流未开启输入,则为 NULL)。数据格式由 Pa_Op