windows 桌面采集音频

头文件:

#ifndef __CAPTURE_AUDIO__
#define __CAPTURE_AUDIO__#include <functional>
#include <windows.h>
#pragma comment(lib, "winmm.lib")class CaptureAudio
{
public:CaptureAudio();~CaptureAudio();public:bool Init(const std::function<void(unsigned char* pPcmAudioData, long nLen)>& pFunc);void Uninit();private:bool Capture();private:static unsigned int __stdcall Process(void* args);private:unsigned char* m_pAudioData = nullptr;private:HANDLE m_threadRecv = INVALID_HANDLE_VALUE;HANDLE m_threadEvent = INVALID_HANDLE_VALUE;private:WAVEHDR m_wHdr; //采集音频时包含数据缓存的结构体HWAVEIN m_hWaveIn;//输入设备private:std::function<void(unsigned char* pPcmAudioData, long nLen)> m_pFunc;
};#endif

源文件:

#include "CaptureAudio.h"
#include <chrono>
#include <thread>using namespace std;CaptureAudio::CaptureAudio()
{while (!m_pAudioData) {try{m_pAudioData = new unsigned char[1024 * 1024];}catch (...){}}
}
CaptureAudio::~CaptureAudio()
{if (m_pAudioData) {delete[]m_pAudioData;m_pAudioData = nullptr;}
}bool CaptureAudio::Init(const std::function<void(unsigned char* pPcmAudioData, long nLen)>& pFunc)
{UINT nDev = waveInGetNumDevs();if (nDev == 0) {return false;}WAVEFORMATEX waveform; //采集音频的格式,结构体waveform.wFormatTag = WAVE_FORMAT_PCM;//声音格式为PCMwaveform.nSamplesPerSec = 48000;//采样率,16000次/秒waveform.wBitsPerSample = 16;//采样比特,16bits/次waveform.nChannels = 1;//采样声道数,2声道waveform.nAvgBytesPerSec = 16000;//每秒的数据率,就是每秒能采集多少字节的数据waveform.nBlockAlign = 2;//一个块的大小,采样bit的字节数乘以声道数waveform.cbSize = 0;//一般为0MMRESULT hResults = waveInOpen(&m_hWaveIn, WAVE_MAPPER, &waveform, (DWORD_PTR)0, (DWORD_PTR)this, CALLBACK_NULL);//使用waveInOpen函数开启音频采集if (hResults != MMSYSERR_NOERROR) {return false;}m_threadEvent = CreateEvent(NULL, true, false, L"");m_threadRecv = (HANDLE)_beginthreadex(NULL, 0, Process, this, 0, NULL);m_pFunc = pFunc;return true;
}void CaptureAudio::Uninit()
{if (m_threadRecv != INVALID_HANDLE_VALUE && m_threadEvent != INVALID_HANDLE_VALUE) {SetEvent(m_threadEvent);WaitForSingleObject(m_threadRecv, INFINITE);CloseHandle(m_threadRecv);CloseHandle(m_threadEvent);m_threadRecv = INVALID_HANDLE_VALUE;m_threadEvent = INVALID_HANDLE_VALUE;}waveInUnprepareHeader(m_hWaveIn, &m_wHdr, sizeof(WAVEHDR));waveInStop(m_hWaveIn);waveInClose(m_hWaveIn);
}bool CaptureAudio::Capture()
{waveInUnprepareHeader(m_hWaveIn, &m_wHdr, sizeof(WAVEHDR));memset(m_pAudioData, 0, 1024 * 1024);m_wHdr.lpData = (LPSTR)m_pAudioData;m_wHdr.dwBufferLength = 1024 * 1024;m_wHdr.dwBytesRecorded = 0;m_wHdr.dwUser = 0;m_wHdr.dwFlags = WHDR_DONE;m_wHdr.dwLoops = 1;waveInPrepareHeader(m_hWaveIn, &m_wHdr, sizeof(WAVEHDR));//准备一个波形数据块头用于录音waveInAddBuffer(m_hWaveIn, &m_wHdr, sizeof(WAVEHDR));//指定波形数据块为录音输入缓存MMRESULT hResults = waveInStart(m_hWaveIn);//开始录音if (hResults != MMSYSERR_NOERROR) {return false;}std::this_thread::sleep_for(std::chrono::milliseconds(100));waveInReset(m_hWaveIn);if (m_pFunc) {m_pFunc(m_pAudioData, m_wHdr.dwBytesRecorded);}return true;
}unsigned int CaptureAudio::Process(void* args)
{CaptureAudio* pThis = (CaptureAudio*)args;while (true) {if (WaitForSingleObject(pThis->m_threadEvent, 0) == WAIT_OBJECT_0) {break;}pThis->Capture();}return 0;
}

