gpt4 book ai didi

c++ - 在 NPAPI 中使用 VMR9 进行视频渲染

转载 作者:行者123 更新时间:2023-11-30 04:10:12 28 4
gpt4 key购买 nike

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

这段代码用于图形构建和渲染。

// 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 是插件的HWND
  • _base 是 IGraphBuilder *
  • _build 是 ICaptureGraphBuilder2 *
  • _control 是 IMediaControl *
  • _event 是 IMediaEvent *

最佳答案

IVMRWindowlessControl9::SetVideoPosition 获取客户端(相对)坐标,而 GetWindowRect 获取屏幕(绝对)坐标,您需要解决这个问题,例如使用 GetclientRect 代替,或使用额外的 ScreenToClient 调用。

关于c++ - 在 NPAPI 中使用 VMR9 进行视频渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20759419/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com