【C++】开源:Linux端ALSA音频处理库

news2024/11/25 11:19:27

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍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位有符号的采样格式。

在这里插入图片描述

以上。

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

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

相关文章

12.(开发工具篇vscode+git)vscode 不能识别npm命令

1&#xff1a;vscode 不能识别npm命令 问题描述&#xff1a; 解决方式&#xff1a; &#xff08;1&#xff09;右击VSCode图标&#xff0c;选择以管理员身份运行&#xff1b; &#xff08;2&#xff09;在终端中执行get-ExecutionPolicy&#xff0c;显示Restricted&#xff…

vue2项目迁移到vue3中的改动——基础积累

最近在跟着大神学习vue3的内容&#xff0c;发现之前vue2写的代码可以直接照搬到vue3中&#xff0c;但是有一些需要改动的内容&#xff0c;下面做一下记录。 1.定义对象时&#xff0c;需要指定每个属性值 例如&#xff1a;listQuery:{} 如果使用&#xff1a;listQuery.Filter…

vue3+elementplus后台管理系统,实现侧边栏菜单显示到主内容区域

目录 1 创建页面2 设置路由3 修改首页4 首页的完整代码总结 我们已经使用vue3和elmentplus初步搭建了首页&#xff0c;上一篇中有个问题没解决&#xff0c;就是在侧边栏导航功能里&#xff0c;如果点击菜单希望是在首页打开页面而不是跳转到新页面。以下是我们希望实现的效果 这…

B/B+树算法

B树 基本概述 B树又称多路平衡搜索树。一棵m阶B树&#xff0c;要么是空树&#xff0c;要么满足以下特性&#xff1a; 每个节点最多有m棵子树根节点至少有两棵子树内部节点&#xff08;除根和叶子节点以外的节点&#xff09;至少有⌈m/2⌉棵子树关键字个数比子树个数少1终端节…

字符函数和字符串函数解析及模拟实现

