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

在C++中实现跨平台音频录制与播放,PortAudio 是一个轻量级、开源且广泛支持的音频I/O库。它可以在Windows、macOS、Linux等系统上运行,适合实时音频处理任务,如录音、播放、流式传输等。下面介绍如何使用 PortAudio 实现基本的音频录制与播放功能。
PortAudio 可以通过源码编译或包管理器安装:
在项目中链接时,确保编译时包含头文件并链接 portaudio 库,例如g++命令:
g++ main.cpp -lportaudio使用 PortAudio 前需初始化库,并可查询可用音频设备:
立即学习“C++免费学习笔记(深入)”;
#include "portaudio.h"<br><br>int main() {<br> Pa_Initialize();<br> int deviceCount = Pa_GetDeviceCount();<br> for (int i = 0; i < deviceCount; ++i) {<br> const PaDeviceInfo* info = Pa_GetDeviceInfo(i);<br> printf("Device %d: %s, Inputs: %d, Outputs: %d\n",<br> i, info->name, info->maxInputChannels, info->maxOutputChannels);<br> }<br> Pa_Terminate();<br> return 0;<br>}这段代码列出所有音频设备,帮助选择合适的输入/输出设备。
通过回调函数实现音频流播放。以下是一个正弦波播放示例:
static int playCallback(const void* input, void* output,<br> unsigned long frameCount,<br> const PaStreamCallbackTimeInfo* timeInfo,<br> PaStreamCallbackFlags statusFlags,<br> void* userData) {<br> float* out = (float*)output;<br> double* phase = (double*)userData;<br> double frequency = 440.0; // A4 音符<br> double sampleRate = 44100.0;<br> double increment = frequency * 2.0 * M_PI / sampleRate;<br><br> for (unsigned int i = 0; i < frameCount; ++i) {<br> *out++ = sin(*phase); // 左声道<br> *out++ = sin(*phase); // 右声道(立体声)<br> *phase += increment;<br> if (*phase >= 2.0 * M_PI) *phase -= 2.0 * M_PI;<br> }<br> return paContinue;<br>}<br><br>// 播放调用<br>PaStream* stream;<br>double phase = 0.0;<br>Pa_OpenStream(&stream, nullptr, &Pa_GetDefaultOutputDeviceInfo()->hostApi,<br> 0, 2, paFloat32, 44100, 256, playCallback, &phase);<br>Pa_StartStream(stream);<br>Pa_Sleep(5000); // 播放5秒<br>Pa_StopStream(stream);<br>Pa_CloseStream(stream);录制使用输入流和回调函数接收音频数据:
std::vector<float> recordedData;<br><br>static int recordCallback(const void* input, void* output,<br> unsigned long frameCount,<br> const PaStreamCallbackTimeInfo* timeInfo,<br> PaStreamCallbackFlags statusFlags,<br> void* userData) {<br> const float* in = (const float*)input;<br> std::vector<float>* buffer = (std::vector<float>*)userData;<br> for (unsigned int i = 0; i < frameCount * 1; ++i) { // 单声道<br> buffer->push_back(in[i]);<br> }<br> return paContinue;<br>}<br><br>// 录制调用<br>PaStream* stream;<br>Pa_OpenStream(&stream, &Pa_GetDefaultInputDeviceInfo()->hostApi, 1, 0,<br> paFloat32, 44100, 256, recordCallback, &recordedData);<br>Pa_StartStream(stream);<br>Pa_Sleep(5000); // 录制5秒<br>Pa_StopStream(stream);<br>Pa_CloseStream(stream);<br>// recordedData 中保存了录音样本注意:长时间录制应避免直接 push_back 大量数据,建议使用环形缓冲区或写入文件流。
PortAudio 提供了简洁的接口用于跨平台音频处理。结合其他库(如 sndfile 写 WAV 文件),可实现完整的录音保存功能。掌握其回调机制和数据流模型,是开发实时音频应用的基础。基本上就这些,不复杂但容易忽略细节。
以上就是C++如何进行音频处理_使用PortAudio库在C++中实现跨平台音频录制与播放的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号