首页 文章

DirectShow的PushSource过滤器导致IMediaControl :: Run返回S_FALSE

提问于
浏览
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));

谁知道如何解决这个问题?

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
    }
    
  • 0

    打开GraphEditPlus,添加过滤器,渲染其针脚并按“运行” . 然后你'll see states of each filter separately, so you' ll看看没有运行什么过滤器以及为什么 .

相关问题