libasound+libsndfile讀取麥克風音頻保存為wav文件

依賴庫

要完成該功能依賴libasound、libsndfile庫,該命令在linux下可以通過命令行安裝安裝,安裝命令如下:

sudo apt-get install libasound2-dev
sudo apt-get install libsndfile1-dev

代碼實現

本文的目的是在linux下利用libasound和libsndfile庫基于C++實現讀取麥克風數據,并保存為wav文件。具體實現代碼如下所示:

#include <iostream>
#include <vector>
#include <complex>
#include <fftw3.h>
#include <alsa/asoundlib.h>
#include "math.h"
#include "stdio.h"
#include <vector>
#include <QDateTime>
#include <QDebug>
#include <fstream>
#include "sndfile.h"using namespace std;
const int FRAME_SIZE = 1024;// 定義采樣率、通道數、采樣格式等參數
#define SAMPLE_RATE 16000
#define CHANNELS 1
#define FORMAT SND_PCM_FORMAT_S16_LE // 16位,小端int main() {// 初始化 ALSA 音頻采集snd_pcm_t* capture_handle;int rc;rc = snd_pcm_open(&capture_handle, "default", SND_PCM_STREAM_CAPTURE, 0);if (rc < 0){std::cerr << "無法打開默認音頻設備: " << snd_strerror(rc) << std::endl;return 1;}// 設置音頻采集參數// 配置PCM參數snd_pcm_hw_params_t *params;snd_pcm_hw_params_alloca(&params);snd_pcm_hw_params_any(capture_handle, params);snd_pcm_hw_params_set_access(capture_handle, params, SND_PCM_ACCESS_RW_INTERLEAVED);  //設置該參數的目的是決定多通道時是否采用一塊內存來存儲音頻數據,設置SND_PCM_ACCESS_RW_INTERLEAVED參數就是將多通道情況下的數據存儲到一塊內存中snd_pcm_hw_params_set_format(capture_handle, params, FORMAT);snd_pcm_hw_params_set_channels(capture_handle, params, CHANNELS);unsigned int sampleRate = SAMPLE_RATE;snd_pcm_hw_params_set_rate_near(capture_handle, params, &sampleRate, 0);int err = snd_pcm_hw_params(capture_handle, params);if(err < 0){fprintf(stderr, "無法打開 PCM 設備: %s\n", snd_strerror(err));return 1;}SNDFILE* sndfile;SF_INFO sfinfo;sfinfo.samplerate = 16000;sfinfo.channels = 1;sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16;sfinfo.frames = 0;sndfile = sf_open("output1.wav", SFM_WRITE, &sfinfo);if(!sndfile){qDebug()<<"無法創建wav文件";snd_pcm_close(capture_handle);return 1;}int index = 0;short* audioFrame = (short*)malloc(FRAME_SIZE*sizeof(short));while (true){rc = snd_pcm_readi(capture_handle, audioFrame, FRAME_SIZE);//vector<int16_t> vData(audioFrame, audioFrame+FRAME_SIZE);qDebug()<<"time :"<<QDateTime::currentMSecsSinceEpoch();if (rc == FRAME_SIZE){sf_count_t ret = sf_write_short(sndfile, audioFrame, FRAME_SIZE);qDebug()<<"sf_write_short ret : "<<ret;index++;if(index == 50)break;}else if (rc < 0){std::cerr << "讀取音頻數據時出錯: " << snd_strerror(rc) << std::endl;break;}}sf_close(sndfile);snd_pcm_close(capture_handle);return 0;
}

該程序編譯通過后,運行該程序,可以實現錄音。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/12820.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12820.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12820.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

wsl2遷移到非c盤

WSL2遷移 系統win11 核心步驟: 0) 以管理員身份運行powershell 查看已經安裝的Ubuntu分發版本,我的是默認 wsl -lPS C:\Users\Windows10> wsl -l 適用于 Linux 的 Windows 子系統分發版: Ubuntu (默認) 1)導出到D盤 wsl --export Ubuntu d://ubuntu.tar PS C:\U…

