DirectShow 多媒体编程中的难题
柯本 2002-08-28 02:00:11
1. 请看以下程序:
IGraphBuilder* m_IGraphBuilder;
HRESULT hr;
CAUUID cauuid;
IBaseFilter *pcb;
ISpecifyPropertyPages *pSpec;
hr = CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC,
IID_IGraphBuilder, (void **) &m_IGraphBuilder);
if (FAILED(hr))
ShowMessage(TEXT("建m_IGraphBuilder失败"));
if(!AddFilter2(CLSID_VideoRenderer, "Video Renderer")) //我自编的
{
ShowMessage("Add Video Renderer Error!");
return false;
}
m_IGraphBuilder->FindFilterByName(L"Video Renderer",&pcb);
hr = pcb->QueryInterface(IID_ISpecifyPropertyPages, (void **)&pSpec);
if (hr == S_OK) {
hr = pSpec->GetPages(&cauuid);
hr = OleCreatePropertyFrame(NULL, 30, 30, NULL, 1, (IUnknown **)&pcb, cauuid.cElems,
(GUID *)cauuid.pElems, 0, 0, NULL);
CoTaskMemFree(cauuid.pElems);
pSpec->Release();
}
pcb->Release();
...
它每次都要用一DIALOG, 能否不用OleCreatePropertyFrame直接改Filter的属性
2. 我有一StreamMachine 2210 PCI Capture卡, 我想单帧捕捉,我用的是以下程序
IBasicVideo2 * ba = NULL;
HRESULT hr;
long z;
long *image=NULL;
hr = m_IGraphBuilder->QueryInterface(IID_IBasicVideo2, (LPVOID *) &ba);
if (FAILED(hr))
return hr;
hr=ba->GetCurrentImage(&z,image);
char* buffer = new char[z];
Paush(); //暂停
hr = ba->GetCurrentImage(&z,(long*)buffer);
Pause(); //继续
if(SUCCEEDED(hr))
WriteDIB("aaa.bmp",buffer,z);
else
ShowMessage("Error!");
delete buffer;
ba->Release();
但这段程序用于预览时总是Error回放时没问题,Why???
有无其它单帧捕捉的办法?(我的卡不支持AVI捕捉,只支持MPEG1,MPEG2,随卡的应用程序
MPEG PLAY 支持单帧捕捉)
Filter 的连接如下:
preview:
"StreamMachine 2210 PCI Capture"->"Color Space Converter"->"Video Renderer"
Decode:
"File Source (Async.)"->"Ligos MPEG Splitter"->"Ligos MPEG Video Decoder"-> "Color Space Converter"->"Video Renderer"