总所周知由于版权问题,mac系统是无法通过api采集扬声器的音量的,一些录屏软件大多采用soundflower,lookloop等插件来实现扬声器的采集。soundflower这种免费的插件已经没人维护了,最新的M1 已经无法使用了。
这里推荐一个免费的支持M1架构的插件blackhole,操作与soundflower类似,创建一个多输出设备,将录制的扬声器设置为该多输出设备,看起来像这样:
在我们使用obs,系统自带的录屏软件时就可以选择该输出设备作为扬声器采集从而实现扬声器音量采集。
如果我们想自己开发软件实现采集该如何实现呢,笔者开始在百度 google一顿乱搜,实在没找到,只能开始自己研究,这里先推荐一款跨平台音频采集开源库RtAudio ,使用非常简单:
RtAudio::StreamParameters parameters;
parameters.deviceId = devId;
parameters.nChannels = m_format.channelCount();
parameters.firstChannel = 0;
unsigned int sampleRate = m_format.sampleRate();
unsigned int bufferFrames = 1024;
try {
adc.openStream(NULL, ¶meters, RTAUDIO_SINT16, sampleRate, &bufferFrames,
&record, this, NULL, AudioDevideErrorCallback);
adc.startStream();
stateChanged(AUDIO_DEVICE_STATE_OK);
} catch (RtAudioError &e) {
e.printMessage();
stateChanged(AUDIO_DEVICE_STATE_ERROR);
qDebug("Speaker audio device open error, code=%d, err=%s, channelcount = %d", (int)e.getType(),
e.getMessage().c_str(), parameters.nChannels);
return;
}
下面开始本章重头戏:
首先我们现在blackhole,记住要下载16ch的,笔者开始下载的2ch的版本,折腾了好几天没有成功,都开始怀疑人生了。
下载后发现blackhole其实跟soundflower一样,是一个驱动库, 如果你直接下载的安装版本,直接安装就好。但是作为一个code多年的人,你可能不局限于此,比如你想免去用户的操作,在自己的软件包中带上blackhole实现程序自动安装,要实现这个也不难,首先下载blackhole安装后,到安装目录把framework拷贝出来
1. 编写安装脚本,我们将该脚本命名为load,内容如下:
echo "load BlackHole"
cd "`dirname "$0"`"
mkdir -p /Library/Audio/Plug-Ins/HAL
cp -rv BlackHole16ch.driver /Library/Audio/Plug-Ins/HAL
chown -R root:wheel /Library/Audio/Plug-Ins/HAL
2. 编写卸载脚本,命名为unload,内容如下:
rm -r /Library/Audio/Plug-Ins/HAL
3. 代码中执行脚本
这里我们需要使用oc 代码来执行脚本
LoadStatus BlackHoleLoader::runScriptFile(const QString &fileName)
{
NSString* scriptPath = [NSString stringWithUTF8String: fileName.toUtf8().data()];
Author