Linux基于ALSA的声音录制

简介

linux环境使用ALSA实现声音录制,保存pcm到本地文件。

代码

void AudioCapture::run()
{qDebug() << "AudioCapture start";snd_pcm_t *pcm_st_ = nullptr;std::string device_name = "default";int ret = snd_pcm_open(&pcm_st_, device_name.c_str(), SND_PCM_STREAM_CAPTURE, 0);if(ret < 0){qDebug("error capture snd_pcm_open %s\n", device_name.c_str());return ;}snd_pcm_hw_params_t *param = nullptr;snd_pcm_hw_params_malloc(&param);snd_pcm_hw_params_any(pcm_st_, param);//设置参数unsigned int sample_rate = 16000;int channel = 1;snd_pcm_format_t pcmFormat = SND_PCM_FORMAT_S16_LE;ret = snd_pcm_hw_params_set_access(pcm_st_, param, SND_PCM_ACCESS_RW_INTERLEAVED);if(ret < 0){qDebug("snd_pcm_hw_params_set_access SND_PCM_ACCESS_RW_INTERLEAVED\n");return;}ret = snd_pcm_hw_params_set_format(pcm_st_, param, pcmFormat);if(ret < 0){qDebug("snd_pcm_hw_params_set_format SND_PCM_FORMAT_S16_LE\n");return;}ret = snd_pcm_hw_params_set_channels(pcm_st_, param, channel);if(ret < 0){qDebug("snd_pcm_hw_params_set_channels\n");return;}int dir = 0;ret = snd_pcm_hw_params_set_rate_near(pcm_st_, param, &sample_rate, &dir);if(ret < 0){qDebug("snd_pcm_hw_params_set_rate_near %d\n", sample_rate);return;}//设置缓存采样点数dir = 0;snd_pcm_uframes_t frames = 512;ret = snd_pcm_hw_params_set_period_size_near(pcm_st_, param, &frames, &dir);if(ret < 0){qDebug("snd_pcm_hw_params_set_period_size_near\n");return;}snd_pcm_uframes_t buffer_frames =  frames ;ret = snd_pcm_hw_params_set_buffer_size_near(pcm_st_, param, &buffer_frames);if(ret < 0){qDebug("snd_pcm_hw_params_set_buffer_size_near\n");return;}ret = snd_pcm_hw_params(pcm_st_, param);if(ret < 0){qDebug("snd_pcm_hw_params\n");return;}// 设置缓存buffer 2倍大小  frames*2字节(单采样点16bit)*声道数int bufferSize = frames * channel * 2;uint8_t *audio_buffer = (uint8_t *)malloc(bufferSize * 2);if(! audio_buffer){qDebug("malloc audio buffer\n");return;}//创建pcm文件FILE *file = fopen("./16000_1_s16.pcm", "wb");if(!file){qDebug("fopen pcm error\n");m_isRun = false;}// 开始捕捉snd_pcm_start(pcm_st_);// 读取音频数据while (m_isRun){// 阻塞读取一次数据/*** if the blocking behaviour was selected and it is running, then routine waits until all requested frames are filled* the returned number of frames can be less only a signal or underrun occurred*/int readFrames = snd_pcm_readi(pcm_st_, audio_buffer, frames);if(readFrames == -EPIPE){ret = snd_pcm_prepare(pcm_st_);if(ret < 0){qDebug("failed to recover form overrun");}}else if(ret < 0){qDebug("error from read:%s\n", snd_strerror(ret));return;}//处理数据int readSize = readFrames * 2 * channel;fwrite(audio_buffer, readSize, 1, file);}// 释放硬件参数内存snd_pcm_hw_params_free(param);// 关闭捕捉设备snd_pcm_close(pcm_st_);//关闭文件fclose(file);if(audio_buffer){free(audio_buffer);audio_buffer = nullptr;}qDebug() << "AudioCapture stop";
}

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

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

相关文章

GCC __builtin_xxx函数

以 __builtin 开头的函数&#xff0c;这些函数是 GCC 编译器提供的一些内建函数&#xff0c;用于实现一些简单且快捷的功能&#xff0c;同时也可以用来优化编译结果。让我为您介绍一下其中一些常见的 __builtin 函数及其作用&#xff1a; __builtin_ctz(x) / __builtin_ctzll(x…

Linux基于V4L2的视频捕捉

简介 linux环境使用V4l2实现摄像头捕捉&#xff0c;界面流畅播放并可以保存图片到本地。 代码 void VideoCapture::run() {qDebug() << "VideoCapture start";// 打开设备int fd open("/dev/video0", O_RDWR);if(fd < 0){qDebug("video设…

告别暗黄,唤醒肌肤

&#x1f3ad; 想象一下&#xff0c;你的皮肤是舞台上的主角&#xff0c;但最近它似乎有些“疲惫”和“黯淡”&#xff0c;仿佛失去了往日的星光✨。别急&#xff0c;今天&#xff0c;我要为你揭秘一个能让肌肤重新焕发光彩的“魔法”——胶原蛋白&#xff01;&#x1f3a9; &a…

docker查看容器目录挂载

查看命令 docker inspect --format{{ json .Mounts }} <container_id_or_name> | jq 示例 docker inspect --format{{ json .Mounts }} af656ae540af | jq输出

Python知识点8---公共操作

提前说一点&#xff1a;如果你是专注于Python开发&#xff0c;那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了&#xff0c;而如果你和作者一样只是操作其他技术的Python API那就足够了。 Python的公共操作谁的是多种数据类型可共用的操作&#xff0c;且这些…

FreeRTOS笔记 - 二(正点原子)

