【C++】开源:Linux端ALSA音频处理库
😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍Linux端ALSA音频处理库。
无专精则不能成,无涉猎则不能通。。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞
文章目录
- :smirk:1. 项目介绍
- :blush:2. 环境配置
- :satisfied:3. 使用说明
😏1. 项目介绍
项目Github地址:https://github.com/alsa-project/alsa-lib
ALSA(Advanced Linux Sound Architecture)是Linux操作系统上的音频处理框架。它提供了对音频设备的抽象和控制,使应用程序能够与音频硬件进行交互。
ALSA库是ALSA项目的一部分,它为开发者提供了一组API(应用程序编程接口),用于与音频设备进行通信。以下是ALSA库的一些主要特点和功能:
1.音频设备访问:ALSA库允许应用程序以底层的方式访问音频硬件设备,如声卡、麦克风、扬声器等。它提供了一套丰富的API,用于打开、关闭、读取和写入音频设备。
2.多通道支持:ALSA库支持多通道音频处理,允许应用程序同时处理多个音频流,并在不同的通道上进行独立控制和处理。这对于音频混音、空间处理和音频录制等场景非常有用。
3.低延迟音频处理:ALSA库被设计为支持低延迟音频处理,这对于实时音频应用程序(如音频编辑软件、游戏和电话会议)至关重要。它提供了一些特性和配置选项,帮助减少音频传输和处理的延迟。
4.硬件控制和参数设置:ALSA库允许应用程序直接访问音频设备的硬件控制参数,如采样率、声道数、音量和音效等。开发者可以使用ALSA库来配置和控制音频设备以满足具体需求。
5.MIDI支持:除了音频处理,ALSA库还提供了对MIDI(Musical Instrument Digital Interface)设备的支持。它允许应用程序通过ALSA API与MIDI设备进行通信,实现音乐合成、音序器和控制器等功能。
ALSA库是一个功能强大且广泛使用的音频处理工具,可用于创建各种音频应用程序,包括音乐播放器、音频编辑器、语音识别和合成系统等。它提供了灵活的接口和丰富的功能,使开发者能够轻松地与音频设备进行交互,并实现高质量的音频处理。
😊2. 环境配置
下面进行安装运行:
# apt安装
sudo apt install libasound2-dev
# g++编译时 -lasound
# 源码编译
./configure
make
sudo make install
😆3. 使用说明
音量控制示例:
#include <iostream>
#include <alsa/asoundlib.h>int main() {// 打开默认音频设备snd_mixer_t *handle;int res = snd_mixer_open(&handle, 0);if (res < 0) {std::cerr << "无法打开音频设备" << std::endl;return 1;}// 设置音频设备为非阻塞模式res = snd_mixer_attach(handle, "default");if (res < 0) {std::cerr << "无法附加到音频设备" << std::endl;snd_mixer_close(handle);return 1;}res = snd_mixer_selem_register(handle, NULL, NULL);if (res < 0) {std::cerr << "无法注册音频元素" << std::endl;snd_mixer_close(handle);return 1;}res = snd_mixer_load(handle);if (res < 0) {std::cerr << "无法加载音频设备" << std::endl;snd_mixer_close(handle);return 1;}// 获取默认音频元素snd_mixer_selem_id_t *sid;snd_mixer_selem_id_alloca(&sid);snd_mixer_selem_id_set_index(sid, 0);snd_mixer_selem_id_set_name(sid, "Master");snd_mixer_elem_t* elem = snd_mixer_find_selem(handle, sid);if (!elem) {std::cerr << "无法找到音频元素" << std::endl;snd_mixer_close(handle);return 1;}// 获取音量范围long minVolume, maxVolume;snd_mixer_selem_get_playback_volume_range(elem, &minVolume, &maxVolume);// 增加音量long volume;snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_FRONT_LEFT, &volume);std::cout << "当前音量:" << volume << "/" << maxVolume << std::endl;long newVolume = volume + 10; // 增加10单位的音量if (newVolume > maxVolume) {newVolume = maxVolume;}snd_mixer_selem_set_playback_volume(elem, SND_MIXER_SCHN_FRONT_LEFT, newVolume);std::cout << "增加音量后的音量:" << newVolume << "/" << maxVolume << std::endl;// 关闭音频设备snd_mixer_close(handle);return 0;
}
编译运行:
g++ volume_control.cpp -o volume_control -lasound
./volume_control
读取并播放pcm音频文件:
#include <alsa/asoundlib.h>int main() {// 打开默认的音频设备snd_pcm_t *pcm;if (snd_pcm_open(&pcm, "default", SND_PCM_STREAM_PLAYBACK, 0) < 0) {printf("无法打开音频设备\n");return -1;}// 配置音频参数snd_pcm_set_params(pcm,SND_PCM_FORMAT_S16_LE, // 采样格式为16位小端SND_PCM_ACCESS_RW_INTERLEAVED,2, // 通道数为2(立体声)44100, // 采样率为44100Hz1, // 精确度为1微秒50000); // 缓冲大小设置为50000字节// 读取音频数据并播放char buffer[1024];FILE* file = fopen("audio.pcm", "rb"); // 以二进制只读方式打开音频文件if (file) {while (!feof(file)) {size_t bytesRead = fread(buffer, 1, sizeof(buffer), file);snd_pcm_writei(pcm, buffer, bytesRead/4); // 将音频数据写入音频设备}fclose(file);} else {printf("无法打开音频文件\n");}// 关闭音频设备snd_pcm_drain(pcm);snd_pcm_close(pcm);return 0;
}
编译运行:
g++ audio.cpp -o audio -lasound
./audio
mp3与pcm格式转换:
# 可以用ffmpeg命令行工具
ffmpeg -i input.mp3 -f s16le -acodec pcm_s16le output.pcm
#-i input.mp3:指定输入的MP3文件。
#-f s16le:指定输出格式为16位有符号PCM数据。
#-acodec pcm_s16le:选择PCM编码器,指定16位有符号的采样格式。
以上。
相关文章:

