0

0

Linux下音频开发: 读取声卡PCM数据保存到文件(alsa-lib库)

爱谁谁

爱谁谁

发布时间:2025-07-22 11:52:12

|

552人浏览过

|

来源于php中文网

原创

一、环境介绍

系统: ubuntu18.04 (64位)

声卡: 电脑自带

二、功能介绍

通过alsa-lib库读取电脑声卡的PCM数据保存到文件。

在ubuntu系统上安装alsa-lib库方法:

代码语言:javascript代码运行次数:0运行复制
 sudo apt-get install libasound2-dev

如果是在其他发行版linux系统上或者需要在嵌入式linux系统上使用alsa-lib库,可以下载alsa-lib源码包,自行编译。

开源ALSA架构的官网地址:https://www.alsa-project.org/wiki/Main_Page

Linux下音频开发: 读取声卡PCM数据保存到文件(alsa-lib库)

三、获取本机可用的声卡设备

获取声卡可以使用arecord -L命令。

在ubuntu系统下如果没有这个命令,直接根据提示安装一个即可。

示例: 一般 hw:0 或者 default 表示默认声卡设备。

代码语言:javascript代码运行次数:0运行复制
wbyq@wbyq:/mnt/hgfs/linux-share-dir/linux_c/linux_pcm_save$ arecord -Ldefault    Playback/recording through the PulseAudio sound servernull    Discard all samples (playback) or generate zero samples (capture)pulse    PulseAudio Sound Serversysdefault:CARD=AudioPCI    Ensoniq AudioPCI, ES1371 DAC2/ADC    Default Audio Devicefront:CARD=AudioPCI,DEV=0    Ensoniq AudioPCI, ES1371 DAC2/ADC    Front speakersiec958:CARD=AudioPCI,DEV=0    Ensoniq AudioPCI, ES1371 DAC2/ADC    IEC958 (S/PDIF) Digital Audio Outputdmix:CARD=AudioPCI,DEV=0    Ensoniq AudioPCI, ES1371 DAC2/ADC    Direct sample mixing devicedsnoop:CARD=AudioPCI,DEV=0    Ensoniq AudioPCI, ES1371 DAC2/ADC    Direct sample snooping devicehw:CARD=AudioPCI,DEV=0    Ensoniq AudioPCI, ES1371 DAC2/ADC    Direct hardware device without any conversionsplughw:CARD=AudioPCI,DEV=0    Ensoniq AudioPCI, ES1371 DAC2/ADC    Hardware device with all software conversions

四、示例代码

Civitai
Civitai

AI艺术分享平台!海量SD资源和开源模型。

下载

参考文档:https://users.suse.com/~mana/alsa090_howto.html

