3

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

4

1 に答える 1

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が必要です

于 2012-01-19T12:01:34.660 に答える