gpt4 book ai didi

c++ - 如何将 Qedit.h 从 DirectShow 包含到项目中?

转载 作者:行者123 更新时间:2023-12-03 07:14:57 29 4
gpt4 key购买 nike

我需要实现这个接口(interface)ISampleGrabber https://docs.microsoft.com/en-us/windows/win32/directshow/isamplegrabber
据我了解,这个文件应该在 Windows SDK 中,所以我从 Visual Studio 安装程序下载了 Windows SDK
enter image description here
但我仍然得到 Cannot open source file enter image description here
我究竟做错了什么?
编辑
通过上面页面上给出的链接,我下载了这样的文件 winsdk_web.exe当我尝试安装它时,我得到了这样的弹出窗口
enter image description here
根据这个弹出按摩我需要安装.NET Framework 4.0从这个链接
http://go.microsoft.com/fwlink/?LinkID=187668
所以,我下载了这个文件试图安装它,但收到另一条消息
enter image description here
这里有什么问题?
编辑
我是 C++ 新手,但对我来说看起来很奇怪:) 就像你有一个文档,其中写着为了做一些你需要使用特定接口(interface)的事情,但是这个接口(interface)你几乎在任何地方都找不到,但是在这里你可以下载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;
};
假设这是我的代码,它是正确的使用方法吗?我没有错过什么吗?

最佳答案

Qedit.h 在过去的某个时间点被排除在 Windows SDK 之外,并弃用了 DirectShow 编辑服务。从那时起,所有版本的 Windows 中仍然存在运行时。
您不需要安装任何东西,反之亦然,安装古老的 SDK 不会让您的生活变得更轻松。
只需将必要的标题复制/粘贴到您的项目中,您就可以开始了。
例如,this 2009 topic 中提到了要复制/粘贴的内容。 .你可以在这里找到我的答案 #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>
也可以看看:
  • How do i use samplegrabber in vc++ ? The samplegrabber is not defined
  • ISampleGrabber undeclared identifier

  • I am new in C++, but it looks weird for me:) [...]


    它不完全是关于 C++ 的。它是关于如何通过重新引入从标准 SDK 中删除的声明来在 C++ 项目中使用废弃的操作系统部分。是的,在 C++ 中我们可以做到这一点,以及其他很酷的技巧。

    关于c++ - 如何将 Qedit.h 从 DirectShow 包含到项目中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64912751/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com