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;

}

相关推荐
浮生如梦_2 小时前
Halcon基于laws纹理特征的SVM分类
图像处理·人工智能·算法·支持向量机·计算机视觉·分类·视觉检测
励志成为嵌入式工程师4 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉4 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer4 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq4 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
wheeldown5 小时前
【数据结构】选择排序
数据结构·算法·排序算法
青花瓷6 小时前
C++__XCode工程中Debug版本库向Release版本库的切换
c++·xcode
观音山保我别报错6 小时前
C语言扫雷小游戏
c语言·开发语言·算法
幺零九零零7 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
TangKenny7 小时前
计算网络信号
java·算法·华为