2

I would like to render video in ActiveX control (not in pop-up DirectShow window). I have:

IID_IVMRWindowlessControl
IID_IVMRFilterConfig9
CLSID_VideoMixingRenderer9

I would like to set WindowLess mode, but I don't know how to get HWND of..., exactly, of what? IEFrame, HTML element?

hr = pWc->SetVideoClippingWindow(???); 

Anyone with some hint?

Regards.

4

2 に答える 2

1

まず、これを ActiveX コントロールのコンストラクターに追加します。

// this seemingly innocent line is _extremely_ important.
// This causes the window for the control to be created
// otherwise, you won't get an hWnd to render to!
m_bWindowOnly = true;

ActiveX コントロールには、レンダー ターゲットとして使用できる m_hWnd というメンバー変数があります。m_bWindowOnly 変数を true に設定しないと、ActiveX コントロールは独自のウィンドウを作成しません。

最後に、レンダラー (VMR9 など) を選択します。

CRect rcClient;
CComPtr<IBaseFilter>            spRenderer;
CComPtr<IVMRWindowlessControl9> spWindowless;

// Get the client window size
::GetClientRect(m_hWnd, rcClient);

// Get the renderer filter
spRenderer.Attach( m_pGraph->GetVideoRenderer() );
if( ! spRenderer )
    return E_POINTER;

spWindowless = spRenderer;
if( spWindowless )              
{
    spWindowless->SetVideoClippingWindow( m_hWnd );
    spWindowless->SetVideoPosition(NULL, rcClient);
    spWindowless.Release();
}

spRenderer.Detach();

私のグラフ オブジェクトはカスタム オブジェクトであり、GetVideoRenderer() は私自身の関数の 1 つであることに注意してください。これは IBaseFilter* を返します。

これを見つけるのに何年もかかりました。ATL は優れたテクノロジであるため、文書化されていないことは残念です。とにかく、これが役に立てば幸いです!

于 2010-10-12T23:02:26.133 に答える
0

freefallr の情報は非常に役に立ちますが、あなたの質問に完全に答えているとは思いません。ウィンドウのない ActiveX コントロールの秘訣は、ウィンドウが表示されないことです。描画すると、基本的にはデバイス コンテキストを取得するだけで、ブラウザーからの呼び出しに応答して、指示された場合にのみ描画する必要があります。

必要なインターフェイスは次のとおりです: http://msdn.microsoft.com/en-us/library/ms682300%28v=VS.85%29.aspx

詳細はこちら: http://msdn.microsoft.com/en-us/library/aa751970%28VS.85%29.aspx#OC96_and_Windowless_

しばらくの間、FireBreath (http://firebreath.org) でこれに対するサポートを追加するつもりでした。すべての npapi ブラウザーでサポートされていますが、IE は (まだ) サポートしていないようです。詳細を見つけたら、ここに要約を投稿してください =]

于 2010-11-06T03:57:17.117 に答える