生成的文件pcm:

 

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

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

相关文章

uniapp中uni.request的统一封装 (ts版)

文章目录 前言一、我们为什么要去封装&#xff1f;二、具体实现1.创建一个请求封装文件&#xff1a;2.封装 uni.request&#xff1a;3.如何去使用&#xff1f; 总结 前言 在uniapp中如何去更简洁高效的发送我们的请求&#xff0c;下面就介绍了uni.request()二次封装。 一、我们…

C++ | Leetcode C++题解之第446题等差数列划分II-子序列

题目&#xff1a; 题解&#xff1a; class Solution { public:int numberOfArithmeticSlices(vector<int> &nums) {int ans 0;int n nums.size();vector<unordered_map<long long, int>> f(n);for (int i 0; i < n; i) {for (int j 0; j < i;…

音视频入门基础:FLV专题(7)——Tag header简介

一、引言 从《音视频入门基础&#xff1a;FLV专题&#xff08;3&#xff09;——FLV header简介》中可以知道&#xff0c; 在FLV header之后&#xff0c;FLV文件剩下的部分应由PreviousTagSize和Tag组成。FLV文件 FLV header PreviousTagSize0 Tag1 PreviousTagSize1 Ta…

最新BurpSuite2024.9专业中英文开箱即用版下载

1、工具介绍 本版本更新介绍 此版本对 Burp Intruder 进行了重大改进&#xff0c;包括自定义 Bambda HTTP 匹配和替换规则以及对扫描 SOAP 端点的支持。我们还进行了其他改进和错误修复。 Burp Intruder 的精简布局我们对 Burp Intruder 进行了重大升级。现在&#xff0c;您可…

【Canvas与徽章】金圈蓝底国庆75周年徽章

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>金边黑盾75周年</title><style type"text/css"&g…

sql语句牛客练习

文章目录 1. SQL21 浙江大学用户题目回答情况① 错误② 正确 2. SQL22 统计每个学校的答过题的用户的平均答题数① 错误② 正确 3. SQL23 统计每个学校各难度的用户平均刷题数4. SQL25 查找山东大学或者性别为男生的信息① 错误② 正确 5. SQL26 计算25岁以上和以下的用户数量①…

Linux相关概念和重要知识点(11)(进程调度、Linux内核链表)

1.Linux调度算法 上篇文章我粗略讲过queue[140]的结构&#xff0c;根据哈希表&#xff0c;我们可以将40个不同优先级的进程借助哈希桶链入queue[140]中。调度器会根据queue的下标来进行调度。但这个具体的调度过程是怎样的呢&#xff1f;以及runqueue和queue[140]的关系是什么…

DC00025【含论文】基于协同过滤推荐算法springboot视频推荐管理系统

1、项目功能演示 DC00025【含文档】基于springboot短视频推荐管理系统协同过滤算法视频推荐系统javaweb开发程序设计vue 2、项目功能描述 短视频推荐系统分为用户和系统管理员两个角色 2.1 用户角色 1、用户登录、用户注册 2、视频中心&#xff1a;信息查看、视频收藏、点赞、…

Leecode热题100-84.柱状图中的最大矩形

给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释&#xff1a;最大的矩形为图…