你還在手動加好友?試試這款神器,釋放雙手自動添加!

你還在手動添加微信好友嗎&#xff1f;尤其是在忙碌的時候&#xff0c;手動加好友不僅費時又很容易出錯。試試這個自動添加好友神器——個微管理系統&#xff0c;釋放你的雙手&#xff0c;輕松拓展好友列表&#xff01; 1、多號同時登錄在線 系統支持多個微信號同時登錄在線&…

數據結構——二叉樹知識點詳解!

引言&#xff1a;本篇博客將詳細介紹到數據結構中的又一位大將——二叉樹。它也是我們目前學到的第一個非線性的數據結構。并且本章將學到的概念居多&#xff0c;希望大家可以理解并牢記。 更多有關C語言和數據結構知識詳解可前往個人主頁&#xff1a;計信貓 目錄 一&#xff0…

AIGC行業現在適合進入嗎

AIGC行業目前正處于快速發展階段,市場需求正處于爆發期,上大學網&#xff08;www.sdaxue.com&#xff09;認為&#xff0c;對于有興趣的個人或企業而言&#xff0c;現在可能是一個適合進入的時機&#xff0c;以下是具體的分析&#xff0c;供大家參考&#xff01; 一、AIGC行業前…

網絡安全基礎知識

目錄 1、什么是防火墻&#xff1f;什么是堡壘主機&#xff1f;什么是DMZ&#xff1f; 2、網絡安全的本質是什么&#xff1f; 3、計算機網絡安全所面臨的威脅分為哪幾類&#xff1f;從人的角度&#xff0c;威脅網絡安全的因素有哪些&#xff1f; 4、網絡攻擊和防御分別包括那…

zip file is empty

從下找到報錯的jar包。展開這個jar包&#xff0c;看下是否正常&#xff0c;正常的是能夠展開看到一些文件夾以及里面的類&#xff0c;如下&#xff1a;如果不正常&#xff0c;就刪除這個jar包&#xff0c;同時找到這個jar包在本地maven倉庫的地址&#xff0c;也刪除掉&#xff…

string類實現

目錄 string類實現 1.構造函數&#xff08;三種&#xff09; 2.c_str()函數 3.operator[] 重載 4.size()函數實現 5.迭代器 6.reserve()函數實現 7.push_back()函數實現 8.append()函數實現 9.operator實現 10.insert() 實現 11.erase()函數實現 12.find()函數實現…

Chrome 瀏覽器的常用命令包括

Chrome 瀏覽器的常用命令包括&#xff1a; 1. **新建標簽頁**&#xff1a;Ctrl T &#xff08;在 Windows/Linux 下&#xff09;&#xff0c;Command T &#xff08;在 macOS 下&#xff09;。 2. **關閉當前標簽頁**&#xff1a;Ctrl W &#xff08;在 Windows/Linux 下&…

Java面試八股之Collection和Collections的區別

Java中Collection和Collections的區別 Collection 是一個接口&#xff0c;位于 java.util 包中&#xff0c;它是 Java 集合框架的頂層接口之一&#xff0c;代表了一組對象的集合。Collection 接口定義了所有集合類型&#xff08;如 List、Set、Queue 等&#xff09;所共有的基…

LeetCode2352相等行列對

題目描述 給你一個下標從 0 開始、大小為 n x n 的整數矩陣 grid &#xff0c;返回滿足 Ri 行和 Cj 列相等的行列對 (Ri, Cj) 的數目。如果行和列以相同的順序包含相同的元素&#xff08;即相等的數組&#xff09;&#xff0c;則認為二者是相等的。 解析 針對題目給出的數量級…

cubemx配置stm32f407VET6實現can通信

背景&#xff1a; 項目上需要把原先的TMC5160電機驅動器替換為購買的電機控制模塊&#xff08;該模塊采用canopen通信&#xff09; 移植canopen的前提是can通信正常&#xff0c;現在添加一下can通信&#xff08;先用標準幀&#xff0c;250K bit/S的波特率測試&#xff09; 原理…

