Jak dołączyć Qedit.h z DirectShow do projektu?
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.exe
przy próbie instalacji wyskakuje mi taki popup

Zgodnie z tym wyskakującym komunikatem muszę zainstalować .NET Framework 4.0
z 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
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 #import
i 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.