2016-05-13 1 views
0

J'utilise Windows Media Foundation pour garder une trace de tous les micros et caméras dans une application. Je reçois le type d'événement MEError au lieu de MECaptureAudioSessionDeviceRemoved lorsque je débranche un micro. J'ai essayé de débrancher des micros branchés via une prise USB et audio et j'ai toujours un eventtype avec l'identifiant MEError. Le problème n'est pas vu avec le périphérique de capture vidéo (webcam) car j'obtiens le type d'événement attendu MEVideoCaptureDeviceRemoved. Les micros sont initialisés correctement car j'entends correctement l'audio.Windows Media Foundation: débrancher le périphérique de capture audio renvoie un mauvais événement

J'ai trouvé zéro information sur ce problème particulier (débranchement du micro avec la fondation de médias) sur les internets. En plus de cela, je suis un débutant C# dev. Je suis curieux de comprendre pourquoi je ne reçois pas le MECaptureAudioSessionDeviceRemoved mais obtenir le MEError? Est-ce quelque chose que le développeur du pilote Mic n'a pas implémenté ou est-ce quelque chose attendu si une erreur existe dans mon code?

Voici mon code pour obtenir le EventType (Pas exactement nécessaire à ma question) La classe cette fonction appartient implémente 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 -----*/ 
} 

Répondre

0

Je ne peux pas dire la raison exactement cela, mais je peux vous conseiller de vérifier plus erreur invoquée. La capture audio est différente de la capture vidéo - la capture vidéo a généralement environ 33 ms entre les images, mais la capture audio a environ 5 - 10 ms, et elle peut générer MEError avant que le pilote audio Windows ne génère MECaptureAudioSessionDeviceRemoved. En outre, les sources MF génèrent généralement une chaîne d'erreurs. Essayez de vérifier plus d'invocation d'erreur à partir de la source de capture audio.

+0

Bon point et j'ai vérifié pour cela. Il y a seulement une invocation qui arrive et qui est de type MEError. Il n'y a plus d'événement invoqué après cela. Idem sur webcam débranchez, un seul événement et qui est de type EVideoCaptureDeviceRemoved. – Ashwin

+0

C'est une question inhabituelle. J'ai une certaine expérience avec MF et capturer la vidéo et l'audio dessus: [Capture-Live-vidéo-de-Web-caméra-sur-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). De l'événement MSDN - MECaptureAudioSessionDeviceRemoved Envoyé par une source de capture audio lorsque le périphérique est supprimé. Cela signifie que cet événement doit être envoyé par Source, mais dans le code, vous essayez de l'attraper par MicCaptureSession à partir de la session. Quelle session? –

+0

Un autre bon point. Chacun de mon périphérique Mic est de type [IMFMediaEventGenerator] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms701755%28v=vs.85%29.aspx) et je branche MicCaptureSession (implémente IMFAsyncCallback) sur le périphérique à l'aide de [BeginGetEvent] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms701637%28v=vs.85%29.aspx). Merci d'avoir aidé. Traiter avec du code pas écrit par moi. – Ashwin