首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++和DirectShow

C++和DirectShow
EN

Stack Overflow用户
提问于 2010-12-15 06:19:14
回答 4查看 1.8K关注 0票数 3

我刚刚开始使用DirectShow编程,而DirectShow应用程序接口的“C”特性让我毛骨悚然。无休止的返回代码而不是异常,到处都是addref/release,函数将指针指向指针……

对于DirectShow编程,有没有什么“C++友好”的包装器,可以把所有的COM丑陋都隐藏起来?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-16 06:36:57

对于98%的DirectShow代码,您应该永远不会看到对AddRef或Release的调用。始终使用CComPtr<>。这条规则有几个小的例外。

此外,理解锁定也很重要,就像CCritSec和CAutoLock一样;同样,我会避免手动锁定CCritSec实例,因为这是解决应用程序死锁的好方法。

此外,这段代码可能非常方便:

代码语言:javascript
复制
#include <dxerr9.h>

...

HRESULT hr = S_OK;

... something goes wrong ...

CString err(::DXGetErrorString9(hr));
err += ::DXGetErrorDescription9(hr);

最后,确保您使用的是DShow事件。所有类型的有用信息都来自DShow图的事件,令人惊讶的是有多少应用程序没有实现它(或者没有正确地实现它)。

不久前,我把使用DShow时的一些陷阱放到了I wrote this上。可悲的是,我知道这些陷阱,因为我几乎在所有这些方面都搞砸了。

票数 5
EN

Stack Overflow用户

发布于 2010-12-15 06:34:35

CComPtr是一个非常方便的工具,

除此之外,你只需要接受像HRESULTS这样的东西。我更喜欢他们而不是例外。发现使用它们要容易得多。每个人都有自己的想法。

票数 4
EN

Stack Overflow用户

发布于 2010-12-21 22:10:33

值得知道的是,DirectShow是在quartz.dll中实现的,DirectShow编辑服务是在qedit.dll中实现的。

您可以将这两个代码与Visual C++中的Compiler COM Support一起使用,以编写DirectShow客户端应用程序。

下面是一个小的play media_file示例(用cl /D_UNICODE playfile.cpp编译):

代码语言:javascript
复制
#include <iostream> 

#import <quartz.dll> rename_namespace("dshow") 
#import <qedit.dll> rename_namespace("dshow")

// Required for CLSID_FilterGraph
#include <uuids.h> 
#pragma comment(lib, "strmiids.lib")

int wmain(int argc, wchar_t* argv[]) 
{  
    using namespace dshow;
    using namespace std;

    if (argc != 2)
    {
        wcout << "Usage: play media_file" << endl;
        return 1;
    }

    struct ComInitializer
    {
        ComInitializer() 
        { 
            ::CoInitialize(0);
        }

        ~ComInitializer()
        {
            ::CoUninitialize();
        }
    } comInit;

    try 
    { 
        IGraphBuilderPtr graphBuilder; 
        graphBuilder.CreateInstance(CLSID_FilterGraph); 

        graphBuilder->RenderFile(argv[1], 0);

        IMediaControlPtr mediaControl = graphBuilder;
        mediaControl->Run();

        wcout << "Press Return to stop playback." << endl;
        wcin.get();

        mediaControl->Stop();
    } 
    catch (const _com_error& err)
    {
        wcout << L"Error code: 0x" << hex << err.Error() << endl;
    }
} 

我在构建控制台DirectShow oggenc应用程序时使用过这种方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4444874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档