您的位置:首页 > 文旅 > 旅游 > 凡科轻站官网_武汉的最新疫情_网络营销推广与策划_百度快照怎么没有了

凡科轻站官网_武汉的最新疫情_网络营销推广与策划_百度快照怎么没有了

2025/4/21 12:21:24 来源:https://blog.csdn.net/u012983289/article/details/143060625  浏览:    关键词:凡科轻站官网_武汉的最新疫情_网络营销推广与策划_百度快照怎么没有了
凡科轻站官网_武汉的最新疫情_网络营销推广与策划_百度快照怎么没有了

#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;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com