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.rhkb.cn/news/38603.html

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

相关文章

CUDA 学习(4)——CUDA 编程模型

CPU 和 GPU 由于结构的不同,具有不同的特点: CPU:擅长流程控制和逻辑处理,不规则数据结构,不可预测存储结构,单线程程序,分支密集型算法GPU:擅长数据并行计算,规则数据结…

前端会话控制技术:cookie/session/token

目录 前端中的 Cookie、Session 和 Token:详解与应用1. Cookie1.1 什么是 Cookie?1.2 Cookie 的工作原理1.3 Cookie 的特点1.4 Cookie 的用途1.5 Cookie 的安全性 2. Session2.1 什么是 Session?2.2 Session 的工作原理2.3 Session 的特点2.4…

MATLAB实现基于“蚁群算法”的AMR路径规划

目录 1 问题描述 2 算法理论 3 求解步骤 4 运行结果 5 代码部分 1 问题描述 移动机器人路径规划是机器人学的一个重要研究领域。它要求机器人依据某个或某些优化原则 (如最小能量消耗,最短行走路线,最短行走时间等),在其工作空间中找到一…

Shopify Checkout UI Extensions

结账界面的UI扩展允许应用开发者构建自定义功能,商家可以在结账流程的定义点安装,包括产品信息、运输、支付、订单摘要和Shop Pay。 Shopify官方在去年2024年使用结账扩展取代了checkout.liquid,并将于2025年8月28日彻底停用checkout.liquid…

电阻的阻值识别

电阻买回来是有偏差的,不同的电阻种类,它的偏差大小会不一样,偏差越小的肯定越贵 主要看要求的精度要求是否越高 色环电阻或者说插件电阻 用来读数的几个色环它是比较靠近的,精度的色环跟用来读数的几个色环的间距会大一点点。 间…

quartz.net条件执行

quartz.net条件执行 在使用Quartz.NET时,你可能需要基于某些条件来决定是否执行一个任务。Quartz.NET本身并不直接支持基于条件执行任务的功能,但你可以通过一些策略来实现这一需求。下面是一些方法来实现基于条件的任务执行: 1. 使用触发器…

计算机操作系统(四) 操作系统的结构与系统调用

计算机操作系统(四) 操作系统的结构与系统调用 前言一、操作系统的结构1.1 简单结构1.2 模块化结构1.3 分层化结构1.4 微内核结构1.5 外核结构 二、系统调用1.1 系统调用的基本概念1.2 系统调用的类型 总结(核心概念速记)&#xf…

NSSCTF(MISC)——[SUCTF 2018 招新赛]single-dog

相应的做题地址:https://www.nssctf.cn/problem/2324 分离图片 在1.txt中得到一段颜文字 http://www.hiencode.com/aaencode.html 解密得到flag

低功耗蓝牙(BLE)方案设计实战指南

一、BLE方案设计工具链 1. 硬件选型与开发平台 TI平台:CC2540/CC2541芯片,使用SmartRF Flash Programmer烧录Nordic平台:nRF51822芯片,使用nRFgo Studio管理协议栈常用调试工具:TI CC Debugger、J-Link(SW…

网络基础(一)

独立模式与网络互联 独立模式: 计算机之间相互独立。 网络互联:多台计算机连接在一起,完成数据共享。 注意:无论是主机内还是主机外,都是通过线来进行连接的,主机内线(线比较短)的连接主要考虑…

用Canvas 画布样式实现旋转的阴阳图

用Canvas 画布样式实现旋转的阴阳图 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Canvas八卦图动画</title><style>/* 重置所有元素的默认样式 */* {padding: 0;margin: 0;box-sizin…

第16届蓝桥杯单片机4T模拟赛三

本次模拟赛涉及的模块&#xff1a;基础三件套&#xff08;Led&Relay&#xff0c;按键、数码管&#xff09; 进阶单件套&#xff08;pcf8591的AD模块&#xff09; 附件&#xff1a; 各模块底层代码在文章的结尾 一、数码管部分 1.页面1 页面1要显示的格式是&#xff1a; …

优选算法的睿智之林:前缀和专题(一)

专栏&#xff1a;算法的魔法世界 个人主页&#xff1a;手握风云 目录 一、前缀和 二、例题讲解 2.1. 一维前缀和 2.2. 二维前缀和 2.3. 寻找数组的中心下标 2.4. 除自身以外数组的乘积 一、前缀和 前缀和算法是一种用于处理数组或序列数据的算法&#xff0c;其核心思想是…

瑞萨RX23E系列开发(二)建立工程

新建工程 使用倒数第二个模板 选择路径 我这里是这个型号。根据型号选择芯片 第一次需要下载FIT

【算法day19】括号生成——数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

括号生成 https://leetcode.cn/problems/generate-parentheses/description/ 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 左括号数必须大于右括号数&#xff0c;且小于等于n class Solution { publ…

Apache Doris学习

https://doris.apache.org/zh-CN/docs/gettingStarted/what-is-apache-doris 介绍 Apache Doris 是一款基于 MPP 架构&#xff08;大规模并行处理&#xff09;的高性能、实时分析型数据库。它以高效、简单和统一的特性著称&#xff0c;能够在亚秒级的时间内返回海量数据的查询…

基于springboot的新闻推荐系统(045)

摘要 随着信息互联网购物的飞速发展&#xff0c;国内放开了自媒体的政策&#xff0c;一般企业都开始开发属于自己内容分发平台的网站。本文介绍了新闻推荐系统的开发全过程。通过分析企业对于新闻推荐系统的需求&#xff0c;创建了一个计算机管理新闻推荐系统的方案。文章介绍了…

Jboss漏洞再现

一、CVE-2015-7501 1、开环境 2、访问地址 / invoker/JMXInvokerServlet 出现了让下载的页面&#xff0c;说明有漏洞 3、下载ysoserial工具进行漏洞利用 4、在cmd运行 看到可以成功运行&#xff0c;接下来去base64编码我们反弹shell的命令 5、执行命令 java -jar ysoserial-…

(二)VMware:VMware虚拟机安装CentOS教程

目录 1、准备CentOS 7镜像1.1、官网镜像下载1.2、清华大学开源镜像下载​1.3、阿里云开源镜像下载 2、使用 VMware安装CentOS 72.1、创建虚拟机2.2、选择自定义安装2.3、硬件兼容性&#xff0c;保持默认2.4、选择下载的ISO镜像2.5、设置虚拟机名称以及存放磁盘位置2.6、按照需求…

哈尔滨工业大学DeepSeek公开课人工智能:从图灵测试到DeepSeek|附视频和PPT下载方法

导 读 INTRODUCTION 今天给大家分享一份哈尔滨工业大学发布的《从图灵测试到DeepSeek》&#xff0c;由哈尔滨工业大学人工智能学院执行院长兼计算学部副主任张伟男教授带你穿越AI发展简史&#xff0c;解锁从图灵测试的奠基性思想到DeepSeek大模型的技术突破&#xff0c;带你领…