Python核心知识:pip使用方法大全

什么是 pip&#xff1f; pip 是 Python 的包管理工具&#xff0c;允许用户安装、升级和管理 Python 的第三方库和依赖。它极大地简化了开发过程&#xff0c;使开发者可以轻松地获取并安装所需的软件包。pip 已成为 Python 项目中最常见的包管理工具&#xff0c;并且自 Python …

SQL第10课挑战题

1. 从OrderItems表中返回每个订单号order_num各有多少行数order_lines&#xff0c;并按order_lines对结果进行排序 2. 返回名为cheapest_item的字段&#xff0c;该字段包含每个供应商成本最低的产品&#xff08;使用products表中的prod_price)&#xff0c;然后从最低成本到最高…

房屋水电费:重新布局,重构JS代码

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>房租水电费</title><script type"…

计算机网络:计算机网络概述:网络、互联网与因特网的区别

文章目录 网络、互联网与因特网的区别网络分类 互联网因特网基于 ISP 的多层次结构的互连网络因特网的标准化工作因特网管理机构因特网的组成 网络、互联网与因特网的区别 若干节点和链路互连形成网络&#xff0c;若干网络通过路由器互连形成互联网 互联网是全球范围内的网络…

「安装」 Windows下安装CUDA和Pytorch

「安装」 Windows下安装CUDA和Pytorch 文章目录 「安装」 Windows下安装CUDA和PytorchMac、Linux、云端Windows安装CUDA安装miniconda安装PyTorch测试总结 其他 Mac、Linux、云端 Mac、Linux、云端安装Miniconda和Pytorch的方法参考其他资料。 Windows 下面进行Windows下安装…

VB.net读写NDEF标签URI智能海报WIFI蓝牙连接

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 Public Class Form1Dim oldpicckey(0 To 5) As Byte 卡片旧密码Dim newpicckey(0 To 5) As Byte 卡片新密码Function GetTagUID() As StringDim status As ByteDim myctrlword As …

Python编程和开发过程中让人编程效率和舒适度很高的工具Anaconda

编程工作为什么需要提高效率&#xff1f; 在日益繁忙的工作环境中&#xff0c;选择合适的编程工具已成为提升开发者工作效率的关键。不同的工具能够帮助我们简化代码编写、自动化任务、提升调试速度&#xff0c;甚至让团队协作更加顺畅。 那么&#xff0c;编写python代码过程中…

c#使用winscp库实现FTP/SFTP/SCP的获取列表、上传和下载功能

网上写c#调用winscp实现的资料很少&#xff0c;且写的不够详细。本人查了下winscp的libraries说明&#xff0c;写了个小工具&#xff0c;供大家参考。 winscp的接口说明地址如下&#xff1a; WinSCP .NET Assembly and COM Library :: WinSCP 一、先展示一下小工具的界面 1、…

资源《Arduino 扩展板3-WS2812》说明。

资源链接&#xff1a; Arduino 扩展板3-WS2812 1.文件明细&#xff1a; 2.文件内容说明 包含&#xff1a;AD工程、原理图、PCB。 3.内容展示 4.简述 该文件为PCB工程&#xff0c;采用AD做的。 该文件打板后配合Arduino使用&#xff0c;属于Arduino的扩展板。 该文件主要…

AI助力CMIP6数据处理技术及在气候变化、生态农业、水文多领域实践应用

查看原文>>>AI助力CMIP6数据处理技术及在气候变化、生态农业、水文多领域实践应用 目录 专题一 CMIP6中的模式比较计划 专题二 数据下载 专题三 基础知识3.1 Python基础 专题四 单点降尺度 专题五 统计方法的区域降尺度 专题六 基于WRF模式的动力降尺度 专题七…

RabbitMQ的相关题

一、 MQ的作⽤及应⽤场景 类似问题: 项⽬什么场景下使⽤到了MQ, 为什么需要MQ? RabbitMQ 的作⽤?使⽤场景有哪些? RabbitMQ…