Comment inclure Qedit.h de DirectShow au projet?

Nov 19 2020

J'ai besoin d'implémenter cette interface ISampleGrabber

https://docs.microsoft.com/en-us/windows/win32/directshow/isamplegrabber

Ce fichier, pour autant que je sache, doit être dans le SDK Windows, j'ai donc téléchargé le SDK Windows à partir du programme d'installation de Visual Studio

Mais encore je reçois Cannot open source file

Qu'est-ce que je fais mal?

ÉDITER

Par le lien donné à la page ci-dessus, j'ai téléchargé un tel fichier winsdk_web.exelorsque j'essaie de l'installer, j'obtiens un tel popup

Selon ce massage contextuel, je dois installer à .NET Framework 4.0partir de ce lien

http://go.microsoft.com/fwlink/?LinkID=187668

Donc, j'ai téléchargé ce fichier, j'ai essayé de l'installer, mais j'ai reçu un autre message

Quel est le problème ici?

ÉDITER

Je suis nouveau en C ++, mais cela me semble bizarre :) comme si vous aviez une documentation où il est écrit que pour faire quelque chose, vous devez utiliser une interface spécifique, mais cette interface vous ne pouvez pas trouver presque n'importe où, mais ici vous peut télécharger sdk, mais finalement tout n'aide pas et la seule solution est d'ajouter ce code, bien :)

#pragma once

#include <dshow.h>
#include <dvdmedia.h>
#include <dmodshow.h>

class __declspec(uuid("{C1F400A4-3F08-11D3-9F0B-006008039E37}")) NullRenderer;
class __declspec(uuid("{C1F400A0-3F08-11D3-9F0B-006008039E37}")) SampleGrabber;

#pragma region SampleGrabber

struct __declspec(uuid("0579154a-2b53-4994-b0d0-e773148eff85"))
    ISampleGrabberCB : IUnknown
{
    //
    // Raw methods provided by interface
    //

    virtual HRESULT __stdcall SampleCB(
        double SampleTime,
        struct IMediaSample * pSample) = 0;
    virtual HRESULT __stdcall BufferCB(
        double SampleTime,
        unsigned char * pBuffer,
        long BufferLen) = 0;
};

struct __declspec(uuid("6b652fff-11fe-4fce-92ad-0266b5d7c78f"))
    ISampleGrabber : IUnknown
{
    //
    // Raw methods provided by interface
    //

    virtual HRESULT __stdcall SetOneShot(
        long OneShot) = 0;
    virtual HRESULT __stdcall SetMediaType(
        struct _AMMediaType * pType) = 0;
    virtual HRESULT __stdcall GetConnectedMediaType(
        struct _AMMediaType * pType) = 0;
    virtual HRESULT __stdcall SetBufferSamples(
        long BufferThem) = 0;
    virtual HRESULT __stdcall GetCurrentBuffer(
        /*[in,out]*/ long * pBufferSize,
        /*[out]*/ long * pBuffer) = 0;
    virtual HRESULT __stdcall GetCurrentSample(
        /*[out,retval]*/ struct IMediaSample * * ppSample) = 0;
    virtual HRESULT __stdcall SetCallback(
        struct ISampleGrabberCB * pCallback,
        long WhichMethodToCallback) = 0;
};

struct __declspec(uuid("c1f400a0-3f08-11d3-9f0b-006008039e37"))
    SampleGrabber;
// [ default ] interface ISampleGrabber

#pragma endregion

class TV_AudioDecoder : public ISampleGrabber
{
public:
    TV_AudioDecoder();
    ~TV_AudioDecoder();

public:
    virtual HRESULT __stdcall SetOneShot(long OneShot) override;
    virtual HRESULT __stdcall SetMediaType(struct _AMMediaType * pType) override;
    virtual HRESULT __stdcall GetConnectedMediaType(struct _AMMediaType * pType) override;
    virtual HRESULT __stdcall SetBufferSamples(long BufferThem) override;
    virtual HRESULT __stdcall GetCurrentBuffer(/*[in,out]*/ long * pBufferSize, /*[out]*/ long * pBuffer) override;
    virtual HRESULT __stdcall GetCurrentSample(/*[out,retval]*/ struct IMediaSample * * ppSample) override;
    virtual HRESULT __stdcall SetCallback(struct ISampleGrabberCB * pCallback, long WhichMethodToCallback) override;
};

