PortAudio 是跨平台音频开发的轻量级库,支持 Windows、macOS、Linux,适用于实时录音与播放。通过初始化库并查询设备信息可获取输入输出设备列表;音频播放利用回调函数生成数据流,如正弦波示例所示,设置采样率、声道数后启动流并运行指定时长;音频录制则通过输入流回调接收数据,将采集样本存入缓冲区,建议使用环形缓冲或文件流避免性能问题;结合 sndfile 等库可实现 WAV 文件保存。掌握其回调机制和流控制是实现实时音频处理的关键。

在C++中实现跨平台音频录制与播放,PortAudio 是一个轻量级、开源且广泛支持的音频I/O库。它可以在Windows、macOS、Linux等系统上运行,适合实时音频处理任务,如录音、播放、流式传输等。下面介绍如何使用 PortAudio 实现基本的音频录制与播放功能。
安装与配置 PortAudio
PortAudio 可以通过源码编译或包管理器安装:
Windows:使用 vcpkg 或 MSYS2 安装,例如:vcpkg install portaudiomacOS:使用 Homebrew:brew install portaudioLinux(Ubuntu/Debian):sudo apt-get install libportaudio2 libportaudiocpp0-dev
在项目中链接时,确保编译时包含头文件并链接 portaudio 库,例如g++命令:
g++ main.cpp -lportaudio
初始化与设备信息查询
使用 PortAudio 前需初始化库,并可查询可用音频设备:
立即学习“C++免费学习笔记(深入)”;
#include "portaudio.h"
int main() {
Pa_Initialize();
int deviceCount = Pa_GetDeviceCount();
for (int i = 0; i < deviceCount; ++i) {
const PaDeviceInfo* info = Pa_GetDeviceInfo(i);
printf("Device %d: %s, Inputs: %d, Outputs: %dn",
i, info->name, info->maxInputChannels, info->maxOutputChannels);
}
Pa_Terminate();
return 0;
}
这段代码列出所有音频设备,帮助选择合适的输入/输出设备。
实现音频播放
通过回调函数实现音频流播放。以下是一个正弦波播放示例:
static int playCallback(const void* input, void* output,
unsigned long frameCount,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void* userData) {
float* out = (float*)output;
double* phase = (double*)userData;
double frequency = 440.0; // A4 音符
double sampleRate = 44100.0;
double increment = frequency * 2.0 * M_PI / sampleRate;
for (unsigned int i = 0; i < frameCount; ++i) {
*out++ = sin(*phase); // 左声道
*out++ = sin(*phase); // 右声道(立体声)
*phase += increment;
if (*phase >= 2.0 * M_PI) *phase -= 2.0 * M_PI;
}
return paContinue;
}
// 播放调用
PaStream* stream;
double phase = 0.0;
Pa_OpenStream(&stream, nullptr, &Pa_GetDefaultOutputDeviceInfo()->hostApi,
0, 2, paFloat32, 44100, 256, playCallback, &phase);
Pa_StartStream(stream);
Pa_Sleep(5000); // 播放5秒
Pa_StopStream(stream);
Pa_CloseStream(stream);
实现音频录制
录制使用输入流和回调函数接收音频数据:
std::vector recordedData;
static int recordCallback(const void* input, void* output,
unsigned long frameCount,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void* userData) {
const float* in = (const float*)input;
std::vector* buffer = (std::vector*)userData;
for (unsigned int i = 0; i < frameCount * 1; ++i) { // 单声道
buffer->push_back(in[i]);
}
return paContinue;
}
// 录制调用
PaStream* stream;
Pa_OpenStream(&stream, &Pa_GetDefaultInputDeviceInfo()->hostApi, 1, 0,
paFloat32, 44100, 256, recordCallback, &recordedData);
Pa_StartStream(stream);
Pa_Sleep(5000); // 录制5秒
Pa_StopStream(stream);
Pa_CloseStream(stream);
// recordedData 中保存了录音样本
注意:长时间录制应避免直接 push_back 大量数据,建议使用环形缓冲区或写入文件流。
PortAudio 提供了简洁的接口用于跨平台音频处理。结合其他库(如 sndfile 写 WAV 文件),可实现完整的录音保存功能。掌握其回调机制和数据流模型,是开发实时音频应用的基础。基本上就这些,不复杂但容易忽略细节。
以上就是C++如何进行音频处理_使用PortAudio库在C++中实现跨平台音频录制与播放的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1487803.html
微信扫一扫
支付宝扫一扫