Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Com DirectShow&x27;s PushSource筛选器导致IMediaControl::Run返回s_FALSE_Com_Directshow_Multimedia - Fatal编程技术网

Com DirectShow&x27;s PushSource筛选器导致IMediaControl::Run返回s_FALSE

Com DirectShow&x27;s PushSource筛选器导致IMediaControl::Run返回s_FALSE,com,directshow,multimedia,Com,Directshow,Multimedia,我正在处理DirectShowSDK附带的PushSource示例过滤器,我遇到了以下问题: 当我调用IMediaControl::Run()时,它返回S_FALSE,这意味着“图形正在准备运行,但某些筛选器尚未完成到运行状态的转换”。MSDN建议调用IMediaControl::GetState()并等待转换完成 因此,我调用IMediaControl::GetState(无限,…),它应该可以解决这个问题 然而,与此相反,它返回VFW_S_STATE_INTERMEDIATE,即使我指定了无

我正在处理DirectShowSDK附带的PushSource示例过滤器,我遇到了以下问题:

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

因此,我调用IMediaControl::GetState(无限,…),它应该可以解决这个问题

然而,与此相反,它返回VFW_S_STATE_INTERMEDIATE,即使我指定了无限的等待时间

我尝试了所有三种变体(位图、位图集和桌面),它们的行为方式都是一样的,这让我开始相信其中有一个bug

但是,随后我尝试使用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));
有人知道怎么解决这个问题吗

IBaseFilter *pushSource = 0;
graph->AddSourceFilter(L"sample.bmp", L"Source", &pushSource);
AddSourceFilter添加了一个默认的源过滤器,我认为它不会添加pushsource samplefilter

我建议将该图添加到ROT中,这样您就可以使用graphedit对其进行检查

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

打开,添加过滤器,渲染其pin,然后按Run。然后,您将分别看到每个筛选器的状态,这样您将看到哪些筛选器未运行以及原因

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

long evCode=0;
while (evCode == 0) 
{
    pEvent->WaitForCompletion(1000, &evCode);
    /// other code
}