Linux麦克风录音实战

在 Linux 上使用麦克风进行录音可以通过多种方式实现,包括使用命令行工具、图形界面应用程序以及编程接口。下面我将介绍几种常见的方法,从简单的命令行工具到使用 PortAudio 库进行编程。

一. 使用arecord命令行工具

arecord 是 ALSA(Advanced Linux Sound Architecture)提供的一个命令行工具,可以用来录制音频。以下是基本步骤:
步骤 1: 检查麦克风设备:首先,确保你的麦克风设备已经被系统识别。你可以使用 arecord -l 命令来列出所有可用的录音设备。

arecord -l

输出示例:
在这里插入图片描述
这里card 3和device 0是要使用的麦克风设备。
步骤 2: 录制音频
使用 arecord 命令进行录音,并指定设备和输出文件格式。例如,录制一个 10 秒的音频文件:

arecord -D hw:3,0 -f cd -d 10 output.wav
  • -D hw:0,0:指定设备 card 0, device 0。
  • -f cd:指定采样格式为 CD 质量(16-bit, 44.1 kHz, stereo)。
  • -d 10:录制时间 10 秒。
  • output.wav:输出文件名。

二. 使用 PortAudio 编程库

PortAudio 是一个跨平台的音频 I/O 库,支持多种编程语言。以下是一个使用 C++ 和 PortAudio 进行麦克风录音的示例。
步骤一:安装PortAudio
首先,安装PortAudio库

sudo apt-get install portaudio19-dev

或者编译portaudio库的源代码

git clone https://github.com/PortAudio/portaudio.git
cd portaudio
./configure
make
make install

步骤二:编写录音程序
创建一个 C++ 文件(例如 recorder.cc),并编写录音代码。

// 引入portaudio库
#include <portaudio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 采样频率44100hz
#define SAMPLE_RATE 44100
// 每个缓冲区的帧数
#define FRAMES_PER_BUFFER 1024
// 录制的时间长度
#define RECORD_SECONDS 10// WAV 文件头结构
typedef struct {char riff[4];            // "RIFF"int filesize;            // 文件大小减8char wave[4];            // "WAVE"char fmt_chunk_marker[4]; // "fmt "int fmt_chunk_len;       // 格式块长度 (16)short audio_format;      // 音频格式 (1 for PCM)short num_channels;      // 声道数 (1 for mono, 2 for stereo)int sample_rate;         // 采样率 (例如 44100)int byte_rate;           // 每秒字节数 (sample_rate * num_channels * (bits_per_sample/8))short frame_size;        // 每个样本的字节数 (num_channels * (bits_per_sample/8))short bits_per_sample;   // 每个样本的位数 (例如 16)char data_chunk_header[8]; // "data"int data_bytes;          // 数据字节数 (frame_count * frame_size)
} WavHeader;// 回调函数
// portaudio会在每次有新的音频数据时调用这个函数
int recordCallback(const void *inputBuffer, void *outputBuffer,unsigned long framesPerBuffer,const PaStreamCallbackTimeInfo* timeInfo,PaStreamCallbackFlags statusFlags,void *userData) {FILE *file = (FILE *)userData;fwrite(inputBuffer, sizeof(short), framesPerBuffer, file);return paContinue;
}int main() {PaStream *stream;PaError err;FILE *file;// 初始化 PortAudioerr = Pa_Initialize();if (err != paNoError) {fprintf(stderr, "Pa_Initialize: %s\n", Pa_GetErrorText(err));return 1;}// 打开文件file = fopen("output.wav", "wb");if (!file) {fprintf(stderr, "无法打开输出文件\n");Pa_Terminate();return 1;}// 设置 WAV 文件头WavHeader header = {0};strcpy(header.riff, "RIFF");strcpy(header.wave, "WAVE");strcpy(header.fmt_chunk_marker, "fmt ");header.fmt_chunk_len = 16;header.audio_format = 1;header.num_channels = 1;header.sample_rate = SAMPLE_RATE;header.byte_rate = SAMPLE_RATE * header.num_channels * 2;header.frame_size = header.num_channels * 2;header.bits_per_sample = 16;strcpy(header.data_chunk_header, "data");header.data_bytes = SAMPLE_RATE * RECORD_SECONDS * header.frame_size;// 计算文件大小header.filesize = 36 + header.data_bytes;// 写入 WAV 文件头fwrite(&header, sizeof(WavHeader), 1, file);// 设置输入参数PaStreamParameters inputParameters;// 在 PortAudio 中,设备 ID 通常与 arecord 命令列出的 card 编号对应。inputParameters.device = 3;  // 指定设备 ID---对应arecord -l输出的card 3inputParameters.channelCount = 1;inputParameters.sampleFormat = paInt16;inputParameters.suggestedLatency = Pa_GetDeviceInfo(inputParameters.device)->defaultLowInputLatency;inputParameters.hostApiSpecificStreamInfo = NULL;// 打开音频流err = Pa_OpenStream(&stream, &inputParameters, NULL, SAMPLE_RATE, FRAMES_PER_BUFFER, paClipOff, recordCallback, file);if (err != paNoError) {fprintf(stderr, "Pa_OpenStream: %s\n", Pa_GetErrorText(err));fclose(file);Pa_Terminate();return 1;}// 启动音频流err = Pa_StartStream(stream);if (err != paNoError) {fprintf(stderr, "Pa_StartStream: %s\n", Pa_GetErrorText(err));Pa_CloseStream(stream);fclose(file);Pa_Terminate();return 1;}// 录音printf("录音中... (按任意键停止)\n");getchar();// 停止音频流err = Pa_StopStream(stream);if (err != paNoError) {fprintf(stderr, "Pa_StopStream: %s\n", Pa_GetErrorText(err));Pa_CloseStream(stream);fclose(file);Pa_Terminate();return 1;}// 关闭音频流Pa_CloseStream(stream);// 更新 WAV 文件头中的数据大小header.data_bytes = ftell(file) - 44;header.filesize = 36 + header.data_bytes;fseek(file, 0, SEEK_SET);fwrite(&header, sizeof(WavHeader), 1, file);// 关闭文件fclose(file);// 终止 PortAudioPa_Terminate();printf("录音完成。\n");return 0;
}