個人學習計劃

vue前端&#xff08;一周&#xff09; 05/14 - 05/19 Html、css復習、vue基礎復習、axios復習 05/14 ElementUI學習 05/15 JWT集成驗證碼、token 05/16 vue-route多角色登錄 05/17 增刪查改、文件下載 05/18 Echart餅狀圖 05/19 &#x1f4cc; 附加學習&#xff1a; 父子傳值三…

其它高階數據結構②_圖(概念+存儲+遍歷+最小生成樹)

目錄 1. 圖的概念 2. 圖的存儲結構 2.1 鄰接矩陣&#xff08;后面算法所用&#xff09; 2.2 鄰接表 3. 圖的遍歷 3.1 BFS廣度優先遍歷 3.2 DFS深度優先遍歷 4. 最小生成樹 4.1 Kruskal算法 4.2 Prim算法 本篇完。 1. 圖的概念 圖是由頂點集合及頂點間的關系組成的一…

重磅!麒麟信安發布CentOS安全加固套件

CentOS Linux 7系統即將在6月30日停服&#xff0c;標志CentOS全部停止更新和維護。黨政、金融、能源、通信、交通、公共服務等關鍵信息基礎設施領域已經投運使用的CentOS系統將無法獲取官方提供的漏洞修復補丁&#xff0c;此后&#xff0c;CentOS系統將面臨巨大的安全風險與危害…

【運維項目經歷|003】:Nginx集群化運維升級項目

目錄 項目名稱 項目背景 項目目標 項目成果 我的角色與職責 我主要完成的工作內容 本次項目涉及的技術 本次項目遇到的問題與解決方法 本次項目中可能被面試官問到的問題 問題1&#xff1a;為什么選擇nginx-1.25.4版本&#xff0c;nginx官方最新版本是哪一個版本&…

河南廣電與LiblibAI簽署戰略合作協議

5月15日&#xff0c;河南廣電科技與LiblibAI戰略簽約儀式在鄭州中原福塔新聞發布廳隆重舉行。雙方將本著“共商、共享、共建、共贏”原則&#xff0c;基于全面、可持續的戰略合作伙伴關系&#xff0c;發揮各自優勢&#xff0c;共同聚焦生成式AI領域&#xff0c;圍繞內容創作、商…

CPU占用率過高排查

CPU占用率高是設備本身的一種現象&#xff0c;直觀表現為display cpu-usage命令查詢結果中整機CPU占用率“CPU usage”偏高&#xff0c;如超過70%。在網絡運行中CPU高常常會導致其他業務異常&#xff0c;如BGP震蕩、VRRP頻繁切換、甚至設備無法登錄。 通常&#xff0c;整機CPU占…

Java基礎教程 - 7 面向對象-1

更好的閱讀體驗&#xff1a;點這里 &#xff08; www.doubibiji.com &#xff09; 更好的閱讀體驗&#xff1a;點這里 &#xff08; www.doubibiji.com &#xff09; 更好的閱讀體驗&#xff1a;點這里 &#xff08; www.doubibiji.com &#xff09; 7 面向對象 面向對象&am…

無人售貨奶柜:掘金新零售藍海,

無人售貨奶柜&#xff1a;掘金新零售藍海&#xff0c; 在日新月異的商業浪潮中&#xff0c;無人奶柜猶如一股清新的創業颶風&#xff0c;正以不可阻擋之勢吸引著眾多創業者的目光。這股新興力量以其獨到之處和龐大的市場藍海&#xff0c;預示著一場關于健康、便捷消費方式的深…

【C#】DateTime類型數組含有null?并排序

代碼 internal class Program{static void Main(string[] args){List<DateTime?> dateTimes new List<DateTime?> { null,DateTime.MinValue,DateTime.MaxValue};var temp new List<DateTime?> { };dateTimes.Sort();//dateTimes.Reverse();foreach (va…