2011-09-13 1 views
1

J'utilise DirectShow.Net et j'essaie d'implémenter le ISampleGrabberCB sur une classe.Le rappel ISampleGrabber n'est pas appelé

Afin de mettre en place l'outil de saisie dans le graphique, je suivre cette liste:

  1. Créer un objet SampleGrabber

  2. Définir le format MediaType (AMMediaType: Vidéo, Rgb, VideoInfo) et définissez-le dans l'objet SampleGrabber. HRESULT est 0, donc je pense que c'est ok.

  3. Je définis le rappel avec sampleGrabber.SetCallback (this, 0). Je passe "ceci" parce que l'ISampleGrabber est implémenté et défini dans la classe elle-même; le second paramètre est 0 car je veux que la méthode SampleCB soit invoquée.

  4. Enfin, j'ajoute le filtre au graphique. Le HRESULT est de nouveau 0.

Toutefois, la méthode ISampleGrabber.SampleCB n'est pas appelée.

Avez-vous une idée de la cause de cette mauvaise conduite?

[Modifier]

J'ai découvert ce qui se passe ici! Mais j'ai encore besoin d'aide. Les deux webcams que je possède retournent un format vidéo sous-type YUY2. Comme indiqué ci-dessus, le code que j'utilise force le MediaType à RGB24. Au moment de l'exécution, je peux voir le HResult est 0, donc c'est ok. Mais comme ils sont "incompatibles", le rappel d'échantillon n'est jamais appelé. Si je supprime la définition explicite de sous-type, le rappel est frappé. Cependant le cadre que je reçois est un YUY2; ce n'est pas un bitmap valide et pour cette raison il semble "endommagé", "déformé". À ce stade, j'aimerais savoir comment forcer le format RGB24 ou comment convertir la trame vidéo au format RGB24.

J'ai passé pas mal de temps sur google pour trouver une réponse valide, mais je n'ai pas eu de chance.

Une idée?

Cheers. Gianluca.

+1

Pouvons-nous voir du code? – Goz

+0

@Goz: Le code est vaste et divisé en plusieurs fonctions. Quelle partie aimeriez-vous voir? –

+0

A la lumière de votre montage, il serait probablement bon de voir la partie où vous vous connectez les filtres – Goz

Répondre

0

Vous devez ajouter un convertisseur YUY2 à RVB.

Rechercher Color Converter DSP Définissez la broche d'entrée sur YUY2 et définissez la broche de sortie sur RGB32. Ensuite, ajoutez l'échantillonneur d'échantillon après cela.

Comme le filtre ci-dessus est un filtre DMO, vous devrez utiliser le DirectShow DMO wrapper. Le lien a un bon exemple de l'utiliser.

+0

Merci pour la réponse! Comme je suis en train de faire mes premiers pas sur DirectShow, je ne suis pas sûr de savoir comment faire ce que vous dites. Pourriez-vous signaler un lien qui pourrait m'aider ou me fournir un extrait? Merci d'avance! –

+0

@Gianluca Colucci: Je ne sais pas comment faire quoi? – Goz

+0

J'ai réussi à le faire fonctionner avec: grpBuilder.RenderStream (PinCategory.Capture, MediaType.Video, this.capDev, null, (IBaseFilter) smpGrabber). Sans cela, le grabber n'était pas connecté, et je ne comprends pas comment ça fonctionnait quand même. Plus bas, j'ai: hr = grpBuilder.RenderStream (PinCategory.Preview, MediaType.Video, this.capDev, null, Renderer); Ça marche. Mais est-ce conceptuellement juste? –

1

Vous ne mentionnez jamais que vous connectez Sample Grabber dans le graphique, et c'est évidemment essentiel. Étant donné que le callback a été atteint à un certain moment, vous le connectez bien sûr, et tout de même lorsque vous dépannez votre pipeline de médias, la façon dont vous vous connectez et la topologie de filtre efficace sont les premières choses que vous voulez vérifier.

Le sous-type RVB à 24 bits est une sorte de "dénominateur commun" des types de média, de sorte que vous pouvez presque toujours l'obtenir sur l'échantillonneur d'échantillons.Pour ce faire, vous initialisez le format de l'échantillonneur avec le type et le sous-type principaux. Cependant, vous n'avez pas besoin de faire le type de format. Les décodeurs à RGB 24 seront fournis automatiquement. Dans l'ensemble, si quelque chose ne fonctionne pas, vous voulez connaître la topologie que vous obtenez, et Sample Grabber nécessite une initialisation correcte.

Questions connexes