步骤3:编译和运行
使用 g++ 编译代码:

g++ recorder.cc -o recorder -lportaudio
./recorder

使用cmake编译代码
编写 CMakeLists.txt

   cmake_minimum_required(VERSION 3.10)# 项目名称project(Recorder)# 查找 PortAudio 库find_package(PortAudio REQUIRED)# 添加可执行文件add_executable(recorder recorder.cc)# 链接 PortAudio 库target_link_libraries(recorder PRIVATE ${PORTAUDIO_LIBRARIES})# 设置可执行文件的输出目录set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)

编写 CMakeLists.txt后,执行命令

   mkdir buildcd buildcmake ..make./bin/recorder

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

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

相关文章

虚拟苹果系统MacOS中新建自定义C++Dylib并用C++测试程序测试

前言 苹果系统中Dylib的建立和使用是一个非常基础的功能。本博客使用苹果虚拟机MacOS Ventura 13.6.7&#xff0c;XCode15.2&#xff0c;来复现这个过程。供参考。 1、Dylib框架的建立 2、增加一个函数 注意&#xff0c;向导自动生成的Helloworld函数中嵌套了一个函数Helloworl…

Windows系统电脑安装TightVNC服务端结合内网穿透实现异地远程桌面

文章目录 前言1. 安装TightVNC服务端2. 局域网VNC远程测试3. Win安装Cpolar工具4. 配置VNC远程地址5. VNC远程桌面连接6. 固定VNC远程地址7. 固定VNC地址测试 前言 在追求高效、便捷的数字化办公与生活的今天&#xff0c;远程桌面服务成为了连接不同地点、不同设备之间的重要桥…

树莓派2装FreeBSD14.1 Raspberry Pi2 install FreeBSD14.1 00000121:error:0A000086:SSL

树莓派2代的Model B采用Broadcom BCM2836 900MHz的四核SoC&#xff0c;1GB内存&#xff0c;是新一代开拓者&#xff0c;兼容1代B。相比之下&#xff0c;树莓派2的性能比1代提升6倍&#xff0c;内存翻了一番。Raspberry Pi 2不仅能跑全系列ARM GNU/Linux发行版&#xff0c;而且支…

ThingsBoard规则链节点:Azure IoT Hub 节点详解

目录 引言 1. Azure IoT Hub 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 数据传输 3.2 数据分析 3.3 设备管理 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台&#xff0c;提供了设备…

MySQL获取数据库内所有表格数据总数

在 MySQL 中&#xff0c;要获取数据库内所有表格的数据总数&#xff0c;可以编写一个查询脚本来遍历每个表并计算其行数。你可以使用 INFORMATION_SCHEMA 数据库&#xff0c;它包含了关于数据库元数据的表格&#xff0c;如 TABLES 和 COLUMNS。 以下是一个示例脚本&#xff0c…

如何利用 Puppeteer 的 Evaluate 函数操作网页数据

介绍 在现代的爬虫技术中&#xff0c;Puppeteer 因其强大的功能和灵活性而备受青睐。Puppeteer 是一个用于控制 Chromium 或 Chrome 浏览器的 Node.js 库&#xff0c;提供了丰富的 API 接口&#xff0c;能够帮助开发者高效地处理动态网页数据。本文将重点讲解 Puppeteer 的 ev…

