IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Api C++ pour video controllers


Sujet :

C++

  1. #1
    Membre régulier Avatar de jagboys
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 166
    Points : 111
    Points
    111
    Par défaut Api C++ pour video controllers
    Bonjour à tous,

    Je travaille sur un projet où il faut récupérer le stream d'une carte tuner tv usb.
    L'OS est Windows 10.

    Au début j'ai pensé pouvoir travaillé avec les API Media Foundation mais après avoir passé du temps à chercher sur MSDN j'ai trouvé qu'il ne supporte pas les cartes TV.
    L'api arrive à énumérer les périphériques de types webcam sans problèmes mais pas les cartes TV.

    Je me suis donc rabattu vers DirectShow.
    Là encore j'arrive à énumérer les périphériques de types webcam mais pas les cartes TV.
    Après recherche j'ai compris qu'il faut travailler avec les filtres et les couches d'accès BDA (Broadcast Driver Architecture). Cependant il n' y a pas vraiment de guide sous MSDN.

    Avez vous une idée d'ou je pourrais trouver des exemples ou des guides ?
    Si vous d'autres idées ou API je suis preneur pour expérimenter.

    Merci de vos conseils.

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 163
    Points
    17 163
    Par défaut
    Que dit le site du constructeur de ta carte?

  3. #3
    Membre régulier Avatar de jagboys
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 166
    Points : 111
    Points
    111
    Par défaut
    Bonjour,
    A part les pilotes rien sur le sujet.
    Merci,

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 170
    Points : 12 291
    Points
    12 291
    Par défaut
    Ces drivers sont-ils compatibles BDA ?
    Sinon, ils doivent bien implémenter une API, non ?

  5. #5
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 474
    Points
    11 474
    Billets dans le blog
    11
    Par défaut
    Salut!

    En utilisant DirectShow, quelle méthode as-tu suivi pour énumérer les prériphériques de capture présents sur ta machine?
    Ta casrte TV fournit-elle des filtres DirectShow te permettant d'utiliser ce dernier? Ou juste une API propriétaire?

  6. #6
    Membre régulier Avatar de jagboys
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 166
    Points : 111
    Points
    111
    Par défaut
    Salut !

    Voici la méthode que j'ai utilisé pour lister les périphériques. (je l'ai prise du MSDN)
    Le résultat est qu'il trouve bien ma webcam mais pas la carte tv.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
            HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
    	if (SUCCEEDED(hr))
    	{
    		IEnumMoniker *pEnum;
     
    		hr = EnumerateDevices(AM_KSCATEGORY_TVTUNER, &pEnum);
    		if (SUCCEEDED(hr))
    		{
    			DisplayDeviceInformation(pEnum);
    			pEnum->Release();
    		}
    		hr = EnumerateDevices(CLSID_VideoInputDeviceCategory, &pEnum);
    		if (SUCCEEDED(hr))
    		{
    			DisplayDeviceInformation(pEnum);
    			pEnum->Release();
    		}
    		hr = EnumerateDevices(CLSID_AudioInputDeviceCategory, &pEnum);
    		if (SUCCEEDED(hr))
    		{
    			DisplayDeviceInformation(pEnum);
    			pEnum->Release();
    		}
    		CoUninitialize();
    	}
    Sur ma machine voila ce que j'ai comme périphériques :

    Nom : tvtuner.png
Affichages : 260
Taille : 25,2 Ko

    Merci pour votre aide.

  7. #7
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 474
    Points
    11 474
    Billets dans le blog
    11
    Par défaut
    Ca ne dit pas si ton driver fournit des filtres DirectShow, et apparemment ce n'est pas le cas, vu que ton code d'énumération de devices a l'air correct.
    Pour savoir s'il y a des filtres DShow pour ta carte, tu peux tenter d'utiliser GraphEdit, et de regarder les filtres disponibles.

    Sinon, tu as un SDK, pour taper sur ta carte tuner?

    EDIT:

    On peut voir le code de DisplayDeviceInformation?

  8. #8
    Membre régulier Avatar de jagboys
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 166
    Points : 111
    Points
    111
    Par défaut
    Bonjour,

    Je ne connais pas bien cette partie. En cherchant j'ai trouvé GraphEdit et voila ce que j'ai comme filtres.

    Nom : bda_filter_1.png
Affichages : 245
Taille : 15,4 Ko

    Nom : bda_filter_2.png
