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;

}

相关推荐
微网兔子24 分钟前
伺服器用什么语言开发呢?做什么用什么?
服务器·c++·后端·游戏
YuforiaCode26 分钟前
第十三届蓝桥杯 2022 C/C++组 修剪灌木
c语言·c++·蓝桥杯
YOULANSHENGMENG41 分钟前
linux 下python 调用c++的动态库的方法
c++·python
CodeWithMe1 小时前
【C++】STL之deque
开发语言·c++
SsummerC1 小时前
【leetcode100】零钱兑换Ⅱ
数据结构·python·算法·leetcode·动态规划
炯哈哈1 小时前
【上位机——MFC】运行时类信息机制
开发语言·c++·mfc·上位机
好易学·数据结构2 小时前
可视化图解算法:二叉树的最大深度(高度)
数据结构·算法·二叉树·最大高度·最大深度·二叉树高度·二叉树深度
程序员-King.2 小时前
day47—双指针-平方数之和(LeetCode-633)
算法·leetcode
阳洞洞2 小时前
leetcode 1035. Uncrossed Lines
算法·leetcode·动态规划·子序列问题
小鹿鹿啊3 小时前
C语言编程--15.四数之和
c语言·数据结构·算法