【C++】开源:Linux端ALSA音频处理库
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Linux端ALSA音频处理库。 无专精则不能成,无涉猎则不能通。。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,…...

【Linux | Shell】结构化命令2 - test命令、方括号测试条件、case命令
目录 一、概述二、test 命令2.1 test 命令2.2 方括号测试条件2.3 test 命令和测试条件可以判断的 3 类条件2.3.1 数值比较2.3.2 字符串比较 三、复合条件测试四、if-then 的高级特性五、case 命令 一、概述 上篇文章介绍了 if 语句相关知识。但 if 语句只能执行命令,…...

基于单片机的语音识别智能垃圾桶垃圾分类的设计与实现
功能介绍 以51单片机作为主控系统;液晶显示当前信息和状态;通过语音识别模块对当前垃圾种类进行语音识别; 通过蜂鸣器进行声光报警提醒垃圾桶已满;采用舵机控制垃圾桶打开关闭;超声波检测当前垃圾桶满溢程度࿱…...

最新版本docker 设置国内镜像源 加速办法
解决问题:加速 docker 设置国内镜像源 目录: 国内加速地址 修改方法 国内加速地址 1.Docker中国区官方镜像 https://registry.docker-cn.com 2.网易 http://hub-mirror.c.163.com 3.ustc https://docker.mirrors.ustc.edu.cn 4.中国科技大学 https://docker.mirrors…...

深度学习——LSTM解决分类问题
RNN基本介绍 概述 循环神经网络(Recurrent Neural Network,RNN)是一种深度学习模型,主要用于处理序列数据,如文本、语音、时间序列等具有时序关系的数据。 核心思想 RNN的关键思想是引入了循环结构,允许…...

three.js入门二:相机的zoom参数
环境: threejs:129 (在浏览器的控制台下输入: window.__THREE__即可查看版本)vscodewindowedge 透视相机或正交相机都有一个zoom参数,它可以用来将相机排到的内容在canvas上缩放显示。 注意:…...
sql语法树(select)实例
在SELECT节点下,将"*"(表示选择所有列)添加为子节点。下面是一个简单的SQL语句示例: SELECT * FROM customers WHERE age > 25 AND city New York;语法树(Syntax Tree)是由SQL解析器构建的…...

爬虫002_python程序的终端运行_文件运行_ipython的使用---python工作笔记020
用python运行一个文件,就是要写一个.py结尾的文件 然后保存 然后直接cmd中,python 然后写上py文件的路径就可以了 然后看一下内容 看一下终端中运行,直接输入python进入python环境,然后写python代码 回车运行 退出可以用exit()...

