2012-01-08 7 views
3

DirectShow DSPACKコンポーネントスイートを使用するDelphi 6アプリケーションがあります。これには、フィルタグラフから画像をレンダリングするTVideoWindowコンポーネントがあります。 TVideoWindowコンポーネントは、ページコンポーネントのタブにあります。フィルタグラフを実行しているときにタブが表示されていれば、ビデオはうまく表示されます。また、私は別のタブに切り替えることができ、戻ってくると、ビデオはまだ素晴らしいです。ただし、タブが表示されていないときにフィルタグラフを実行すると、そのタブに切り替えるとビデオウィンドウ領域が黒くなります。私は別のタブに戻って、ホストフォームを最小化して元に戻そうとしましたが、それは黒のままです。私はこれがウィンドウ/コンポーネントのライフサイクルの問題を処理するのかどうか疑問に思っていますか?これをどうすれば解決できますか?ホストタブが表示されていないときにグラフが表示された場合、DirectShowレンダリングウィンドウが黒く表示される(TVideoWindow)

+0

が必要です。残念ながら固定しません – Simon

+0

ホスティングウィンドウが表示されるまで、開始(実際にはVMR/EVR初期化)を延期するのはどうですか? @RomanR。 –

+0

- それを行うコードを追加しました。多少は機能しますが、防弾ではありません。この記事の情報を使用して、ウィンドウが表示されているかどうかを判断しました:http://stackoverflow.com/questions/646527/how-can-i-tell-if-a-delphi-control-is-currently-visibleそれは助けますが、私はまだ時には "黒い窓"を得ることがあります。私はまだコードを微調整しています。 –

答えて

2

この問題は、後で表示される隠しパネルにEVRを設定するなど、COMオブジェクトを直接使用する場合には発生しません。私は、TVideoWindowを取り除き、VMR9やEVRなどのレンダリングを直接使う方が時間がかかることを提案しています。あなたは、これを行うにはDSPackを取り除くために

FDisplayControl: IMFVideoDisplayControl; 
    FEVR: IBaseFilter; 
    R: TNormalizedRect; 
    R: TRect; 

    hr := Succeeded(CoCreateInstance(CLSID_EnhancedVideoRenderer, nil, CLSCTX_INPROC, IID_IBaseFilter, FEVR)); 
    if (hr <> S_OK) then 
    begin 
    showmessage(GetErrorString(hr) + ' (Could not create the enhanced video renderer : ' + inttohex(hr,8) + ')'); 
    Exit; 
    end; 
    (FilterGraph as IFilterGraph2).AddFilter().AddFilter(FEVR, PWideChar(WideString('EVR'))); 
    (FEVR as IMFGetService).GetService(MR_VIDEO_RENDER_SERVICE, IID_IMFVideoDisplayControl, FDisplayControl); 
    FDisplayControl.SetVideoWindow(Panel.Handle); 
    NR.Left := 0; 
    NR.Top := 0; 
    NR.Right := 1; 
    NR.Bottom := 1; 
    R := ClientRect; 
    FDisplayControl.SetVideoPosition(@nr, @r); 
    FDisplayControl.SetAspectRatioMode(MFVideoARMode_None); 

ノートの線に沿って何かを持っていない:上記の私もこの問題を抱えているEVR.pas

+0

私はそのテクニックを試して、後で結果を投稿します、ありがとう。 –