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