代码语言:javascript代码运行次数:0运行复制
/* 进行音频采集,采集pcm数据并直接保存pcm数据 音频参数:  声道数:2 采样位数:16bit、LE格式 采样频率:44100Hz*/#include #include #include #include FILE *pcm_data_file=NULL;int run_flag=0;void exit_sighandler(int sig){run_flag=1;}int main(int argc, char *argv[]){int i;int err;char *buffer;int buffer_frames = 128;unsigned int rate = 44100;// 常用的采样频率: 44100Hz 、16000HZ、8000HZ、48000HZ、22050HZsnd_pcm_t *capture_handle;// 一个指向PCM设备的句柄snd_pcm_hw_params_t *hw_params; //此结构包含有关硬件的信息,可用于指定PCM流的配置/*注册信号捕获退出接口*/signal(2,exit_sighandler);/*PCM的采样格式在pcm.h文件里有定义*/snd_pcm_format_t format=SND_PCM_FORMAT_S16_LE; // 采样位数:16bit、LE格式/*打开音频采集卡硬件,并判断硬件是否打开成功,若打开失败则打印出错误提示*/if ((err = snd_pcm_open (&capture_handle, argv[1],SND_PCM_STREAM_CAPTURE,0))<0) {printf("无法打开音频设备: %s (%s)\n",  argv[1],snd_strerror (err));exit(1);}printf("音频接口打开成功.\n");/*创建一个保存PCM数据的文件*/if((pcm_data_file = fopen(argv[2], "wb")) == NULL){printf("无法创建%s音频文件.\n",argv[2]);exit(1);} printf("用于录制的音频文件已打开.\n");/*分配硬件参数结构对象,并判断是否分配成功*/if((err = snd_pcm_hw_params_malloc(&hw_params)) < 0) {printf("无法分配硬件参数结构 (%s)\n",snd_strerror(err));exit(1);}printf("硬件参数结构已分配成功.\n");/*按照默认设置对硬件对象进行设置,并判断是否设置成功*/if((err=snd_pcm_hw_params_any(capture_handle,hw_params)) < 0) {printf("无法初始化硬件参数结构 (%s)\n", snd_strerror(err));exit(1);}printf("硬件参数结构初始化成功.\n");/*设置数据为交叉模式,并判断是否设置成功interleaved/non interleaved:交叉/非交叉模式。表示在多声道数据传输的过程中是采样交叉的模式还是非交叉的模式。对多声道数据,如果采样交叉模式,使用一块buffer即可,其中各声道的数据交叉传输;如果使用非交叉模式,需要为各声道分别分配一个buffer,各声道数据分别传输。*/if((err = snd_pcm_hw_params_set_access (capture_handle,hw_params,SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) {printf("无法设置访问类型(%s)\n",snd_strerror(err));exit(1);}printf("访问类型设置成功.\n");/*设置数据编码格式,并判断是否设置成功*/if ((err=snd_pcm_hw_params_set_format(capture_handle, hw_params,format)) < 0) {printf("无法设置格式 (%s)\n",snd_strerror(err));exit(1);}fprintf(stdout, "PCM数据格式设置成功.\n");/*设置采样频率,并判断是否设置成功*/if((err=snd_pcm_hw_params_set_rate_near (capture_handle,hw_params,&rate,0))<0) {printf("无法设置采样率(%s)\n",snd_strerror(err));exit(1);}printf("采样率设置成功\n");/*设置声道,并判断是否设置成功*/if((err = snd_pcm_hw_params_set_channels(capture_handle, hw_params,2)) < 0) {printf("无法设置声道数(%s)\n",snd_strerror(err));exit(1);}printf("声道数设置成功.\n");/*将配置写入驱动程序中,并判断是否配置成功*/if ((err=snd_pcm_hw_params (capture_handle,hw_params))<0) {printf("无法向驱动程序设置参数(%s)\n",snd_strerror(err));exit(1);}printf("参数设置成功.\n");/*使采集卡处于空闲状态*/snd_pcm_hw_params_free(hw_params);/*准备音频接口,并判断是否准备好*/if((err=snd_pcm_prepare(capture_handle))<0) {printf("无法使用音频接口 (%s)\n",snd_strerror(err));exit(1);}printf("音频接口准备好.\n");/*配置一个数据缓冲区用来缓冲数据*/buffer=malloc(128*snd_pcm_format_width(format)/8*2);printf("缓冲区分配成功.\n");/*开始采集音频pcm数据*/printf("开始采集数据...\n");while(1) {/*从声卡设备读取一帧音频数据*/if((err=snd_pcm_readi(capture_handle,buffer,buffer_frames))!=buffer_frames) {  printf("从音频接口读取失败(%s)\n",snd_strerror(err));  exit(1);}/*写数据到文件*/fwrite(buffer,(buffer_frames*2),sizeof(short),pcm_data_file);if(run_flag){printf("停止采集.\n");break;}}/*释放数据缓冲区*/free(buffer);/*关闭音频采集卡硬件*/snd_pcm_close(capture_handle);/*关闭文件流*/fclose(pcm_data_file);return 0;}

编译方法:

代码语言:javascript代码运行次数:0运行复制
gcc linux_pcm_save.c -lasound

运行方法:

代码语言:javascript代码运行次数:0运行复制
./a.out hw:0 123.pcm

录制过程中如果想要结束录制,直接按下Ctrl+C即可。

成功之后,会在当前目录下生成123.pcm文件。

五、播放PCM数据

Windows下可以使用audacity软件进行播放PCM裸流数据。

或者通过ffplay工具(安装ffmpeg会带上这个工具)。

代码语言:javascript代码运行次数:0运行复制
ffplay -ar 44100 -channels 2 -f s16le -i 123.pcm

audacity软件下载地址:

https://download.csdn.net/download/xiaolong1126626497/12252685

Linux下音频开发: 读取声卡PCM数据保存到文件(alsa-lib库)
Linux下音频开发: 读取声卡PCM数据保存到文件(alsa-lib库)
Linux下音频开发: 读取声卡PCM数据保存到文件(alsa-lib库)

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

556

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

374

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

733

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

477

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

414

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

1011

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

658

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

553

2023.09.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 4.7万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 8.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号