包括DirectShow库到Qt的视频缩略图

时间:2010-08-26 05:37:58

标签: windows qt directshow thumbnails

我正在尝试在Qt上实现http://msdn.microsoft.com/en-us/library/dd377634%28v=VS.85%29.aspx,以生成视频文件的海报框/缩略图。

我已经安装了Windows Vista和Windows 7 SDK。我说:

#include "qedit.h"

在我的代码中(注意在C:\ Qt \ 2010.04 \ mingw \ include中也有一个),我补充说:

win32:INCLUDEPATH += $$quote(C:/WindowsSDK/v6.0/Include)

到我的* .pro文件。我编译并得到“错误:sal.h:没有这样的文件或目录”。在VC ++中找到这个我添加

win32:INCLUDEPATH += $$quote(C:/Program Files/Microsoft Visual Studio 10.0/VC/include)

现在有1400个编译错误。所以,我放弃了,只需添加:

win32:LIBS + = C:/WindowsSDK/v7.1/Lib/strmiids.lib

到我的* .pro文件并尝试运行(不包括任何标题):

IMediaDet mediadet;

但后来我得到“错误:IMediaDet:没有这样的文件或目录”。

#include "qedit.h"

给了我同样的错误(看起来它指的是Qt版本)和

#include "C:/WindowsSDK/v6.0/Include/qedit.h" 

回到生成1000的编译错误。

叹息,应该是10行代码的麻烦......

感谢您的意见和帮助

3 个答案:

答案 0 :(得分:1)

既然你说你是“C ++ / Qt新手”,那么我怀疑真正的问题可能是你试图自己加载库而不是简单地将你的应用程序链接到它?

要使用Qt将外部库链接到您的应用程序,您需要做的就是修改相应的.pro文件。例如,如果库名为libfoo.dll,则只需添加

LIBS += -L/path/to/lib -lfoo

您可以在the relevant section of the qmake manual中找到有关此内容的更多信息。请注意,qmake通常使用类似Unix的表示法,并在Windows上透明地执行正确的操作。

完成此操作后,您可以包含库的标题并使用它提供的任何类和函数。请注意,您还可以修改项目文件以附加包含路径以帮助选择标题,例如

INCLUDEPATH += /path/to/headers

再次提供the relevant section of the qmake manual中的更多信息。

请注意,这两个项目变量都可以使用相对路径,并且很乐意使用..来表示所有平台上的“上一个目录”。

答案 1 :(得分:1)

请注意,qedit.h需要dxtrans.h,它是DirectX9 SDK的一部分。

您可以在August 2006的DirectX SDK中找到dxtrans.h。请注意,dxtrans.h已从较新的DirectX SDK中删除。

答案 2 :(得分:0)

您是否可以访问外部库的来源?以下假设您这样做。

当我需要从仅从函数解析的库中提取类时,我要做的是在库中使用工厂函数。

// Library.h
class SomeClass {
public:
  SomeClass(std::string name);
  // ... class declaration goes here
};

在cpp文件中,当我的构造函数需要C ++参数(例如std :: string等类型)时,我在extern“C”之外使用代理函数,我将其作为指针传递,以防止编译器弄乱C和C ++之间的签名。如果构造函数不需要参数,则可以避免额外的步骤,并直接从导出的函数调用新的SomeClass()。

// Library.cpp
#include "Library.h"
SomeClass::SomeClass(std::string name)
{
// implementation details
}

// Proxy function to handle C++ types
SomeClass *ImplCreateClass(std::string* name) { return new SomeClass(*name); }

extern "C"
{
  // Notice the pass-by-pointer for C++ types
  SomeClass *CreateClass(std::string* name) { return ImplCreateClass(name); }
}

然后,在使用该库的应用程序中:

// Application.cpp
#include "Library.h"
typedef SomeClass* (*FactoryFunction)(std::string*);

// ...

QLibrary library(QString("MyLibrary"));
FactoryFunction factory = reinterpret_cast(library.resolve("CreateClass"));

std::string name("foobar");
SomeClass *myInstance = factory(&name);

您现在拥有在库中声明的类的实例。