Dshow驱动音频or麦克风(mic)并播放声音

#include "stdafx.h"

#include <dshow.h>

#include <iostream>

#pragma comment(lib, "strmiids.lib")

void ListAudioDevices() {

ICreateDevEnum* pDevEnum = nullptr;

IEnumMoniker* pEnum = nullptr;

CoCreateInstance(CLSID_SystemDeviceEnum, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum));

pDevEnum->CreateClassEnumerator(CLSID_AudioInputDeviceCategory, &pEnum, 0);

if (!pEnum) {

std::cout << "没有找到音频输入设备" << std::endl;

return;

}

IMoniker* pMoniker = nullptr;

while (pEnum->Next(1, &pMoniker, nullptr) == S_OK) {

IPropertyBag* pPropBag;

pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag));

VARIANT varName;

VariantInit(&varName);

pPropBag->Read(L"FriendlyName", &varName, 0);

std::wcout << L"设备名称: " << varName.bstrVal << std::endl;

VariantClear(&varName);

pPropBag->Release();

pMoniker->Release();

}

pEnum->Release();

pDevEnum->Release();

}

void CaptureAndPlayAudio(const wchar_t* deviceName) {

IGraphBuilder* pGraph = nullptr;

ICaptureGraphBuilder2* pCaptureBuilder = nullptr;

ICreateDevEnum* pDevEnum = nullptr;

IEnumMoniker* pEnum = nullptr;

IMoniker* pMoniker = nullptr;

// 创建Graph Builder和Capture Graph Builder

CoCreateInstance(CLSID_FilterGraph, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pGraph));

CoCreateInstance(CLSID_CaptureGraphBuilder2, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pCaptureBuilder));

pCaptureBuilder->SetFiltergraph(pGraph);

// 创建设备枚举器并获取音频输入设备

CoCreateInstance(CLSID_SystemDeviceEnum, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum));

pDevEnum->CreateClassEnumerator(CLSID_AudioInputDeviceCategory, &pEnum, 0);

// 查找特定设备

while (pEnum->Next(1, &pMoniker, nullptr) == S_OK) {

IPropertyBag* pPropBag;

pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag));

VARIANT varName;

VariantInit(&varName);

pPropBag->Read(L"FriendlyName", &varName, 0);

if (wcscmp(varName.bstrVal, deviceName) == 0)

{

IBaseFilter* pAudioInputFilter;

pMoniker->BindToObject(0, 0, IID_PPV_ARGS(&pAudioInputFilter));

pGraph->AddFilter(pAudioInputFilter, L"Audio Capture");

// 渲染音频流到系统默认音频输出设备

pCaptureBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Audio, pAudioInputFilter, nullptr, nullptr);

// 启动图表

IMediaControl* pMediaControl;

pGraph->QueryInterface(IID_PPV_ARGS(&pMediaControl));

pMediaControl->Run();

std::wcout << L"正在捕获和播放音频... 按Enter停止。" << std::endl;

std::cin.get(); // 等待按下Enter停止

// 停止并释放资源

pMediaControl->Stop();

pMediaControl->Release();

pAudioInputFilter->Release();

break;

}

VariantClear(&varName);

pPropBag->Release();

pMoniker->Release();

}

// 释放资源

pEnum->Release();

pDevEnum->Release();

pGraph->Release();

pCaptureBuilder->Release();

}

int main() {

// 初始化COM库

CoInitialize(nullptr);

// 列出可用设备

ListAudioDevices();

// 设备名称

const wchar_t* deviceName = L"数字音频接口 (0.5)";

// 捕获并播放音频

CaptureAndPlayAudio(deviceName);

// 释放COM库

CoUninitialize();

return 0;

}

相关推荐
安大小万15 分钟前
C++ 学习:深入理解 Linux 系统中的冯诺依曼架构
linux·开发语言·c++
田梓燊29 分钟前
图论 八字码
c++·算法·图论
Tanecious.1 小时前
C语言--数据在内存中的存储
c语言·开发语言·算法
去往火星1 小时前
opencv在图片上添加中文汉字(c++以及python)
开发语言·c++·python
Bran_Liu1 小时前
【LeetCode 刷题】栈与队列-队列的应用
数据结构·python·算法·leetcode
kcarly2 小时前
知识图谱都有哪些常见算法
人工智能·算法·知识图谱
CM莫问2 小时前
<论文>用于大语言模型去偏的因果奖励机制
人工智能·深度学习·算法·语言模型·自然语言处理
程序猿零零漆2 小时前
《从入门到精通:蓝桥杯编程大赛知识点全攻略》(五)-数的三次方根、机器人跳跃问题、四平方和
java·算法·蓝桥杯
Zfox_3 小时前
【Linux】进程间关系与守护进程
linux·运维·服务器·c++
无限码力3 小时前
路灯照明问题
数据结构·算法·华为od·职场和发展·华为ode卷