1

我弄乱了 DirectShow SDK 附带的 PushSource 示例过滤器,我遇到了以下问题:

当我调用 IMediaControl::Run() 时,它返回 S_FALSE,这意味着“图形正在准备运行,但某些过滤器尚未完成向运行状态的转换”。MSDN 建议然后调用 IMediaControl::GetState() 并等待转换完成。

因此,我调用 IMediaControl::GetState(INFINITE, ...) 应该可以解决问题。

但是,相反,即使我指定了无限等待时间,它也会返回 VFW_S_STATE_INTERMEDIATE。

我已经尝试了所有三种变体(位图、位图集和桌面),它们的行为方式都相同,这最初让我相信某处存在错误。

但是,然后,我尝试使用 IFilterGraph::AddSourceFilter 做同样的事情,它做了同样的事情,这一定意味着我的渲染代码是问题所在:

CoInitialize(0);

IGraphBuilder *graph = 0;
assert(S_OK == CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&graph));

IBaseFilter *pushSource = 0;
graph->AddSourceFilter(L"sample.bmp", L"Source", &pushSource);

IPin *srcOut = 0;
assert(S_OK == GetPin(pushSource, PINDIR_OUTPUT, &srcOut));
graph->Render(srcOut);



IMediaControl *c = 0;
IMediaEvent   *pEvent;
assert(S_OK == graph->QueryInterface(IID_IMediaControl, (void**)&c));
assert(S_OK == graph->QueryInterface(IID_IMediaEvent, (void**)&pEvent));

HRESULT hr = c->Run();
if(hr != S_OK)
{
    if(hr == S_FALSE)
    {
        OAFilterState state;
        hr = c->GetState(INFINITE, &state);

        assert(hr == S_OK );
    }

}

long code;
assert(S_OK == pEvent->WaitForCompletion(INFINITE, &code));

任何人都知道如何解决这个问题?

4

2 回答 2

0
IBaseFilter *pushSource = 0;
graph->AddSourceFilter(L"sample.bmp", L"Source", &pushSource);

AddSourceFilter 添加一个默认源过滤器,我认为它不会添加您的 pushsource samplefilter。

我建议将图表添加到 ROT,以便您可以使用 graphedit 检查它。

如果你不调用 GetState() 会发生什么?

hr = pMediaControl->Run();
if(FAILED(hr)) {
    /// handle error
}

long evCode=0;
while (evCode == 0) 
{
    pEvent->WaitForCompletion(1000, &evCode);
    /// other code
}
于 2010-09-19T18:58:39.237 回答
0

打开GraphEditPlus,添加您的过滤器,渲染其引脚并按运行。然后您将分别看到每个过滤器的状态,因此您将看到哪些过滤器没有运行以及原因。

于 2010-09-20T10:11:57.090 回答