2016-05-13 4 views
0

Ich verwende Windows Media Foundation, um alle Mikrofone und Kameras in einer Anwendung zu verfolgen. Ich erhalte Ereignistyp MEError anstelle von MECaptureAudioSessionDeviceRemoved, wenn ich ein Mic abziehe. Ich habe versucht, Mics zu trennen, die über USB und Audiobuchse angeschlossen sind, und ich erhalte immer einen Ereignistyp mit der ID MEError. Das Problem wird nicht mit dem Videoaufnahmegerät (Webcam) angezeigt, da ich den erwarteten Ereignistyp MEVideoCaptureDeviceRemoved erhalte. Die Mikrofone werden korrekt initialisiert, da ich den Ton richtig hören kann.Windows Media Foundation: Beim Trennen des Audioaufnahmegeräts wird ein falsches Ereignis zurückgegeben

Ich habe keine Informationen zu diesem speziellen Problem (Trennen von Mikrofonen mit Media Foundation) im Internet gefunden. Darüber hinaus bin ich ein Neuling C# dev. Ich bin neugierig zu verstehen, warum ich nicht die MECaptureAudioSessionDeviceRemoved bekomme aber die MEError bekommen? Ist das etwas, was der Mic-Treiberentwickler nicht implementiert hat, oder wird etwas erwartet, wenn ein Fehler in meinem Code existiert?

Hier ist mein Code für die Eventtype bekommen (nicht genau notwendig für meine Frage) Die Klasse diese Funktion IMFAsyncCallback implementiert gehört -

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 -----*/ 
} 

Antwort

0

Ich kann nicht genau sagen, Grund es, aber ich kann beraten Sie überprüfen mehr Fehler ruft auf. Die Audioaufnahme unterscheidet sich von der Videoaufnahme - die Videoaufnahme hat normalerweise zwischen den Einzelbildern etwa 33 ms, aber die Audioaufnahme hat etwa 5 - 10 ms, und MEError kann generiert werden, bevor der Windows Audio-Treiber MECaptureAudioSessionDeviceRemoved generiert. Auch MF-Quellen erzeugen in der Regel eine Fehlerkette. Versuchen Sie, weitere Fehler zu überprüfen, die von der Audioaufnahmequelle aufgerufen werden.

+0

Guter Punkt und ich habe dies überprüft. Es gibt nur einen Aufruf, der vom Typ MEError ist. Danach wird kein Ereignis mehr aufgerufen. Gleiches vor der Webcam, nur ein Ereignis vom Typ EVideoCaptureDeviceRemoved. – Ashwin

+0

Es ist eine ungewöhnliche Frage. Ich habe etwas Erfahrung mit MF und erfasse Video und Audio darauf: [Capturing-Live-Video-von-Web-Kamera-auf-Windows] (http://www.codeproject.com/Articles/776058/Capturing-Live- Video-von-Web-Kamera-auf-Windows-ein), [CaptureManager-SDK] (http://www.codeproject.com/Articles/1017223/CaptureManager-SDK). Von MSDN - MECaptureAudioSessionDeviceRemoved-Ereignis Wird von einer Audioaufnahmequelle gesendet, wenn das Gerät entfernt wird. Dies bedeutet, dass dieses Ereignis von Source gesendet werden muss, aber Sie versuchen, es im Code von MicCaptureSession aus der Sitzung abzufangen. Welche Sitzung? –

+0

Ein weiterer guter Punkt. Jedes meiner Mic-Geräte ist vom Typ [IMFMediaEventGenerator] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms701755%28v=vs.85%29.aspx) und ich schließe MicCaptureSession (implementiert IMFAsyncCallback) auf dem Gerät mit diesem [BeginGetEvent] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms701637%28v=vs.85%29.aspx). Danke für die Hilfe. Umgang mit Code, der nicht von mir geschrieben wurde. – Ashwin

Verwandte Themen