我刚刚开始使用DirectShow编程,而DirectShow应用程序接口的“C”特性让我毛骨悚然。无休止的返回代码而不是异常,到处都是addref/release,函数将指针指向指针……
对于DirectShow编程,有没有什么“C++友好”的包装器,可以把所有的COM丑陋都隐藏起来?
发布于 2010-12-16 06:36:57
对于98%的DirectShow代码,您应该永远不会看到对AddRef或Release的调用。始终使用CComPtr<>。这条规则有几个小的例外。
此外,理解锁定也很重要,就像CCritSec和CAutoLock一样;同样,我会避免手动锁定CCritSec实例,因为这是解决应用程序死锁的好方法。
此外,这段代码可能非常方便:
#include <dxerr9.h>
...
HRESULT hr = S_OK;
... something goes wrong ...
CString err(::DXGetErrorString9(hr));
err += ::DXGetErrorDescription9(hr);最后,确保您使用的是DShow事件。所有类型的有用信息都来自DShow图的事件,令人惊讶的是有多少应用程序没有实现它(或者没有正确地实现它)。
不久前,我把使用DShow时的一些陷阱放到了I wrote this上。可悲的是,我知道这些陷阱,因为我几乎在所有这些方面都搞砸了。
发布于 2010-12-15 06:34:35
CComPtr是一个非常方便的工具,
除此之外,你只需要接受像HRESULTS这样的东西。我更喜欢他们而不是例外。发现使用它们要容易得多。每个人都有自己的想法。
发布于 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编译):
#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应用程序时使用过这种方法。
https://stackoverflow.com/questions/4444874
复制相似问题