智融SW3518S降压协议IC一款适合车充控制芯片
描述 SW3518S 是一款高集成度的多快充协议双口充电芯片, 支持 AC 口任意口快充输出, 支持双口独立限流。 其集成了 5A 高效率同步降压变换器, 支持 PPS/PD/QC/AFC/FCP/SCP/PE/SFCP/VOOC等多种快充协议, 最大输出 PD 100Wÿ…...

虹科活动 | 虹科ADAS自动驾驶研讨会
虹科ADAS/自动驾驶研讨会将于8月7日在上海闵行展开——加快ADAS/AD开发步伐! 期待您的参与!...
LeetCode-每日一题-将数组和减半的最少操作次数
2208. 将数组和减半的最少操作次数 提示 中等 49 相关企业 给你一个正整数数组 nums 。每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。(注意,在后续操作中你可以对减半过的数继续执行操作) 请你返…...
97、Kafka的性能好在什么地方
Kafka的性能好在什么地方 一、顺序写二、零拷贝三、额外补充 kafka不基于内存,而是硬盘存储,因此消息堆积能力更强 一、顺序写 顺序写 : 利用磁盘的顺序访问速度可以接近内存,kafka的消息都是append操作,partition是有序的&#…...

(2)前端控制器的扩展配置, 视图解析器类型以及MVC执行流程的概述
SpringMVC入门程序的扩展说明 注册前端控制器的细节 在web.xml文件注册SpringMVC的前端控制器DispatcherServlet时使用url-pattern标签中使用/和/*的区别 /可以匹配.html或.js或.css等方式的请求路径,但不匹配*.jsp的请求路径/*可以匹配所有请求(包括.jsp请求), 例如在过滤器…...
GO学习之切片操作
GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 文章目录 GO系列前言一、什么是切片(和数组有什么关系)二、切片基本操作2.1 切片定义2.2 添加元素2.3 删除元素2.4 遍历2.5 自定…...

YOLOv8实战口罩佩戴检测(视频教程)
课程链接:https://edu.csdn.net/course/detail/38827 口罩佩戴检测可以应用于公共场所的安全管理、疫情防控监测等多种场景。YOLOv8是前沿的目标检测技术,它基于先前 YOLO 版本在目标检测任务上的成功,进一步提升性能和灵活性。 本课程使用…...

SiddonGpu编译过程记录
1. 还是想要能够快速生成DRR,用了这个up的代码GitHub - fabio86d/CUDA_DigitallyReconstructedRadiographs: GPU accelerated python library for generation of Digitally Reconstructed Radiographs (March 2018) 在看步骤的时候不是很清晰。尤其是procedure to…...
Ubuntu 20.04使用 VNC远程桌面连接避坑指南
自从开始使用Ubuntu 20.04搭建深度学习服务器,就想到使用VNC远程桌面连接使用。可是之前一直使用的是Ubuntu18.04,心里想着设置应该不难,结果在配置的时候总出现无法连接的错误。下面我就分享一下我使用TigerVNC配置远程桌面连接过程中遇到的…...

STM32MP157驱动开发——按键驱动(定时器)
内核函数 定时器涉及函数参考内核源码:include\linux\timer.h 给定时器的各个参数赋值: setup_timer(struct timer_list * timer, void (*function)(unsigned long),unsigned long data):设置定时器:主要是初始化 timer_list 结…...

基于Centos 7虚拟机的磁盘操作(添加磁盘、分区、格式分区、挂载)
目录 一、添加硬盘 二、查看新磁盘 三、磁盘分区 3.1新建分区 3.2 格式分区 3.3 挂载分区 3.4 永久挂载新分区 3.5 取消挂载分区 一、添加硬盘 1.在虚拟机处选择编辑虚拟机设置,然后选择添加 2.选择硬盘,然后选择下一步 3.默认即可,下一步…...
“完全指南:理解API和商品详情的作用和关系“
当涉及到电子商务和在线交易时,API和商品详情是两个至关重要的概念。本文将为您提供一个详尽的指南,帮助您全面理解API和商品详情之间的作用和关系。 淘宝/天猫获得淘宝商品详情 API 返回值说明 公共参数 请求地址 名称类型必须描述keyString是调用…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...