DirectShow의 Qedit.h를 프로젝트에 포함하는 방법은 무엇입니까?

Nov 19 2020

이 인터페이스를 구현해야합니다. ISampleGrabber

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

내가 이해하는 한이 파일은 Windows SDK에 있어야하므로 Visual Studio 설치 관리자에서 Windows SDK를 다운로드했습니다.

하지만 여전히 나는 Cannot open source file

내가 도대체 ​​뭘 잘못하고있는 겁니까?

편집하다

위 페이지에 제공된 링크 winsdk_web.exe를 통해 설치하려고 할 때 이러한 파일을 다운로드 했습니다.

이 팝업 마사지에 따르면 .NET Framework 4.0이 링크에서 설치해야합니다.

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

그래서이 파일을 다운로드하여 설치를 시도했지만 다른 메시지가 표시되었습니다.

여기서 문제는 무엇입니까?

편집하다

저는 C ++에 익숙하지 않지만 저에게는 이상해 보입니다.) 특정 인터페이스를 사용하기 위해 필요한 작업을 수행하기 위해 작성된 문서가 있지만이 인터페이스는 거의 모든 곳에서 찾을 수 없지만 여기에서는 sdk를 다운로드 할 수 있지만 결국에는 모두 도움이되지 않으며 유일한 해결책은이 코드를 추가하는 것입니다.

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

이것이 내 코드라고 가정 해 봅시다. 올바른 사용 방법입니까? 나는 아무것도 놓치지 않았다?

답변

2 RomanR. Nov 19 2020 at 22:41

Qedit.h는 과거에 DirectShow 편집 서비스가 중단되면서 Windows SDK에서 제외되었습니다. 그 이후로 모든 버전의 Windows에는 여전히 런타임이 있습니다.

아무것도 설치할 필요가 없으며, 반대로 고대 SDK를 설치해도 삶이 더 쉬워지지는 않습니다.

필요한 헤더를 프로젝트에 복사 / 붙여 넣기 만하면됩니다.

복사 / 붙여 넣기 할 항목 은 예를 들어이 2009 항목 에서 언급됩니다 . 거기에서 내 대답을 찾을 수 있으며 #import작동해야합니다. 2020 년 현재까지 누락 된 헤더를 복사 / 붙여 넣기하는 것이 좋습니다.

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>

또한보십시오:

  • vc ++에서 samplegrabber를 어떻게 사용합니까? samplegrabber가 정의되지 않았습니다.
  • ISampleGrabber 선언되지 않은 식별자

나는 C ++에서 새롭지 만 나에게는 이상해 보인다 :) [...]

정확히 C ++에 관한 것이 아닙니다. 표준 SDK에서 제거 된 선언을 다시 도입하여 C ++ 프로젝트에서 버려진 OS 부분을 사용하는 방법에 관한 것입니다. 예, C ++에서 우리는 다른 멋진 트릭뿐만 아니라 그것을 할 수 있습니다.