none
Pourquoi IBasicVideo::GetCurrentImage(...) ne fonctionne qu'en pas à pas ! RRS feed

  • Question

  • Pourquoi IBasicVideo::GetCurrentImage(...) ne fonctionne qu'en pas à pas !

    J'ai fait le code trouyvé sur internet:

    #include <stdio.h> #include <dshow.h> // change here #define FILENAME L"C:\\DXSDK\\Samples\\Media\\butterfly.mpg" // note that this sample fails on some environment int main() { IGraphBuilder *pGraphBuilder; IMediaControl *pMediaControl; IBasicVideo *pBasicVideo; CoInitialize(NULL); CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (LPVOID *)&pGraphBuilder); pGraphBuilder->QueryInterface(IID_IMediaControl, (LPVOID *)&pMediaControl); pMediaControl->RenderFile(FILENAME); pGraphBuilder->QueryInterface(IID_IBasicVideo, (LPVOID *)&pBasicVideo); pMediaControl->Run(); // Must Pause before using GetCurrentImage pMediaControl->Pause(); // get width and height long height, width; pBasicVideo->get_VideoHeight(&height); pBasicVideo->get_VideoWidth(&width); long bufSize; long *imgData; HRESULT hr; /* The second value is NULL to resolve required buffer size. The required buffer size will be returned in variable "bufSize". */ hr = pBasicVideo->GetCurrentImage(&bufSize, NULL); if (FAILED(hr)) { printf("GetCurrentImage failed\n"); return 1; }

    En mode pas a pas cela fonctionne (point d'arrêt), mais si je lance le hr renvoie 0x8000FFFF !!!

    même si je rajoute l'attente que le média soit ien en pause après la pause,

    comme c'est dit dans la doc:

        hr = pMediaControl->GetState(
                                                INFINITE,
                                                &pfs
                                                );

    Pourquoi cela ne fonctionne pas ????


    Bruno

    mardi 20 août 2019 11:10

Réponses

  • Bonjour Bruno,

    comme c'est dit dans la doc:

        hr = pMediaControl->GetState(
                                                INFINITE,
                                                &pfs
                                                );

    Est-ce que la valeur de hr est S_OK après cette ligne? Essayez d’appeler GetState, ensuite repositionner et appeler cette fonction de nouveau, selon la méthode décrite ici :
    Multiple snapshots fail and wait for graph (je suppose que la méthode get_status de la dernière réponse est en effet IMediaControl::GetState )

    Cordialement,
    Dimitar

    mercredi 21 août 2019 10:53
    Modérateur

Toutes les réponses

  • Bonjour Bruno,

    comme c'est dit dans la doc:

        hr = pMediaControl->GetState(
                                                INFINITE,
                                                &pfs
                                                );

    Est-ce que la valeur de hr est S_OK après cette ligne? Essayez d’appeler GetState, ensuite repositionner et appeler cette fonction de nouveau, selon la méthode décrite ici :
    Multiple snapshots fail and wait for graph (je suppose que la méthode get_status de la dernière réponse est en effet IMediaControl::GetState )

    Cordialement,
    Dimitar

    mercredi 21 août 2019 10:53
    Modérateur
  • Après avoir mis le Controleur de Média en pause,

    Je mets pour récupérer la taille du buffer:

    l_hr_EnCours = pBasicVideo->GetCurrentImage(
                                                        &BufSize,
                                                        NULL
                                                    );

    et BufSize contient la taille du buffer image

    je lance ensuite:

    // Affecter les Datas de l'Image
        pData = (long*)malloc(BufSize );
        
        // Récupérer l'Image en Cours
        l_hr_EnCours = pBasicVideo->GetCurrentImage(
                                                        &BufSize,
                                                        pData
                                                    );
    Cette dernière commande bloque infiniment (pas de passage à la suite !)

    Donc pour la mise en pause (avant le code ci-dessus ) du contrôleur de média:

    J'ai fait une boucle :

    // Mettre en pause le Contôleur de Média avant d'utiliser la Récupération d'Image
        hr = pMediaControl->Pause();
        
        // Si on n'a pas pus mettre en pause le contrôleur de média
        if(FAILED(hr))
        {

    ... Message erreur -->Pas d'erreur la pause a été acceptée !

    }

    Si je rajoute ensuite la vérification d'état du contrôleur de Média:

    // Attendre la pause
        hr = pMediaControl->GetState(
                                                INFINITE,
                                                &pfs
                                                );

    while (l_hr_EnCours != S_OK)
        //while (pfs == VFW_S_STATE_INTERMEDIATE)
        {
            hr_= pMediaControl->GetState(
                                                INFINITE,
                                                &pfs
                                                );
        }

     hr renvoie en boucle la valeur 262760 avec n'importe quel type de caméra.

    Mon client attends et celà fait 2 mois que je bloque là dessus !

    J'ai tout essayé: différents type de caméra, mais rien a faire la fonction direct show pBasicVideo->GetCurrentImage(...) est buguée !!!

    Pourtant, juste avant la mise en pause du Contôleur de M2dia, la vidéo s'affiche bien dans ma fenêtre !


    Bruno


    • Modifié bmoraut dimanche 22 mars 2020 10:20
    samedi 21 mars 2020 10:50
  • Votre exemple est en CSharp.

    Pourquoi une commande aurai besoin d'être attendu et reviendrai alors qu'elle n'a pas fini d'être exécutée ?

    Dans un système de processus, on peut lancer un processus qui attend son execution.

    Si dans un programme les instructions ne s’exécutent pas, mais ou va on !

    Donc l'utilisation de la WebCam n'est pas claire, ou mal faite !


    Bruno

    lundi 23 mars 2020 09:22