播放视频文件时弹出DirectShow视频窗口

时间:2010-11-02 22:49:00

标签: video rendering directshow

我已经构建了一个在本机Windows应用程序(MFC C ++)中运行的C#COM类。 COM类用于在主应用程序的窗口句柄上显示视频。我正在使用.NET interop在我的C#应用​​程序中访问DirectShow。渲染图形后,我看到ActiveMovie窗口在正确放置在窗口中之前会弹出。

以下是我如何设置图表的示例。我没有包含所有代码,但我认为重要的部分包括 - 渲染图形并设置窗口所有者和位置。

        _graphBuilder = (IGraphBuilder)new FilgraphManager();

        _sourceFilter = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID.AsyncReader));
        hr = ((IFileSourceFilter)_sourceFilter).Load(fileName, null);
        DSUtilities.ThrowExceptionForHR(hr);
        hr = _graphBuilder.AddFilter(_sourceFilter, "AsyncReader");
        DSUtilities.ThrowExceptionForHR(hr);

        IPin output = DSUtilities.FindPinByDirection(_sourceFilter, _PinDirection.PINDIR_OUTPUT, 0);

        // add some other filters
        // ...

        _graphBuilder.Render(output);
        _videoWindow = (IVideoWindow)_graphBuilder;

        _videoWindow.WindowStyle = (int)(WindowStyle.Child | WindowStyle.ClipChildren);
        _videoWindow.SetWindowPosition(_viewer.VideoRectangle.Left, _viewer.VideoRectangle.Top, _viewer.VideoRectangle.Width, _viewer.VideoRectangle.Height);
        _videoWindow.Owner = viewer.CanvasHandle.ToInt32();

我认为这个问题与_graphBuilder.Render()调用或设置窗口所有者和窗口位置有关。我已经弄乱了函数调用的顺序,似乎没有任何帮助。需要注意的一件重要事情是,在IGraphBuilder上调用Render()之后才能获取IVideoWindow接口。我需要摆脱弹出窗口!还有其他人看过这个问题吗?或者有没有人对导致它的原因有任何想法?任何帮助将不胜感激。

谢谢, 丹

1 个答案:

答案 0 :(得分:0)

这一系列的调用对我有用而不会弹出一个窗口:

pGraph->RenderFile(fname, NULL);
pGraph->QueryInterface( IID_IVideoWindow, (void**) &pVidWindow);

pVidWindow->put_Owner((OAHWND)hwnd);
pVidWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
pVidWindow->SetWindowPosition(0, 0, grc.right, grc.bottom);
pVidWindow->put_MessageDrain( (OAHWND)hwnd );
pVidWindow->put_Visible(OATRUE);