1

DirectShow SDK に同梱されている PushSource サンプル フィルターをいじっていて、次の問題が発生しています。

IMediaControl::Run() を呼び出すと、S_FALSE が返されます。これは、「グラフは実行の準備をしていますが、一部のフィルターは実行状態への移行を完了していません」という意味です。MSDN では、IMediaControl::GetState() を呼び出して、遷移が完了するまで待機することを提案しています。

そこで、問題を解決するはずの IMediaControl::GetState(INFINITE, ...) を呼び出します。

しかし逆に待ち時間を無限に指定したのにVFW_S_STATE_INTERMEDIATEを返します。

3 つのバリエーション (ビットマップ、ビットマップ セット、デスクトップ) をすべて試してみましたが、すべて同じように動作するため、最初はどこかにバグがあると思いました。

ただし、その後、 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

GraphEditPlusを開き、フィルターを追加し、そのピンをレンダリングして、[実行]を押します次に、各フィルターの状態が個別に表示されるため、実行されなかったフィルターとその理由が表示されます。

于 2010-09-20T10:11:57.090 に答える
0
IBaseFilter *pushSource = 0;
graph->AddSourceFilter(L"sample.bmp", L"Source", &pushSource);

AddSourceFilter はデフォルトのソース フィルターを追加します。プッシュソースのサンプル フィルターが追加されるとは思いません。

グラフを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 に答える