ubuntu下使用rtaudio采集桌面音频&扬声器音频

发布时间 2023-09-20 19:11:05作者: 柴承训

最近在做国产化系统的音频采集,Ubuntu/Kylin/UOS下可以使用PulseAudio来控制音频输入输出,可以直接使用apt install libpulse-dev获取相关库进行开发。
不过我选择使用封装更好的RtAudio来进行ubuntu下的音频采集,RtAudio提供了一套跨平台的音频输入输出控制API,而且在linux下除了PulseAudio,还可以选择ALSA, JACKOSS等方式。

编译源码

我是在本地编译的源码,后来发现可以直接使用apt install librtaudio-dev,不过还是推荐自己编译,源码地址:https://github.com/thestk/rtaudio.git

sudo apt install libpulse-dev #需要先安装依赖库libpulse.so
git clone https://github.com/thestk/rtaudio.git

下载源码后,对rtaudio/tests/record.cpp进行两处修改,方便后面做测试
一个是main函数里RtAudio adc类的初始化,添加一个传参RtAudio::LINUX_PULSE

一个是将adc.getDefaultInputDevice()改为adc.getDefaultOutputDevice(),在后面执行record测试程序时将会默认采集桌面输出音频

cd rtaudio
mkdir build
cd build
cmake .. -DRTAUDIO_API_PULSE=ON -DRTAUDIO_BUILD_TESTING=ON -DCMAKE_INSTALL_PREFIX=$PWD
make -j4
make install

执行完后,在build下生成了librtaudio.so,进入build/tests,执行./record 2 48000 10,就会在build、tests下生成一个10秒的record.pcm文件,执行./playraw 2 48000 record.pcm即可播放这个文件。

采集桌面音频失败

但是经过测试,发现record并不能采集桌面的音频,输入./record 2 48000 10 99,可以显示全部的采集设备:

这时候我们输入1,也就是选择Device #1 Monitor of 内置音频 模拟立体声这个设备,然后执行./playraw 2 48000 record.pcm,发现播放出来音频了。
而RtAudio的getDefaultOutputDevice()默认指向Device #0 内置音频 模拟立体声这个设备,如果我们想要采集当前音频输出,需要对RtAudio源码进行一下修改。
参考OBShttps://unix.stackexchange.com/questions/532042/how-can-i-grab-pulseaudio-output 这篇回答,通过pulse获取到的默认输出设备default_sink_name并不能采集音频,必须连接default_sink_name.monitor来进行监听。
需要修改一下RtAudio.cpp,要修改地方有两处,一个是rt_pa_set_server_info函数,paProbeInfo->defaultSinkName添加一个.monitor后缀:

另一处需要修改的是rt_pa_set_source_info_and_quit函数,需要添加info.isDefaultOutput

修改完后重新编译,再执行

./record 2 48000 10
./playraw 2 48000 record.pcm

就可以正常采集到桌面音频。