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.rhkb.cn/news/478585.html

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

相关文章

oracle会话追踪

一 跟踪当前会话 1.1 查看当前会话的SID,SERIAL# #在当前会话里执行 示例&#xff1a; SQL> select distinct userenv(sid) from v$mystat; USERENV(SID) -------------- 1945 SQL> select distinct sid,serial# from v$session where sid1945; SID SERIAL# …

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;提供了设备…

数据结构(Java版)第二期:包装类和泛型

目录 一、包装类 1.1. 基本类型和对应的包装类 1.2. 装箱和拆箱 1.3. 自动装箱和自动拆箱 二、泛型的概念 三、引出泛型 3.1. 语法规则 3.2. 泛型的优点 四、类型擦除 4.1. 擦除的机制 五、泛型的上界 5.1. 泛型的上界的定义 5.2. 语法规则 六、泛型方法 6.1…

STM32端口模拟编码器输入

文章目录 前言一、正交编码器是什么&#xff1f;二、使用步骤2.1开启时钟2.2配置编码器引脚 TIM3 CH1(PA6) CH2 (PA7)上拉输入2.3.初始化编码器时基2.4 初始化编码器输入2.5 配置编码器接口2.6 开启定时器2.7获取编码器数据 三、参考程序四、测试结果4.1测试方法4.2串口输出结果…

商业物联网:拥抱生产力的未来

在现代商业格局中&#xff0c;数据占据至高无上的地位。物联网&#xff08;IoT&#xff09;站在这场数字革命的前沿&#xff0c;将以往模糊不清的不确定因素转变为可衡量、可付诸行动的深刻见解。物联网技术为日常物品配备传感器与连接功能&#xff0c;使其能够实时收集并传输数…

UE5肉鸽游戏教程学习

学习地址推荐&#xff1a;UE5肉鸽项目实战教程_哔哩哔哩_bilibili

【Python】分割秘籍!掌握split()方法,让你的字符串处理轻松无敌!

在Python开发中&#xff0c;字符串处理是最常见也是最基础的任务之一。而在众多字符串操作方法中&#xff0c;split()函数无疑是最为重要和常用的一个。无论你是Python新手&#xff0c;还是经验丰富的开发者&#xff0c;深入理解并熟练运用split()方法&#xff0c;都将大大提升…

sql工具!好用!爱用!

SQLynx的界面设计简洁明了&#xff0c;操作逻辑清晰易懂&#xff0c;没有复杂的图标和按钮&#xff0c;想对哪部分操作就在哪里点击右键&#xff0c;即使你是数据库小白也能轻松上手。 尽管SQLynx是一款免费的工具&#xff0c;但是它的功能却丝毫不逊色于其他付费产品&#xff…

C语言菜鸟入门·关键字·union的用法

目录 1. 简介 2. 访问成员 2.1 声明 2.2 赋值 3. 共用体的大小 4. 与typedef联合使用 5. 更多关键字 1. 简介 共用体&#xff08;union&#xff09;是一种数据结构&#xff0c;它允许在同一内存位置存储不同的数据类型&#xff0c;但每次只能存储其中一种类型的…

运维Tips:Docker或K8s集群拉取Harbor私有容器镜像仓库配置指南

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] Docker与Kubernetes集群拉取Harbor私有容器镜像仓库配置 描述:在现在微服务、云原生的环境下,通常我们会在企业中部署Docker和Kubernetes集群,并且会在企业内部搭建Harbor私有镜像仓库以保证开发源码安全,以及加快…

webrtc音频模块介绍(二) ADM

不同操作系统管理音频设备及提供的音频接口方式各不同&#xff0c;ADM用于屏蔽音频设备管理及接口的差异&#xff0c;抽象统一接口。它的全称是Adio Device Module。 设备管理模块(ADM) 类结构图 首先它肯定是个接口类&#xff0c;不同平台的实现都继承于它&#xff0c;实现…

前后端分离,解决vue+axios跨域和proxyTable不生效等问题

看到我这篇文章前可能你以前看过很多类似的文章。至少我是这样的&#xff0c;因为一直没有很好的解决问题。 正文 当我们通过webstorm等IDE开发工具启动项目的时候&#xff0c;通过命令控制台可以观察到启动项目的命令 如下&#xff1a; webpack-dev-server --inline --prog…

Linux系统使用valgrind分析C++程序内存资源使用情况

内存占用是我们开发的时候需要重点关注的一个问题&#xff0c;我们可以人工根据代码推理出一个消耗内存较大的函数&#xff0c;也可以推理出大概会消耗多少内存&#xff0c;但是这种方法不仅麻烦&#xff0c;而且得到的只是推理的数据&#xff0c;而不是实际的数据。 我们可以…

Hyper-V配置-cnblog

启用Hyper-V以在 Windows 10上创建虚拟机 &#xff08;1&#xff09;控制面板检查系统要求&#xff1a; 确保您的计算机符合 Hyper-V 的系统要求。通常情况下&#xff0c;您的计算机需要运行 Windows 10 专业版、企业版或教育版&#xff0c;并且具有启用了虚拟化技术的处理器。…

从 Llama 1 到 3.1:Llama 模型架构演进详解

编者按&#xff1a; 面对 Llama 模型家族的持续更新&#xff0c;您是否想要了解它们之间的关键区别和实际性能表现&#xff1f;本文将探讨 Llama 系列模型的架构演变&#xff0c;梳理了 Llama 模型从 1.0 到 3.1 的完整演进历程&#xff0c;深入剖析了每个版本的技术创新&#…

GitLab 备份与恢复

在 GitLab 中&#xff0c;备份和恢复是运维中非常关键的部分&#xff0c;尤其是数据的安全与一致性。以下是具体操作指南。 GitLab 备份 GitLab 提供了内置的备份工具&#xff0c;通过 gitlab-backup 命令生成备份文件。 1. 备份环境准备 确保以下几点&#xff1a; 备份存储路径…

填补覆盖空白,小型机器人让智能清洁再“净”一步!

尽管不同商用场景的大多区域都十分相似&#xff0c;但非标准化的场景属性无法避免的导致了不少corner case。面对狭窄场景&#xff0c;“强悍”的商用清洁机器人迎来了自己的“职业危机”。 随着城市化进程的推进和服务业比重提升&#xff0c;商场、写字楼等细分场景不断扩容&a…

非root用户安装CUDA

1.使用nvidia-smi查看当前驱动支持的最高CUDA版本&#xff1a; 表示当前驱动最多支持cuda12.1 2.进入cuda安装界面&#xff0c;https://developer.nvidia.com/cuda-toolkit-archive&#xff0c;选择想要安装的版本&#xff0c;例如想要安装CUDA11.4&#xff1a; 如果需要查看ub…

【Linux学习】【Ubuntu入门】2-3 make工具和makefile引入

1.使用命令新建三个.c文件vi main.c&#xff0c;vi input.c&#xff0c;vi caclcu.c&#xff0c;两个.h文件vi input.h&#xff0c;vi caclcu.h 2.vi Makefile&#xff1a;新建Makefile文件&#xff0c;输入一下内容 注意&#xff1a;命令列表中每条命令前用TAB键&#xff0c;不…

《硬件架构的艺术》笔记(五):低功耗设计

介绍 能量以热量形式消耗&#xff0c;温度升高芯片失效率也会增加&#xff0c;增加散热片或风扇会增加整体重量和成本&#xff0c;在SoC级别对功耗进行控制就可以减少甚至可能消除掉这些开支&#xff0c;产品也更小更便宜更可靠。本章描述了减少动态功耗和静态功耗的各种技术。…