首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在NPAPI中使用VMR9进行视频渲染

在NPAPI中使用VMR9进行视频渲染
EN

Stack Overflow用户
提问于 2013-12-24 10:41:11
回答 1查看 627关注 0票数 1

我使用DirectShow在NPAPI插件中进行视频渲染。我编写了一个源代码过滤器,将YUY2样本推到上游,我试图在无窗口模式下使用VMR9将视频呈现到插件的HWND中。无论如何,框架实际上是被交付,但没有输出显示在插件窗口。我确信帧传递是因为如果我在窗口模式下使用VMR9,我实际上可以看到视频。

这段代码用于图形构建和绘制。

代码语言:javascript
复制
// init VMR9 filter
IBaseFilter *pVmr = NULL;
HRESULT hr = CoCreateInstance(CLSID_VideoMixingRenderer9, 0,
    CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pVmr);

hr = _base->AddFilter(pVmr, L"VMR9");
pVmr->Release();

// set VMR9 windowless
IVMRFilterConfig9* pConfig;
hr = pVmr->QueryInterface(IID_IVMRFilterConfig9, (void**)&pConfig);

if (SUCCEEDED(hr))
{
    pConfig->SetRenderingMode(VMRMode_Windowless);
    pConfig->SetNumberOfStreams(1);
    pConfig->Release();

}

// set VMR9 clipping window
IVMRWindowlessControl9* pWc = NULL;
hr = pVmr->QueryInterface(IID_IVMRWindowlessControl9, (void**)&pWc);
if (SUCCEEDED(hr))
{
    hr = pWc->SetVideoClippingWindow((_outputWindow));

    RECT r;
    GetWindowRect(_outputWindow, &r);
    pWc->SetVideoPosition(NULL, &r);

    pWc->Release();

}

// init source filter
IBaseFilter *pSource = new NetReceiverFilter();
hr = _base->AddFilter(pSource, L"Net Receiver");

_capture->RenderStream(0, 0, pSource, 0, pVmr);


long evCode;
_control->Run();
_event->WaitForCompletion(10000, &evCode);

其中:

  • _outputWindow是插件的硬件
  • _base是IGraphBuilder *
  • _build是ICaptureGraphBuilder2 *
  • _control是IMediaControl *
  • _event是IMediaEvent *
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-24 10:46:28

IVMRWindowlessControl9::SetVideoPosition获取客户端(相对)坐标,而GetWindowRect获得屏幕(绝对)坐标,您需要计算出这个坐标,例如使用GetclientRect,或者使用附加的ScreenToClient调用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20759419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档