【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,                   // 采样率为44100Hz
                       1,                        // 精确度为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位有符号的采样格式。

在这里插入图片描述

以上。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows数据类型LPSTR学习

Windows在C语言的基础之上又定义了一些Windows下的数据类型&#xff1b;下面学习一下LPSTR&#xff1b; LPSTR和LPWSTR是Win32和VC所使用的一种字符串数据类型。LPSTR被定义成是一个指向以NULL(‘\0’)结尾的32位ANSI字符数组指针&#xff0c;而LPWSTR是一个指向以NULL结尾的64…

代码版本管理工具 git

1. 去B站看视频学习&#xff0c;只看前39集&#xff1a; 01-Git概述&#xff08;Git历史&#xff09;_哔哩哔哩_bilibili 2.学习Linux系统文本编辑器的使用 vi编辑器操作指令分享 (baidu.com) (13条消息) nano编辑器的使用_SudekiMing的博客-CSDN博客 windows下载安装Git官…

电路原理分析1

d2的作用是提供一个1.25v的电平 r3、r4的作用都是限流 c1是滤波 运放的4、8脚是常规的外围 这个运放是一个运算放大电路 具体计算是这样的&#xff1a; 按照虚短原则&#xff0c;输入的信号Uinu1,输出的信号Uoutu3 按照虚断原则&#xff0c;i1i2i5i5 u1/r2i1i5&#xff…

Longhorn vs Rook vs OpenEBS vs Portworx vs IOMesh:细说 5 款 K8s 持久化存储产品优劣势

云原生时代下&#xff0c;越来越多的企业开始使用 Kubernetes&#xff08;K8s&#xff09;承载数据库、消息中间件等“生产级”有状态工作负载。由于这些应用对数据持久保存、性能、容量扩展和快速交付具有较高的要求&#xff0c;企业往往需要采用专为 Kubernetes 环境设计的持…

wxwidgets Ribbon使用简单实例

// RibbonSample.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <wx/wx.h> #include "wx/wxprec.h" #include "wx/app.h" #include "wx/frame.h" #include "wx/textctrl.h" #include "…

教雅川学缠论02-K线

传统行情上的K线是下图中这样子的 而在缠论中K线是下面这样子的&#xff0c;它没有上影线和下影线 下图是武汉控股2023年7月的日K线 接下来我们将它转换成缠论K线&#xff08;画图累死我了&#xff09; K线理解了我们才能进行下一步&#xff0c;目前位置应该很好理解的

压缩算法的原理丨基因型vcf文件为什么压缩后发生了什么?

压缩算法的本质 最近碰到一个神奇的现象&#xff0c;一份大小为16GB的xx.vcf.gz文件&#xff0c;解压之后体积变为600GB的vcf文件&#xff0c;为什么一份文件经过压缩后体积缩小了这么多&#xff1f; (work) [bio notes 21:29:40 ~/work/20230726/data]$ ls -lh总用量 620GB-…

OnnxRuntime TensorRT OpenCV::DNN性能对比(YoloV8)实测

1. 前言 之前把ORT的一套推理环境框架搭好了,在项目中也运行得非常愉快,实现了cpu/gpu,fp32/fp16的推理运算,同onnx通用模型在不同推理框架下的性能差异对比贴一下,记录一下自己对各种推理框架的学习状况 YoloV8模型大小 模型名称参数量NANO3.2M...... 2. CPU篇 CPU推理框架性…

机器人状态估计:robot_localization 功能包高级参数详解

机器人状态估计&#xff1a;robot_localization 功能包高级参数详解 前言功能包简介相关参数高级参数 前言 移动机器人的状态估计需要用到很多传感器&#xff0c;因为对单一的传感器来讲&#xff0c;都存在各自的优缺点&#xff0c;所以需要一种多传感器融合技术&#xff0c;将…

扫地机语音提示芯片,智能家居语音交互首选方案,WT588F02B-8S

智能家居已经成为现代家庭不可或缺的一部分&#xff0c;而语音交互技术正是智能家居的核心。在智能家居设备中&#xff0c;扫地机无疑是最受欢迎的产品之一。然而&#xff0c;要实现一个更智能的扫地机&#xff0c;需要一颗语音提示芯片&#xff0c;以提供高质量的语音交互体验…