字符函数和字符串函数解析及模拟实现 1. 求字符串长的函数1.1[strlen](https://legacy.cplusplus.com/reference/cstring/strlen/?kwstrlen)1.2 strlen()模拟实现 2. 长度不受限制的字符串函数2.1[strcpy](https://legacy.cplusplus.com/reference/cstring/strcpy/?kwstrcpy)…

数据结构与算法——什么是队列(队列存储结构)

队列&#xff0c;和栈一样&#xff0c;也是一种对数据的"存"和"取"有严格要求的线性存储结构。 与栈结构不同的是&#xff0c;队列的两端都"开口"&#xff0c;要求数据只能从一端进&#xff0c;从另一端出&#xff0c;如下图所示&#xff1a; 通…

vue中使用jsMind生成思维导图 截图功能踩坑

npm i jsmind先安装&#xff0c;再引入 import jsmind/style/jsmind.css import jsMind from jsmind/js/jsmind.js require(jsmind/js/jsmind.draggable.js) require(jsmind/js/jsmind.screenshot.js)正常引入是这样的&#xff0c;然后渲染也没问题 <template><div …

vue 快速自定义分页el-pagination

vue 快速自定义分页el-pagination template <div style"text-align: center"><el-paginationbackground:current-page"pageObj.currentPage":page-size"pageObj.page":page-sizes"pageObj.pageSize"layout"total,prev,…

uni-app中的uni.requireNativePlugin()

这个方法是用来引入原生插件的方法&#xff0c;自 HBuilderX 1.4 版本起&#xff0c;uni-app 支持引入原生插件&#xff0c;使用方式如下&#xff1a; const PluginName uni.requireNativePlugin(PluginName); // PluginName 为原生插件名称 引入插件的类型有三种&#xff1…

(二)RabbitMQ【安装Erlang、安装RabbitMQ 、账户管理、管控台、Docker安装 】

Lison <dreamlison163.com>, v1.0.0, 2023.06.22 RabbitMQ【安装Erlang、安装RabbitMQ 、账户管理、管控台、Docker安装 】 文章目录 RabbitMQ【安装Erlang、安装RabbitMQ 、账户管理、管控台、Docker安装 】**安装Erlang**安装RabbitMQ账户管理管控台Docker安装RabbitM…

添加USB转串口设备驱动-迅为i.MX8M开发板

对于通过 USB 接口访问的模块&#xff0c;在 Linux 内核中集成 USB 驱动程序。我们需要配置内核选中支持 GSM 和 CDMA 模块的 USB 转串口驱动 > Device Drivers -> USB support (USB_SUPPORT [y]) -> USB Serial Converter support (USB_SERIAL [y]) -> USB driver…

Chrome 115 有哪些值得关注的新特性?

今天带大家一起来了解一下 Chrome 115 值得关注的新特性。 滚动动画 用滚动驱动的动画是网站上非常常见的用户体验模式&#xff0c;比如当页面向前或向后滚动时&#xff0c;对应的动画也会向前或向后移动。 比如下面图中这种比较常见的&#xff0c;页面顶部的进度条随着滚动…

Visual Studio 2022 从下载安装到如何使用的全面讲解 (图文详解)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言&#x1f4ac; Visual Studio 2022 的介绍&#x1f4ad; Visual Studio 2022 的下载⌨️ 安装…

SPECjvm2008_1_01 openjdk8 x86_64 ARM64 运行时长、成绩 Run is valid, but not compliant

i5-9600k 架构&#xff1a; x86_64CPU 运行模式&#xff1a; 32-bit, 64-bitAddress sizes: 39 bits physical, 48 bits virtual字节序&#xff1a; Little Endian CPU: 6在线 CPU 列表&#xff1a; …

逻辑分析仪分析NEC协议

这里主要学习使用逻辑分析仪&#xff0c;记录一下。 这位兄弟讲得很清楚&#xff1a; https://blog.csdn.net/u013606261/article/details/112977378 这张图也不错&#xff0c;拿来用 这是淘宝上20多块钱的逻辑分析仪 录下的&#xff1a; HS0038B 这个红外一体化接收头&…

工业智能网关实现PLC控制柜实时监测,让污水泵站管理更加方便

随着工业经济与技术的不断发展&#xff0c;自动化控制技术在更多领域得到应用&#xff0c;在农村污水中&#xff0c;污水泵站作为重要的基础设施&#xff0c;其自动化程度直接影响到系统的运行效率&#xff0c;监控能力则影响到系统的运维质量。可编程逻辑控制器(PLC)作为一种实…

GB28181设备接入侧如何支持H.265?

技术背景 一直以来&#xff0c;GB28181-2022之前的规范版本让人诟病的一点&#xff1a;没有明确针对H.265的说明&#xff0c;特别是监控摄像机&#xff0c;H.265已然成为标配&#xff0c;GB/T28181-2022规范&#xff0c;终于针对H.265做了明确的说明&#xff0c;让我们来一起解…

MPAS模式教程

详情点击链接&#xff1a;最新MPAS跨尺度、可变分辨率模式应用及典型案例分析 前言 跨尺度预测模式&#xff08;The Model for Prediction Across Scales - MPAS&#xff09;是由洛斯阿拉莫斯实验室和美国国家大气研究中心(NCAR)共同开发&#xff0c;其由3个部分组成&#xff…

Opencv-C++笔记 (13) : opencv-图像卷积一(均值、中值、高斯、双边滤波)与 边缘处理

文章目录 一、概述图像滤波1.1、均值滤波1.2中值滤波1.3、高斯滤波1.4、双边滤波1.5、方框滤波 二、自定义掩码三、边缘处理四、Sobel算子五、Scharr算子六、拉普拉斯算子十、Canny算法 一、概述图像滤波 头文件 quick_opencv.h&#xff1a;声明类与公共函数 #pragma once #i…

深入理解线程池

一、线程池 1.1、线程池的优势 降低资源消耗。 通过重复利用已创建的线程降低线程创建和销毁造成的损耗 提高响应速度 当任务到达时&#xff0c;任务可以不需要等到线程创建就能立即执行 提高线程的可管理性 线程是稀缺资源&#xff0c;如果无限制的创建&#xff0c;不仅…