Affichages : 259
Taille : 14,1 Ko

    Je ne vois pas de filtres sous DShow concernant cette carte.
    Au niveau API je n'ai rien non plus.

    Comment peut on faire ?

    Un logiciel comme PouchinTVMod arrive à voir cette carte. J'ai fouillé ces sources mais je n'arrive pas à tout comprendre.
    A aucun moment, il fait cet énumération.

    Sinon voici le code de DisplayDeviceInformation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    void DisplayDeviceInformation(IEnumMoniker *pEnum)
    {
        IMoniker *pMoniker = NULL;
     
        while (pEnum->Next(1, &pMoniker, NULL) == S_OK)
        {
            IPropertyBag *pPropBag;
            HRESULT hr = pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag));
            if (FAILED(hr))
            {
                pMoniker->Release();
                continue;  
            } 
     
            VARIANT var;
            VariantInit(&var);
     
            // Get description or friendly name.
            hr = pPropBag->Read(L"Description", &var, 0);
            if (FAILED(hr))
            {
                hr = pPropBag->Read(L"FriendlyName", &var, 0);
            }
            if (SUCCEEDED(hr))
            {
                printf("%S\n", var.bstrVal);
                VariantClear(&var); 
            }
     
            hr = pPropBag->Write(L"FriendlyName", &var);
     
            // WaveInID applies only to audio capture devices.
            hr = pPropBag->Read(L"WaveInID", &var, 0);
            if (SUCCEEDED(hr))
            {
                printf("WaveIn ID: %d\n", var.lVal);
                VariantClear(&var); 
            }
     
            hr = pPropBag->Read(L"DevicePath", &var, 0);
            if (SUCCEEDED(hr))
            {
                // The device path is not intended for display.
                printf("Device path: %S\n", var.bstrVal);
                VariantClear(&var); 
            }
     
            pPropBag->Release();
            pMoniker->Release();
        }
    }
    Merci de votre aide.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 170
    Points : 12 291
    Points
    12 291
    Par défaut
    Il faut savoir doit vient "IEnumMoniker *pEnum" passé en paramètre.

  10. #10
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 474
    Points
    11 474
    Billets dans le blog
    11
    Par défaut
    Il est récupéré auparavant (dans un de ses messages précédents)

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 170
    Points : 12 291
    Points
    12 291
    Par défaut
    Oui, ça c'est dans son code, moi, c'est dans le code de "PouchinTVMod" qui lui récupère le mistigris.

  12. #12
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Bonjour.

    Cela ressemble à un cas particulier que je n'ai jamais rencontré, surtout l'histoire du BDA.

    Voici deux liens en rapport avec BDA :

    https://msdn.microsoft.com/fr-fr/lib...(v=vs.85).aspx

    https://msdn.microsoft.com/fr-fr/lib...(v=vs.85).aspx

    Ce n'est pas très documenté, mais cela semble se rapprocher de votre problème. Dans tous les cas, c'est une piste que j'explorerais. Notamment ceci :

    If you are creating a digital TV graph manually (rather than using the Video Control), use CoCreateInstance and IFilterGraph::AddFilter to add this filter to the graph. The ICaptureGraphBuilder2 interface does not automatically add this filter to the graph.

  13. #13
    Membre régulier Avatar de jagboys
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 166
    Points : 111
    Points
    111
    Par défaut
    Bonsoir,

    Je commence à comprendre comment PouchinTvMod arrive à récupérer ces infos.

    Il attaque directement la base des registres en cherchant par exemple les GUID suivant :

    HKLM\SYSTEM\ControlSet001\Control\DeviceClasses

    KSCATEGORY_BDA_NETWORK_TUNER = 71985F48-1CA1-11d3-9CC8-00C04F7971E0
    KSCATEGORY_BDA_RECEIVER_COMPONENT = FD0A5AF4-B41D-11d2-9C95-00C04F7971E0

    La base des registres donne le devicepath. Grace à ce devicepath, j'ai l'impression qu'il crée le Moniker.

    Je trouve que c'est un peu tordu dans le sens ou l'on utilise pas l'API DShow.

    Je vais de voir si l'on peut arriver à énumérer avec la catégorie KSCATEGORY_BDA_NETWORK_TUNER.

    Bref c'est quoi la différence de KSCATEGORY_BDA_NETWORK_TUNER par rapport à AM_KSCATEGORY_TVTUNER et CLSID_VideoInputDeviceCategory ?

    Si vous avez d'autres idées ou conseils je suis preneur.

    Merci de votre aide.

  14. #14
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Bonjour.

    Citation Envoyé par jagboys Voir le message
    Bonsoir,

    Je commence à comprendre comment PouchinTvMod arrive à récupérer ces infos.

    Il attaque directement la base des registres en cherchant par exemple les GUID suivant :

    HKLM\SYSTEM\ControlSet001\Control\DeviceClasses

    KSCATEGORY_BDA_NETWORK_TUNER = 71985F48-1CA1-11d3-9CC8-00C04F7971E0
    KSCATEGORY_BDA_RECEIVER_COMPONENT = FD0A5AF4-B41D-11d2-9C95-00C04F7971E0

    La base des registres donne le devicepath. Grace à ce devicepath, j'ai l'impression qu'il crée le Moniker.

    Je trouve que c'est un peu tordu dans le sens ou l'on utilise pas l'API DShow.
    La réponse est ici : https://msdn.microsoft.com/fr-fr/lib...(v=vs.85).aspx

    The BDA Network Provider is the source filter for any digital television filter graph based on Microsoft Broadcast Driver Architecture (BDA).
    Visiblement, les développeurs de cette carte ont choisi ce système de driver, et c'est pour cela que ce n'est pas énumérable avec du DirectShow classique.

  15. #15
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 474
    Points
    11 474
    Billets dans le blog
    11
    Par défaut
    C'est énumérable avec du Direct Show classique, car GraphEdit les liste, par contre il faut donc définir le GUID approprié à la mano:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // {71985F48-1CA1-11D3-9CC8-00C04F7971E0}
    DEFINE_GUID( KSCATEGORY_BDA_NETWORK_TUNER, 0x71985F48, 0x1CA1, 0x11D3, 0x9C, 0xC8, 0x00, 0xC0, 0x4F, 0x79, 0x71, 0xE0 );
     
    // {FD0A5AF4-B41D-11d2-9C95-00C04F7971E0}
    DEFINE_GUID( KSCATEGORY_BDA_RECEIVER_COMPONENT, 0xFD0A5AF4, 0xB41D, 0x11D2, 0x9C, 0x95, 0x00, 0xC0, 0x4F, 0x79, 0x71, 0xE0 );
    A partir de là, il devrait être possible de les énumérer de la même manière que les autres filtres DShow.

  16. #16
    Membre régulier Avatar de jagboys
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 166
    Points : 111
    Points
    111
    Par défaut
    Bonjour à tous,

    Voila ce que celà donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    #include <dshow.h>
    #include <ks.h>
    #include <ksmedia.h>
    #include <bdatypes.h>
    #include <bdamedia.h>
     
    #pragma comment(lib, "strmiids")
     
    HRESULT EnumerateDevices(REFGUID category, IEnumMoniker **ppEnum)
    {
    	// Create the System Device Enumerator.
    	ICreateDevEnum *pDevEnum;
    	HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
    		CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum));
     
    	if (SUCCEEDED(hr))
    	{
    		// Create an enumerator for the category.
    		hr = pDevEnum->CreateClassEnumerator(category, ppEnum, 0);
    		if (hr == S_FALSE)
    		{
    			hr = VFW_E_NOT_FOUND;  // The category is empty. Treat as an error.
    		}
    		pDevEnum->Release();
    	}
    	return hr;
    }
     
    void DisplayDeviceInformation(IEnumMoniker *pEnum)
    {
    	IMoniker *pMoniker = NULL;
     
    	while (pEnum->Next(1, &pMoniker, NULL) == S_OK)
    	{
    		IPropertyBag *pPropBag;
    		HRESULT hr = pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag));
    		if (FAILED(hr))
    		{
    			pMoniker->Release();
    			continue;
    		}
     
    		VARIANT var;
    		VariantInit(&var);
     
    		// Get description or friendly name.
    		hr = pPropBag->Read(L"Description", &var, 0);
    		if (FAILED(hr))
    		{
    			hr = pPropBag->Read(L"FriendlyName", &var, 0);
    		}
    		if (SUCCEEDED(hr))
    		{
    			printf("%S\n", var.bstrVal);
    			VariantClear(&var);
    		}
     
    		hr = pPropBag->Write(L"FriendlyName", &var);
     
    		// WaveInID applies only to audio capture devices.
    		hr = pPropBag->Read(L"WaveInID", &var, 0);
    		if (SUCCEEDED(hr))
    		{
    			printf("WaveIn ID: %d\n", var.lVal);
    			VariantClear(&var);
    		}
     
    		hr = pPropBag->Read(L"DevicePath", &var, 0);
    		if (SUCCEEDED(hr))
    		{
    			// The device path is not intended for display.
    			printf("Device path: %S\n", var.bstrVal);
    			VariantClear(&var);
    		}
     
    		pPropBag->Release();
    		pMoniker->Release();
    	}
    }
     
    int main()
    {
    	HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
    	if (SUCCEEDED(hr))
    	{
    		IEnumMoniker *pEnum;
     
    		hr = EnumerateDevices(KSCATEGORY_BDA_NETWORK_TUNER, &pEnum);
    		if (SUCCEEDED(hr))
    		{
    			DisplayDeviceInformation(pEnum);
    			pEnum->Release();
    		}
    		CoUninitialize();
    	}
    }
    Et le résultat :

    Nom : dev1.png
Affichages : 247
Taille : 5,8 Ko

    Merci encore à tous de m'avoir remis sur la bonne route.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Cherche API Java pour reconnaissance de caracteres (OCR) sur video
    Par yazidnes dans le forum EDI et Outils pour Java
    Réponses: 0
    Dernier message: 08/05/2014, 14h06
  2. API Java pour manipuler fichier video
    Par jpgros dans le forum Multimédia
    Réponses: 1
    Dernier message: 03/10/2006, 23h57
  3. [Windows]Api win32 pour java
    Par cpanette dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 27/06/2005, 15h06
  4. Conseils sur une API simple pour Windows
    Par alejandro dans le forum Choisir un environnement de développement
    Réponses: 4
    Dernier message: 28/04/2005, 18h12
  5. Est ce que ça existe une api java pour code barre ?
    Par miloud dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 14/04/2005, 17h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo