Ubuntu实时读取音乐软件的音频流

文章目录

  • 一. 前言
  • 二. 开发环境
  • 三. 具体操作
  • 四. 实际效果

一. 前言

起因是这样的,我需要在Ubuntu中,实时读取正在播放音乐的音频流,然后对音频进行相关的处理。本来打算使用的Pipewire+Helvum的方式实现,好处是可以直接利用Helvum图形化工具对软件输出的音频进行重定向,但是由于使用的是Ubuntu20.04,默认的音频服务器使用的是PulseAudio,替换为Pipewire后,播放的音频会出现卡顿不流畅,最终还是使用原生的PulseAudio+pavucontrol来实现实时播放的音频的处理。

二. 开发环境

Ubuntu: Ubuntu 20.04.6 LTS

虚拟机: VMware Workstation 17 Pro

音频服务器: PluseAudio

音频IO库: Portaudio

音频驱动: Alsa

开发语言: C/C++

三. 具体操作

举个例子,我们需要在Ubuntu中实时获取QQ音乐目前正在播放的音频流,我们需要按如下步骤进行操作:

1. 创建虚拟设备:


pactl load-module module-null-sink sink_name=music sink_properties=device.description="Virtual_Music_Sink"  

终端输入指令,通过加载module-null-sink模块,PulseAudio 创建了一个虚拟的音频输出设备,其名称为 “music”。该虚拟设备不会直接输出声音,但它会自动生成一个监控源,记录所有发送到该虚拟设备的音频数据。

指令部分作用
pactlPulseAudio 控制工具(PulseAudio Control)
load-module加载一个 PulseAudio 模块
module-null-sink加载 Null Sink 模块,创建一个虚拟音频输出设备
sink_name=music指定新创建的虚拟设备名称为 music
sink_properties=device.description=“Virtual_Music_Sink”设置设备的描述信息,在pavucontrol中显示为 “Virtual_Music_Sink”

2. 设置 QQ 音乐的音频输出:


pavucontrol

终端输入指令,pavucontrol打开(PulseAudio 音量控制工具),在 “Playback” 选项卡中将 QQ 音乐的输出设备改为你刚创建的 “music” 虚拟设备。

3. 将虚拟设备输出到扬声器中:

为了保证你能听到音频,还需要把虚拟设备"music" 的音频输出送到物理扬声器。这可以通过加载module-loopback环回模块实现:


pactl load-module module-loopback source=music.monitor sink=alsa_output.pci-0000_02_02.0.analog-stereo
部分作用
pactlPulseAudio 控制工具(PulseAudio Control)
load-module加载一个 PulseAudio 模块
module-loopback加载 Loopback 模块,用于将音频流从一个设备转发到另一个设备
source=music.monitor指定 音频来源 为 music.monitor(虚拟设备 music 的监控源)
sink=alsa_output.pci-0000_02_02.0.analog-stereo指定音频目标为 alsa_output.pci-0000_02_02.0.analog-stereo(物理扬声器)

需要注意的是:sink后面的物理扬声器信息需要根据自己的电脑来定。

4. 在 PortAudio 中捕捉音频:


