Wie kann ich Qedit.h von DirectShow in das Projekt einbinden?
Ich muss diese Schnittstelle implementieren ISampleGrabber
https://docs.microsoft.com/en-us/windows/win32/directshow/isamplegrabber
Soweit ich weiß, sollte sich diese Datei im Windows SDK befinden, daher habe ich das Windows SDK vom Visual Studio-Installationsprogramm heruntergeladen

Aber ich verstehe immer noch Cannot open source file

Was mache ich falsch?
BEARBEITEN
Über den auf der obigen Seite angegebenen Link habe ich eine solche Datei heruntergeladen, winsdk_web.exe
wenn ich versuche, sie zu installieren. Ich erhalte ein solches Popup

Nach dieser Popup-Massage muss ich über .NET Framework 4.0
diesen Link installieren
http://go.microsoft.com/fwlink/?LinkID=187668
Also habe ich diese Datei heruntergeladen und versucht, sie zu installieren, aber eine andere Meldung erhalten

Was ist hier ein Problem?
BEARBEITEN
Ich bin neu in C ++, aber es sieht komisch für mich aus :) Als ob Sie eine Dokumentation haben, in der geschrieben steht, dass Sie eine bestimmte Schnittstelle verwenden müssen, um etwas zu tun, aber diese Schnittstelle können Sie fast nirgendwo finden, aber hier sind Sie kann sdk herunterladen, aber irgendwann hilft alles nicht mehr und die einzige Lösung besteht darin, diesen Code hinzuzufügen, schön :)
#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;
};
Nehmen wir an, dies ist mein Code. Ist es ein richtiger Weg, ihn zu verwenden? Ich habe nichts verpasst?
Antworten
Qedit.h wurde zu einem früheren Zeitpunkt aus dem Windows SDK ausgeschlossen, da DirectShow Editing Services nicht mehr verwendet wurden. Die Laufzeit ist seitdem in allen Windows-Versionen vorhanden.
Sie müssen nichts installieren und umgekehrt wird die Installation des alten SDK Ihr Leben nicht einfacher machen.
Kopieren Sie einfach die erforderlichen Header in Ihr Projekt und Sie können loslegen.
Dinge, die kopiert / eingefügt werden müssen, werden beispielsweise in diesem Thema von 2009 erwähnt . Sie können meine Antwort dort mit finden #import
und es sollte auch funktionieren. Ab 2020 würde ich weiterhin empfehlen, fehlende Header zu kopieren / einzufügen.
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>
Siehe auch:
- Wie verwende ich samplegrabber in vc ++? Der Samplegrabber ist nicht definiert
- Nicht deklarierter ISampleGrabber-Bezeichner
Ich bin neu in C ++, aber es sieht komisch für mich aus :) [...]
Es geht nicht gerade um C ++. Es geht darum, wie Sie einen verlassenen Betriebssystemteil in Ihrem C ++ - Projekt verwenden, indem Sie die aus dem Standard-SDK entfernte Deklaration wieder einführen. Ja, in C ++ können wir das ebenso wie andere coole Tricks.