PortAudio--PCM播放与采集

发布于:2025-03-26 ⋅ 阅读:(8) ⋅ 点赞:(0)

PortAudio 是一款跨平台音频 I/O 库,支持 Windows、Linux、macOS 等系统,其核心设计基于异步回调机制,适用于实时音频采集与播放场景。主要负责‌音频流的采集与播放‌,其原生接口仅支持‌PCM格式‌的原始音频数据处理,不包含内置的音频编码模块‌。

官网:https://www.portaudio.com/

一、核心特性

  1. 跨平台支持
    提供统一 API 接口,适配多种音频后端(如 ALSA、PulseAudio、Core Audio 等)‌。

  2. 回调驱动模型
    通过注册回调函数实现音频数据实时处理,支持非阻塞式音频流操作‌。

  3. 设备枚举与管理
    可动态获取系统音频设备列表,并指定输入/输出设备进行数据流操作‌。

二、开发流程

  1. 环境配置

    • Linux (Ubuntu)‌:直接安装开发库,或者下载源码编译。
      安装开发库 sudo apt-get install portaudio19-dev
      ‌源码编译。下载pa_stable_v190700_20210406.tgz,编译即可。
    • Windows‌:下载预编译库或源码编译,配置 Visual Studio 包含路径‌。
      下载pa_stable_v190700_20210406.tgz+ASIO SDK,编译即可。
  2. 初始化与终止

    Pa_Initialize();  // 初始化 PortAudio
    Pa_Terminate();   // 释放资源
    
  3. 音频流操作

    • 打开默认流
      Pa_OpenDefaultStream(&stream, inputChannels, outputChannels, 
                           format, sampleRate, framesPerBuffer, 
                           callback, userData);
      
    • 启动/停止流
      Pa_StartStream(stream);  // 启动音频流
      Pa_StopStream(stream);   // 停止音频流
  4. 回调函数实现

    static int callback(
        const void *inputBuffer,   // 输入音频数据(如麦克风输入)
        void *outputBuffer,        // 输出音频数据(如扬声器输出)
        unsigned long framesPerBuffer, // 每个缓冲区的帧数
        const PaStreamCallbackTimeInfo* timeInfo, // 时间信息(时间戳、缓冲区间隔等)
        PaStreamCallbackFlags statusFlags,        // 流状态标志(如缓冲区溢出/欠载)
        void *userData             // 用户自定义数据(可传递参数到回调函数)
    );
    

    ‌参数详解‌:
    ‌inputBuffer‌:输入音频数据的缓冲区指针(若流未开启输入,则为 NULL)。数据格式由 Pa_Op