Disons que c'est mon code, est-ce une bonne façon de l'utiliser? Je n'ai rien manqué?

Réponses

2 RomanR. Nov 19 2020 at 22:41

Qedit.h a été exclu du SDK Windows à un moment donné dans le passé avec la dépréciation des services d'édition DirectShow. Depuis lors, le runtime est présent dans toutes les versions de Windows.

Vous n'avez rien à installer et, vice versa, l'installation de l'ancien SDK ne vous facilitera pas la vie.

Copiez / collez simplement les en-têtes nécessaires dans votre projet et vous êtes prêt à partir.

Les choses à copier / coller sont mentionnées, par exemple, dans cette rubrique 2009 . Vous pouvez y trouver ma réponse #importet cela devrait fonctionner aussi. À partir de maintenant, en 2020, je recommanderais toujours de copier / coller les en-têtes manquants.

UPD.

// <your regular includes>

#include <dshow.h>
#include <dvdmedia.h>
#include <dmodshow.h>

class __declspec(uuid("{C1F400A4-3F08-11D3-9F0B-006008039E37}")) NullRenderer;
class __declspec(uuid("{C1F400A0-3F08-11D3-9F0B-006008039E37}")) SampleGrabber;

#pragma region SampleGrabber

struct __declspec(uuid("0579154a-2b53-4994-b0d0-e773148eff85"))
ISampleGrabberCB : IUnknown
{
    //
    // Raw methods provided by interface
    //

      virtual HRESULT __stdcall SampleCB (
        double SampleTime,
        struct IMediaSample * pSample ) = 0;
      virtual HRESULT __stdcall BufferCB (
        double SampleTime,
        unsigned char * pBuffer,
        long BufferLen ) = 0;
};

struct __declspec(uuid("6b652fff-11fe-4fce-92ad-0266b5d7c78f"))
ISampleGrabber : IUnknown
{
    //
    // Raw methods provided by interface
    //

      virtual HRESULT __stdcall SetOneShot (
        long OneShot ) = 0;
      virtual HRESULT __stdcall SetMediaType (
        struct _AMMediaType * pType ) = 0;
      virtual HRESULT __stdcall GetConnectedMediaType (
        struct _AMMediaType * pType ) = 0;
      virtual HRESULT __stdcall SetBufferSamples (
        long BufferThem ) = 0;
      virtual HRESULT __stdcall GetCurrentBuffer (
        /*[in,out]*/ long * pBufferSize,
        /*[out]*/ long * pBuffer ) = 0;
      virtual HRESULT __stdcall GetCurrentSample (
        /*[out,retval]*/ struct IMediaSample * * ppSample ) = 0;
      virtual HRESULT __stdcall SetCallback (
        struct ISampleGrabberCB * pCallback,
        long WhichMethodToCallback ) = 0;
};

struct __declspec(uuid("c1f400a0-3f08-11d3-9f0b-006008039e37"))
SampleGrabber;
    // [ default ] interface ISampleGrabber

#pragma endregion

// <your code>

Voir également:

  • Comment utiliser samplegrabber dans vc ++? Le samplegrabber n'est pas défini
  • Identifiant non déclaré ISampleGrabber

Je suis nouveau en C ++, mais ça me semble bizarre :) [...]

Il ne s'agit pas exactement de C ++. Il s'agit de savoir comment utiliser la partie OS abandonnée dans votre projet C ++ en réintroduisant sa déclaration supprimée du SDK standard. Oui, en C ++, nous pouvons le faire, ainsi que d'autres astuces sympas.