开发工具 - VSCode 快捷键

以下是一些常用的 VS Code 快捷键&#xff08;Windows、macOS 和 Linux 均适用&#xff0c;略有不同&#xff09;&#xff1a; 常用快捷键 功能Windows/LinuxmacOS打开命令面板Ctrl Shift P 或 F1Cmd Shift P打开文件Ctrl OCmd O保存文件Ctrl SCmd S全部保存Ctrl K,…

【Leetcode 每日一题】146. LRU 缓存(c++)

146. LRU 缓存 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#x…

【GAMES101笔记速查——Lecture 19 Cameras,Lenses and Light Fields】

本章节内容&#xff1a;相机、棱镜、光场 计算机图形学的两种成像方法&#xff1a; 1.合成方法&#xff1a;光栅化、光线追踪&#xff08;展示出现实没有的东西&#xff09; 2.捕捉方法&#xff1a;相机&#xff08;捕捉现实已有的东西&#xff09; 目录 1 相机 1.1 针孔相…

pytorch经典训练流程

文章目录 [toc]1. **经典训练流程和任务&#xff1a;监督学习****1.1 什么是监督学习&#xff1f;****1.2 为什么要设计训练流程&#xff1f;****1.3 怎么设计训练流程&#xff1f;****代码示例&#xff1a;监督学习的典型流程** 2. **超参数设置****2.1 什么是超参数&#xff…

241124学习日志——[CSDIY] [ByteDance] 后端训练营 [14]

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…

001 MATLAB介绍

前言&#xff1a; 软件获取渠道有很多&#xff0c;难点也就是百度网盘下载慢&#xff1b; 线上版本每月有时间限制。 01 MATLAB介绍 性质&#xff1a; MATLAB即Matrix Laboratory 矩阵实验室的意思&#xff0c;是功能强大的计算机高级语言, 已广泛应用于各学科研究部门、…

【C语言】传值调用与传址调用:深度解析与实现

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;什么是传值调用和传址调用&#xff1f;1. 传值调用&#xff08;Call by Value&#xff09;2. 传址调用&#xff08;Call by Reference&#xff09; &#x1f4af;传值调…

科技赋能健康:多商户Java版商城系统引领亚健康服务数字化变革

在当今社会&#xff0c;随着生活节奏的加快和工作压力的增大&#xff0c;越来越多的人处于亚健康状态。据《The Lancet》期刊2023年的统计数据显示&#xff0c;全球亚健康状态的人群比例已高达82.8%&#xff0c;这一数字背后&#xff0c;隐藏着巨大的健康风险和社会成本。亚健康…

docker 卸载与安装

卸载 查询之前安装的docker, 没有查到则不用卸载删除 yum list installed | grep docker 卸载安装包 yum remove docker-* -y 删除镜像、容器、默认挂载卷 rm -rf /var/lib/docker 安装 -ce 安装稳定版本 -y 当安装过程提示选择全部为 "yes" yum install d…

vue实现列表滑动下拉加载数据

一、实现效果 二、实现思路 使用滚动事件监听器来检测用户是否滚动到底部&#xff0c;然后加载更多数据 监听滚动事件。检测用户是否滚动到底部。加载更多数据。 三、案例代码 <div class"drawer-content"><div ref"loadMoreTrigger" class&q…

【CSP CCF记录】201809-2第14次认证 买菜

题目 样例输入 4 1 3 5 6 9 13 14 15 2 4 5 7 10 11 13 14 样例输出 3 思路 易错点&#xff1a;仅考虑所给样例&#xff0c;会误以为H和W两人的装车时间是一一对应的&#xff0c;那么提交结果的运行错误就会让你瞬间清醒。 本题关键是认识到H和W的装车时间不一定一一对应&…

学习threejs,使用设置bumpMap凹凸贴图创建褶皱,实现贴图厚度效果

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.MeshPhongMaterial高…

GoF设计模式——结构型设计模式分析与应用

文章目录 UML图的结构主要表现为&#xff1a;继承&#xff08;抽象&#xff09;、关联 、组合或聚合 的三种关系。1. 继承&#xff08;抽象&#xff0c;泛化关系&#xff09;2. 关联3. 组合/聚合各种可能的配合&#xff1a;1. 关联后抽象2. 关联的集合3. 组合接口4. 递归聚合接…

Unity中动态生成贴图并保存成png图片实现

实现原理&#xff1a; 要生成长x宽y的贴图&#xff0c;就是生成x*y个像素填充到贴图中&#xff0c;如下图&#xff1a; 如果要改变局部颜色&#xff0c;就是从x1到x2(x1<x2),y1到y2(y1<y2)这个范围做处理&#xff0c; 或者要想做圆形就是计算距某个点&#xff08;x1,y1&…