我正在使用Windows Media Foundation跟踪应用程序中的所有麦克风和摄像机。拔下麦克风时,我得到的是事件类型MEError而不是 MECaptureAudioSessionDeviceRemoved 。我尝试拔出通过USB和音频插孔连接的Mics,并且总是收到ID为MEError的事件类型。当我获得预期的MEVideoCaptureDeviceRemoved事件类型时,视频捕获设备(网络摄像头)未出现该问题。
麦克风已正确初始化,因为我可以正确听到音频。

我在互联网上发现了关于此特定问题(从媒体基金会拔下麦克风)的零信息。最重要的是,我是一名新手C#开发人员。我很好奇我为什么不得到MECaptureAudioSessionDeviceRemoved而是得到MEError?这是Mic驱动程序开发人员未实现的,还是我的代码中存在错误?

这是我获取EventType的代码(这不是我的问题完全必要的)该函数所属的类实现IMFAsyncCallback-

HRESULT MicCaptureSession::Invoke(IMFAsyncResult* pAsyncResult)
{
    ComPointerCustom<IMFMediaEvent> pEvent;

    HRESULT hr = S_OK;

    std::lock_guard<std::mutex> lock(m_critSec);

    if (pAsyncResult == 0)
    {
        return E_UNEXPECTED;
    }

    hr = m_localSession->EndGetEvent(pAsyncResult, &pEvent);

    MediaEventType eventType;
    HRESULT hr = S_OK;
    HRESULT hrStatus = S_OK;

    UINT32 TopoStatus = MF_TOPOSTATUS_INVALID;

    if (pEvent== NULL)
        return E_UNEXPECTED;

    hr = pEvent->GetType(&eventType);   <------ Y U NO WORK ??

    if (FAILED(hr))
    {
        return E_UNEXPECTED;
    }

    hr = pEvent->GetStatus(&hrStatus);

    if (FAILED(hr))
    {
        return E_UNEXPECTED;
    }
    /* ----- MORE CODE -----*/
}

最佳答案

我不能确切地说出原因,但我可以建议您检查更多错误调用。音频捕获不同于视频捕获-视频捕获通常在帧之间大约有33 ms,但是音频捕获大约有5-10 ms,并且它可以生成MEError,然后Windows音频驱动程序生成MECaptureAudioSessionDeviceRemoved。
而且,通常MF源会产生错误链。尝试检查来自音频捕获源的更多错误调用。

10-07 21:22