【MySQL】表的内外连接

目录 一、内连接二、外连接2.1 左外连接2.2 右外连接 三、OJ题 表的连接分为内连和外连 一、内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选&#xff0c;我们前面学习的查询都是内连接&#xff0c;也是在开发过程中使用的最多的连接查询。 语法&#x…

Feign API模块导入的两种方式

说明&#xff1a;在微服务框架中&#xff0c;会把其他微服务用到的FeignClient统一放到一个模块里面&#xff0c;称为FeignAPI&#xff0c;其他微服务需要使用FeignClient&#xff0c;可以引入FeignAPI的Maven坐标。 但是只引入FeignAPI的坐标还不行&#xff0c;FeignAPI中的B…

自动化测试:让软件测试更高效更愉快!

谈谈那些实习测试工程师应该掌握的基础知识&#xff08;一&#xff09;_什么时候才能变强的博客-CSDN博客https://blog.csdn.net/qq_17496235/article/details/131839453谈谈那些实习测试工程师应该掌握的基础知识&#xff08;二&#xff09;_什么时候才能变强的博客-CSDN博客h…

STM32CubeMX v6.9.0 BUG:FLASH_LATENCY设置错误导致初始化失败

背景 今天在调试外设功能时&#xff0c;发现设置了使用外部时钟之后程序运行异常&#xff0c;进行追踪调试并与先前可以正常运行的项目进行对比之后发现这个问题可能是由于新版本的STM32CubeMX配置生成代码时的BUG引起的。 测试环境 MCU: STM32H750VBT6 STM32CubeIDE: Versi…

WEB:Web_python_template_injection

背景知识 python模板注入 ssit 题目 打开题目&#xff0c;发现页面提示&#xff0c;翻译为python模板注入 先测试是否存在注入 可以发现被执行了 先查看所有的子类 payload {{[].__class__.__base__.__subclasses__()}} 利用site.Printer的os模块执行命令 payload {{.__…

路由器工作原理

路由器原理 路由概述 路由&#xff1a;跨越从源主机到目标主机的一个互联网络来转发数据包的过程。&#xff08;为数据包选择路径的过程&#xff09; 作用&#xff1a;路由器是连接不同网段的。 转发依据&#xff1a; 路由表&#xff1a;路径选择全看路由表&#xff0c;根…

Memcached服务分布式集群如何实现?

Memcached服务分布式集群如何实现? 在分布式系统中&#xff0c;为了提高可用性、性能和扩展性&#xff0c;通常会使用多台服务器来构建一个Memcached集群。Memcached是一个高性能的分布式内存缓存系统&#xff0c;可以用于缓存数据以减轻数据库或其他后端存储的负载。 以下我们…

JavaEE——Bean的生命周期

目录 1、实例化Bean 2、设置Bean的属性 3、初始化Bean &#xff08;1&#xff09;、执行通知 &#xff08;2&#xff09;、初始化的前置方法 &#xff08;3&#xff09;、初始化方法 &#xff08;4&#xff09;、执行自定义方法 &#xff08;5&#xff09;、初始化的后置…

为什么要有虚拟内存?

操作系统是通过内存分段和内存分页的方式管理虚拟内存地址和物理内存地址之间的关系 内存分段 程序是由若干个逻辑分段组成的&#xff0c;代码分段、数据分段、栈段、堆段组成&#xff0c;不同的段有不同的属性&#xff0c;所以就用分段的形式分离开。 分段机制下的虚拟内存…

RocketMQ集群4.9.2升级4.9.6版本

本文主要记录生产环境短暂停机升级RocketMQ版本的过程 一、整体思路 1.将生产环境MQ4.9.2集群同步到测试环境&#xff0c;并启动&#xff0c;确保正常运行。 2.参照4.9.2配置4.9.6集群 3.停掉4.9.2集群&#xff0c;启动4.9.6集群&#xff0c;测试确保正常运行。 4.停掉4.9.6集…