ubuntu下使用rtaudio采集桌面音频&扬声器音频
最近在做国产化系统的音频采集,Ubuntu/Kylin/UOS下可以使用PulseAudio来控制音频输入输出,可以直接使用apt install libpulse-dev
获取相关库进行开发。
不过我选择使用封装更好的RtAudio
来进行ubuntu下的音频采集,RtAudio提供了一套跨平台的音频输入输出控制API,而且在linux下除了PulseAudio
,还可以选择ALSA
, JACK
和 OSS
等方式。
编译源码
我是在本地编译的源码,后来发现可以直接使用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源码进行一下修改。
参考OBS
和 https://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
就可以正常采集到桌面音频。