2016-05-13 32 views
0

我正在使用Windows媒體基礎來跟蹤應用程序中的所有麥克風和攝像機。當我拔下麥克風時,我收到事件類型​​而不是MECaptureAudioSessionDeviceRemoved。我試圖通過USB和音頻插孔拔掉麥克風,我總是得到一個事件類型,編號爲​​。視頻捕捉設備(網絡攝像頭)沒有看到這個問題,因爲我得到了預期的MEVideoCaptureDeviceRemoved事件類型。 麥克風正在正確初始化,因爲我可以正確聽到音頻。Windows媒體基礎:拔下音頻捕獲設備返回錯誤事件

我在互聯網上發現了關於這個特殊(與媒體基礎拔掉麥克風)問題的零信息。最重要的是,我是一個新手C#開發人員。我很想知道爲什麼我沒有得到MECaptureAudioSessionDeviceRemoved但得到​​?這是Mic驅動程序開發人員沒有實現的東西,或者如果我的代碼中存在錯誤,是否會出現這種情況?

這裏是我用於獲取事件類型(不完全是必要的,我的問題)這個函數所屬的類代碼來實現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 -----*/ 
} 

回答

0

我不能準確說出原因的,但我可以建議你檢查更錯誤調用。音頻捕獲與視頻捕獲不同 - 視頻捕獲通常在幀之間有大約33 ms,但音頻捕獲大約需要5 - 10 ms,並且在Windows音頻驅動程序生成MECaptureAudioSessionDeviceRemoved之前它可能會生成MEError。另外,通常MF資源會產生錯誤鏈。嘗試檢查來自音頻捕獲源的更多錯誤調用。

+0

好點,我檢查了這一點。只有一個調用發生,並且是MEError類型。此後不再有事件調用。同樣在網絡攝像機上拔掉,只有一個事件,並且類型爲EVideoCaptureDeviceRemoved。 – Ashwin

+0

這是一個不尋常的問題。我有一些MF的經驗,並捕捉視頻和音頻:[捕捉 - 實時視頻 - 從網絡攝像頭在Windows](http://www.codeproject.com/Articles/776058/Capturing-Live- Video-from-Web-camera-on-Windows-an),[CaptureManager-SDK](http://www.codeproject.com/Articles/1017223/CaptureManager-SDK)。來自MSDN - MECaptureAudioSessionDeviceRemoved事件 當設備被移除時由音頻捕獲源發送。這意味着此事件必須由Source發送,但在代碼中,您嘗試通過MicCaptureSession從會話中捕獲它。什麼會議? –

+0

另一個好點。我的每個Mic設備都是[IMFMediaEventGenerator](https://msdn.microsoft.com/en-us/library/windows/desktop/ms701755%28v=vs.85%29.aspx)類型,我將MicCaptureSession(使用此[BeginGetEvent](https://msdn.microsoft.com/en-us/library/windows/desktop/ms701637%28v=vs.85%29.aspx)向設備實現IMFAsyncCallback)。感謝您的幫助。處理不是由我寫的代碼。 – Ashwin