// PortAudio回调函数
static int paCallback(const void* inputBuffer, void* outputBuffer,unsigned long framesPerBuffer,const PaStreamCallbackTimeInfo* timeInfo,PaStreamCallbackFlags statusFlags,void* userData)
{return paContinue;
}int main()
{PaStreamParameters inputParameters;inputParameters.device = Pa_GetDefaultInputDevice();inputParameters.channelCount = 1;            inputParameters.sampleFormat = paFloat32;    const PaDeviceInfo* deviceInfo = Pa_GetDeviceInfo(inputParameters.device);inputParameters.suggestedLatency = deviceInfo->defaultLowInputLatency;inputParameters.hostApiSpecificStreamInfo = nullptr;PaStream* stream = nullptr;Pa_OpenStream(&stream,&inputParameters,nullptr,              // 不使用输出流SAMPLE_RATE,FRAMES_PER_BUFFER,paNoFlag,paCallback,nullptr);Pa_StartStream(stream);while(1){}
}

5. pavucontrol修改程序音频入口:


打开pavucontrol后,在Recording中,把启动的应用程序的输入入口修改为Virtual_Music_Sink,这样就把程序的录音入口修改为我们的虚拟设备,由于前面我们使用load-module环回模块,已将QQ音乐中的输出重定向至Virtual_Music_Sink虚拟设备中,那么此时,Portaudio收到的input设备获得的音频流便是QQ音乐输出的音频流。

四. 实际效果

通过上述操作,我们可以采集到的QQ音乐中播放的音频,我们实时去捕捉音频中的节奏点,再通过Implot画出实时的歌曲的音频曲线和节奏信息,效果如下:


如果希望捕获的音频流的延时更低,可以将Ubuntu的内核版本替换为lowlatency低延时版本(默认是Generic Kernel),具体的操作可以参考这篇文章:Ubuntu切换lowlatency内核教程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/74258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【yolo】YOLO训练参数输入之模型输入尺寸

模型输入尺寸是YOLO训练和推理过程中非常重要的参数之一。YOLO要求输入图像的尺寸是固定的,通常为正方形(如416416、640640等)。这个尺寸直接影响模型的性能和速度。以下是对模型输入尺寸的详细介绍: 1. 模型输入尺寸的作用 统一…

【TI MSPM0】Timer学习

一、计数器 加法计数器:每进入一个脉冲,就加一减法计算器:每进入一个脉冲,就减一 当计数器减到0,触发中断 1.最短计时时间 当时钟周期为1khz时,最短计时时间为1ms,最长计时时间为65535ms 当时…

从WebRTC到嵌入式:EasyRTC如何借助大模型提升音视频通信体验

随着人工智能技术的快速发展,WebRTC与大模型的结合正在为音视频通信领域带来革命性的变革。WebRTC作为一种开源实时通信技术,以其低延迟、跨平台兼容性和强大的音视频处理能力,成为智能硬件和物联网设备的重要技术支撑。 而EasyRTC作为基于W…

使用brower use AI 代理自动控制浏览器完成任务

第一步:终端运行命令下载 brower use pip install browser-use 第二步: 终端运行命令下载playwright playwright install 第三步:新建test.py代码,粘贴复制以下代码 import asyncio import osfrom dotenv import load_doten…

自由学习记录(45)

顶点片元着色器(important) 1.需要在Pass渲染通道中编写着色器逻辑 2.可以使用cG或HLSL两种shader语言去编写Shader逻辑 3.代码量较多,灵活性较强,性能消耗更可控,可以实现更多渲染细节 4.适用于光照处理较少&#xf…

Quartus + VScode 实现模块化流水灯

文章目录 一、通过VScode编写Verilog代码二、模块化编程三、代码示例 一、通过VScode编写Verilog代码 1、下载Vscode 2、下载相关插件 搜索Verilog就会弹出有如图所示的插件,下载并安装 3、创建Quartus项目 4、创建完成后点击Tools,选择Options 然后在…

tryhackme——The Lay of the Land

文章目录 一、网络基础设施1.1 内网1.2 DMZ区1.3 网络枚举(Network Enumeration) 二、域环境三、用户和组管理四、安全解决方案4.1 基于主机的安全解决方案4.1.1 防病毒软件4.1.2 Microsoft Windows Defender4.1.3 主机防火墙4.1.4 安全事件记录与监控4.…

STM32---FreeRTOS消息队列

一、简介 1、队列简介: 队列:是任务到任务,任务到中断、中断到任务数据交流的一种机制(消息传递)。 FreeRTOS基于队列,实现了多种功能,其中包括队列集、互斥信号量、计数型信号量、二值信号量…

2025年了,5G还有三个新变化

最近舆论开始讨论5G为什么不火了?5G是不是停滞发展了。 实际上,5G不仅在发展,还迎来了它的升级版5G-A。 在今年西班牙举行的世界移动通信大会上,5G-A就是焦点之一。 被誉为全球通信领域风向标的MWC,汇聚了华为、中兴通…

SQLMesh SCD-2 时间维度实战:餐饮菜单价格演化追踪

场景背景:动态菜单价格管理 考虑某连锁餐厅的菜单管理系统,需要记录食品价格的历史变更轨迹。业务需求包括: 记录每次价格调整的时间点支持历史价格查询(如"2020年1月2日汉堡多少钱")维护当前有效价格清单…

失物招领|校园失物招领系统|基于Springboot的校园失物招领系统设计与实现(源码+数据库+文档)

校园失物招领系统目录 目录 基于Springboot的校园失物招领系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、 管理员功能实现 (1) 失物招领管理 (2) 寻物启事管理 (3) 公告管理 (4) 公告类型管理 2、用户功能实现 (1) 失物招领 (2) 寻物启事 (3) 公告 …

基于BClinux8部署Ceph 19.2(squid)集群

#作者&#xff1a;闫乾苓 文章目录 1.版本选择Ceph版本发布历史目前官方在维护的版本 2.部署方法3.服务器规划4.前置配置4.1系统更新4.2配置hosts cat >> /etc/hosts << EOFssh-keygenssh-copy-id ceph01ssh-copy-id ceph02ssh-copy-id ceph034.5 Python34.6 Syst…

安装React开发者工具

我们在说组件之前&#xff0c;需要先安装一下React官方推出的开发者工具&#xff0c;首先我们分享在线安装方式 首先打开谷歌网上应用商店(针对谷歌浏览器)&#xff0c;在输入框内搜索react&#xff0c;安装如下插件&#xff1a; 注意安装提供方为Facebook的插件&#xff0c;这…

linux中如何修改文件的权限和拥有者所属组

目录标题 chmod指令八进制形式权限修改文件拥有者所属组的修改umask有关内容 chmod指令 chmod指令可以用来修改人员的权限其形式如下&#xff1a; u代表的是拥有者&#xff0c;g代表的是所属组&#xff0c;o代表的是其他人&#xff0c;a表示所有人&#xff0c;如果你想增加权…

三主热备架构

1.要求 角色主机名软件IP地址用户client192.168.72.90keepalivedvip192.168.72.100masterserverAkeepalived, nginx192.168.72.30backupserverBkeepalived, nginx192.168.72.31backupserverCkeepalived, nginx192.168.72.32webtomcat1tomcat192.168.72.41webtomcat2tomcat192.1…

windows 10 系统配置Node

目录 什么是Node.js 什么是Npm Node.js环境搭建 下载 解压 配置环境变量 npm配置 如何运行下载的Node.js项目 什么是Node.js 在 Node.js 之前&#xff0c;JavaScript 只能运行在浏览器中&#xff0c;作为网页脚本使用&#xff0c;为网页添加一些特效&#xff0c;或者和…

Windows Server 2025 使用 IIS 搭建 ASP.NET 3.5 网站

开启远程桌面 参考文章Windows server开启远程桌面教程打开服务管理器。ECS 配置安全组&#xff0c;开启 3389Telnet 验证网络联通性 telnet x.x.x.x 338安装 Windows App&#xff0c;登录验证 安装 ASP.NET 3.5 1.参考文章Windows Server 2012安装 .NET Framework 3.5和 Wi…

开源模型应用落地-shieldgemma-2-4b-it模型小试-多模态内容安全检测(一)

一、前言 在人工智能迅速发展的过程中,内容安全成为AI应用中的一个重要挑战。谷歌团队于2025年3月推出了一款名为ShieldGemma-2-4B-IT的模型,它以创新的多模态安全检测能力,为行业树立了新的开源责任AI标准。 与早期的仅支持文本审核的版本相比,ShieldGemma-2-4B-IT在谷歌的…

【数据预测】基于遗传算法GA的LSTM光伏功率预测 GA-LSTM光伏功率预测【Matlab代码#91】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 遗传算法GA2. 长短期记忆网络LSTM3. 基于GA-LSTM的光伏功率预测4. 部分代码展示5. 运行结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】 …

openEuler24.03 LTS下安装Hadoop3完全分布式

目录 Linux准备 openEuler24.03 LTS简介 下载openEuler24.03 LTS 安装openEuler24.03 LTS Linux基本设置 关闭及禁用防火墙 修改主机名 静态ip 映射主机名 创建普通用户 目录准备 克隆主机 配置机器之间免密登录 编写分发脚本 安装Java 下载Java 解压 设置环…