一&#xff0c;任务创建和删除 具体的参数&#xff08;看视频&#xff09; 1&#xff0c;动态和静态创建的区别 动态: 任务的任务控制块以及任务的栈空间所需的内存&#xff0c;均由FreeRTOS从 FreeRTOS 管理的堆中分配。 静态: 任务的任务控制块以及任务的栈空间所需的内存&am…

vscode设置编辑器文件自动保存

步骤 1.打开vscode的设置 2.在搜索栏输入关键字“保存”&#xff1b; 在 Files: Auto Save 设置项&#xff0c;选择自动保存的模式

JavaScript中逻辑或(||)逻辑与()

在JavaScript中&#xff0c;||&#xff08;逻辑或&#xff09;和&&&#xff08;逻辑与&#xff09;是逻辑运算符&#xff0c;它们用于根据操作数的值来返回布尔值或执行短路求值&#xff08;short-circuit evaluation&#xff09;。 逻辑或&#xff08;||&#xff09;…

如何使用 PHP 函数进行网站性能监控和优化?

在构建一个高效、稳定的网站时&#xff0c;性能监控和优化是非常重要的一环。在 PHP 中&#xff0c;有许多内置函数和工具可以帮助我们实现网站的性能监控和优化。本文将介绍几种常用的 PHP 函数&#xff0c;并提供相应的代码示例&#xff0c;来帮助您更好地进行网站性能监控和…

java使用资源过高排查

在生产环境中有可能出现某java程序使用资源特别严重&#xff0c;这就需要找到该java进程&#xff0c;然后通过进程去找到是哪个线程的问题&#xff0c;这里我们就是用pidstat工具来排查一下 安装pidstat工具 yum -y install sysstat 查看java服务的pid jps 通过pid查看线…

C# WinForm —— 25 ProgressBar 介绍与使用

1. 简介 用于显示某个操作的进度 2. 常用属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到,一般以 pbar 开头ContextMenuStrip右键菜单Enabled控件是否可用ForeColor用于显示进度的颜色MarqueeAnimationSpeed进度条动画更新的速度&#xff0c;以毫秒为单位M…

Python|OpenCV-自动检测并识别车牌号(16)

前言 本文是该专栏的第18篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在本文中,笔者将详细介绍如何利用OpenCV进行车牌号识别。要知道,车牌号识别是计算机视觉在交通管理领域,以及车辆监控领域的一项重要应用。车牌号识别的主要目的,在于自动检测图像中的车…

M1芯片安装Dart Tips

如果按照 Get the Dart SDK | Dart 提供的方案就会出现 ➜ ~ brew tap dart-lang/dart > Tapping dart-lang/dart Cloning into /opt/homebrew/Library/Taps/dart-lang/homebrew-dart... ^C ➜ ~ brew tap dart-lang/dart > Tapping dart-lang/dart Cloning into /opt…

JZ2440笔记:DM9000C网卡驱动

在厂家提供的dm9dev9000c.c上修改&#xff0c; 1、注释掉#ifdef MODULE #endif 2、用模块化函数修饰入口出口函数 3、在dm9000c_init入口函数&#xff0c;增加iobase (int)ioremap(0x20000000,1024);irq IRQ_EINT7; 4、一路进入&#xff0c;在dmfe_probe1中注释掉if((db…

JavaWeb学习:在SSM框架中配置一个简单的监听器和过滤器

实现效果&#xff1a; 编写一个记录有多少个请求访问的监听器&#xff0c;通过面向全部访问路径的过滤器更新监听器中的visitCount次数。 监听器&#xff1a; WebListener public class VisitCounterListener implements ServletContextListener {private static final Strin…

经常用到的代码段

opencv opencv-图像部分 opencv显示图像 cv2.namedWindow("just for test", 0) cv2.imshow("just for test", index_img) cv2.waitKey(0)Opencv转PIL.Image Image.fromarray(cv2.cvtColor(cv_img,cv2.COLOR_BGR2RGB)) PIL.Image转Opencv cv2.cvtColor(…

chatgpt :怎样学c 指针

现在的感觉&#xff0c;要想学好程序&#xff0c;必须要想法能使用ChatGPT这个工具&#xff0c;它比任何老师和书籍都有用。比Google搜索都强。它给你的答案非常全面&#xff0c;可以作为全面知识的总结。 学习C语言中的指针可以提高你的编程能力和理解计算机内存管理的知识。…

CSAPP Lab08——Proxy Lab完成思路

蓝色的思念 突然演变成了阳光的夏天 空气中的温暖不会很遥远 ——被风吹过的夏天 完整代码见&#xff1a;CSAPP/proxylab-handout at main SnowLegend-star/CSAPP (github.com) Q&#xff1a;计算机网络中port的作用是什么&#xff1f; A&#xff1a;在计算机网络中&#xff…

qt中实现多语言功能

qt中实现多语言功能 原理&#xff1a; 其本质就是生成ts文件&#xff0c;然后使用Linguist软件手工翻译&#xff0c;再生成qm文件&#xff0c;最后在主程序的开始加载不同的qm文件&#xff0c;实现多语言。 步骤&#xff1a; 修改程序文件 在pro文件中加入说明 TRANSLATI…

Socket网络通讯入门(一)

提示&#xff1a;能力有限&#xff0c;不足以及错误之处还请指出&#xff01; 文章目录 前言一、 计算机网络 OSI、TCP/IP、五层协议 体系结构1.OSI七层模型每层的作用2.TCP/IP协议分成3.五层协议体系结构 二、Socket服务端和客户端 简单通信1.服务端代码2.客户端 总结 前言 简…