0

実際には、2 回目に呼び出されたときにのみ失敗します。ウィンドウレス コントロールを使用してビデオ コンテンツを再生しています。コントロールがまだ画面上にある間に、再生中のビデオが変更される可能性があります。グラフが初めて作成されたら、再生を停止し、SOURCEフィルターを置き換えて、グラフを再度実行することでメディアを切り替えます。これは Vista では問題なく動作しますが、XP で実行している場合、2 回目の呼び出しで がRun()返されますE_UNEXPECTED

初期化は次のようになります。

// Get the interface for DirectShow's GraphBuilder
mGB.CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER);

// Create the Video Mixing Renderer and add it to the graph
ATL::CComPtr<IBaseFilter> pVmr;
pVmr.CoCreateInstance(CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC);
mGB->AddFilter(pVmr, L"Video Mixing Renderer 9");

// Set the rendering mode and number of streams
ATL::CComPtr<IVMRFilterConfig9> pConfig;
pVmr->QueryInterface(IID_IVMRFilterConfig9, (void**)&pConfig);
pConfig->SetRenderingMode(VMR9Mode_Windowless);
pVmr->QueryInterface(IID_IVMRWindowlessControl9, (void**)&mWC);

そして、映画を再生することを決定したときに行うことは次のとおりです。はDirectShow サンプル エリアRenderFileToVideoRendererから借用しています。dshowutil.h

// Release the source filter, if it exists, so we can replace it.
IBaseFilter *pSource = NULL;
if (SUCCEEDED(mpGB->FindFilterByName(L"SOURCE", &pSource)) && pSource)
{
    mpGB->RemoveFilter(pSource);
    pSource->Release();
    pSource = NULL;
}

// Render the file.
hr = RenderFileToVideoRenderer(mpGB, mPlayPath.c_str(), FALSE);

// QueryInterface for DirectShow interfaces
hr = mpGB->QueryInterface(&mMC);
hr = mpGB->QueryInterface(&mME);
hr = mpGB->QueryInterface(&mMS);

// Read the default video size
hr = mpWC->GetNativeVideoSize(&lWidth, &lHeight, NULL, NULL);
if (hr != E_NOINTERFACE)
{
    if (FAILED(hr))
    {
        return hr;
    }

    // Play video at native resolution, anchored at top-left corner.
    RECT r;
    r.left = 0;
    r.top = 0;
    r.right = lWidth;
    r.bottom = lHeight;
    hr = mpWC->SetVideoPosition(NULL, &r);
}

// Run the graph to play the media file
if (mMC)
{
    hr = mMC->Run();
    if (FAILED(hr))
    {
        // We get here the second time this code is executed.
        return hr;
    }
    mState = Running;
}

if (mME)
{
    mME->SetNotifyWindow((OAHWND)m_hWnd, WM_GRAPHNOTIFY, 0);
}

ここで何が起こっているか知っている人はいますか?

4

2 に答える 2

0

これについて解決策を得たことはありません。プロダクション ソリューションは、グラフ全体を呼び出しIGraphBuilder::Releaseてゼロから再構築することでした。ビデオを切り替えると、CPU のスパイクとわずかな再描画の遅延がありますが、恐れていたほど顕著ではありません.

于 2009-05-28T17:46:21.617 に答える