Jak dołączyć Qedit.h z DirectShow do projektu?

Nov 19 2020

Muszę zaimplementować ten interfejs ISampleGrabber

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

Ten plik, o ile rozumiem, powinien znajdować się w Windows SDK, więc pobrałem Windows SDK z instalatora Visual Studio

Ale nadal rozumiem Cannot open source file

Co ja robię źle?

EDYTOWAĆ

Poprzez link podany na stronie powyżej ściągnąłem taki plik winsdk_web.exeprzy próbie instalacji wyskakuje mi taki popup

Zgodnie z tym wyskakującym komunikatem muszę zainstalować .NET Framework 4.0z tego linku

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

Więc pobrałem ten plik, próbowałem go zainstalować, ale dostałem inną wiadomość

Jaki jest tutaj problem?

EDYTOWAĆ

Jestem nowy w C ++, ale wygląda to dla mnie dziwnie :) jakbyś miał dokumentację, w której jest napisane, że aby coś zrobić, musisz użyć określonego interfejsu, ale tego interfejsu nie znajdziesz prawie nigdzie, ale tutaj można pobrać sdk, ale ostatecznie to wszystko nie pomaga i jedynym rozwiązaniem jest dodanie tego kodu, fajnie :)

#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;
};

Powiedzmy, że to mój kod, czy to właściwy sposób korzystania z niego? Nie przegapiłem niczego?

Odpowiedzi

2 RomanR. Nov 19 2020 at 22:41

Qedit.h został w pewnym momencie wykluczony z zestawu Windows SDK w wyniku wycofania usług DirectShow Editing Services. Od tego czasu środowisko uruchomieniowe nadal jest obecne we wszystkich wersjach systemu Windows.

Nie musisz niczego instalować i odwrotnie, instalacja starożytnego SDK nie ułatwi Ci życia.

Po prostu skopiuj / wklej niezbędne nagłówki do swojego projektu i gotowe.

Rzeczy do skopiowania / wklejenia są omówione na przykład w tym temacie na rok 2009 . Znajdziesz tam moją odpowiedź z #importi to też powinno działać. Od teraz w 2020 roku nadal zalecałbym kopiowanie / wklejanie brakujących nagłówków.

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>

Zobacz też:

  • Jak używać samplegrabber w vc ++? Samplegrabber nie jest zdefiniowany
  • Niezadeklarowany identyfikator ISampleGrabber

Jestem nowy w C ++, ale wygląda to dziwnie dla mnie :) [...]

Nie chodzi dokładnie o C ++. Chodzi o to, jak używać porzuconej części systemu operacyjnego w projekcie C ++ poprzez ponowne wprowadzenie deklaracji usuniętej ze standardowego zestawu SDK. Tak, w C ++ możemy to zrobić, a także inne fajne sztuczki.