我试图基本上将捕获卡(720p)的预览从PS3渲染到增强的视频渲染。
理想情况下,我想要这样的事情:
我曾经这样做过:
hr = m_pCapture->RenderStream (&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, m_pSrcFilter, NULL, NULL);
但我发现它只渲染到旧的默认渲染器,这不足以将图像拉伸到1080p(图像变为像素化)。 [http://msdn.microsoft.com/en-us/library/aa930715.aspx]
我想将增强的视频渲染用作接收器,但我不知道如何使用。我在这里查看了教程:http://msdn.microsoft.com/en-us/library/windows/desktop/ff625867%28v=vs.85%29.aspx 并尝试将我的代码放入,但它不会呈现。
以下是设置源代码的代码段。假设setResolution
将设置AM_MEDIA_TYPE格式,getVideoSourceByKeyword
将获得AVermedia捕获卡设备。
HRESULT DShowPlayer::SetPreviewDevice(PCWSTR keyname)
{
IBaseFilter *pSource = NULL;
// Create a new filter graph. (This also closes the old one, if any.)
HRESULT hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,
CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&m_pCapture));
if (FAILED(hr))
{
goto done;
}
hr = InitializeGraph();
if (FAILED(hr))
{
goto done;
}
// Add the source filter to the graph.
hr = getVideoSourceByKeyword(keyname, &pSource);
if (FAILED(hr))
{
goto done;
}
hr = m_pGraph->AddFilter(pSource, L"Source filter");
if (FAILED(hr))
{
goto done;
}
setResolution(pSource, 1280, 720);
// Try to render the streams.
hr = RenderStreams(pSource);
if (FAILED(hr))
{
goto done;
}
hr = m_pControl->Run();
done:
if (FAILED(hr))
{
TearDownGraph();
}
SafeRelease(&pSource);
return hr;
}
当代码运行RenderStreams时,这是代码(来自http://msdn.microsoft.com/en-us/library/windows/desktop/ff625878%28v=vs.85%29.aspx):
// Enumerate the pins on the source filter.
hr = pSource->EnumPins(&pEnum);
if (FAILED(hr))
{
goto done;
}
// Loop through all the pins
IPin *pPin;
while (S_OK == pEnum->Next(1, &pPin, NULL))
{
PIN_INFO pInfo;
pPin->QueryPinInfo(&pInfo);
// Try to render this pin.
// It's OK if we fail some pins, if at least one pin renders.
HRESULT hr2 = pGraph2->RenderEx(pPin, AM_RENDEREX_RENDERTOEXISTINGRENDERERS, NULL);
pPin->Release();
if (SUCCEEDED(hr2))
{
bRenderedAnyPin = TRUE;
}
}
在visual studio中,我在引脚处调试以获取源名称(AVermedia捕获卡的“Capture”引脚名称)。它表示成功地附加到RenderEx
处的渲染但是
hr = m_pControl->Run();
它失败并且错误是设备未连接。
我还尝试直接获取EVR渲染器并尝试渲染流:
IBaseFilter* render;
m_pVideo->getRender(&render);
m_pGraph->AddFilter(render, L"EVR Filter");
hr = m_pCapture->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pSource, NULL, render);
if (FAILED(hr))
{
goto done;
}
但它失败并说VFW_E_NOT_IN_GRAPH。
我在问什么:我仍然很擅长学习Directshow,我希望能够使用EVR预览捕获卡。我发现没有全面的教程或源代码来执行此操作。如果您需要更多信息,我可以添加更多信息。
提前致谢。
答案 0 :(得分:1)
EVR可以与VMR-7/9非常相似地以编程方式使用。唯一的区别是EVR需要“无窗口”模式,而早期的渲染器也支持“窗口”模式,您需要最小化渲染器的初始化。
我想您可以在GraphEdit中看到有关EVR的视频?您应该能够这样做,只需使用预览引脚,而不是捕获。或者,通过Smart Tee过滤器及其预览输出连接Capture。
错误代码表明您没有正确构建图表。特别是,VFW_E_NOT_IN_GRAPH
表示您的过滤器不在图表中,因此参数无效。您不需要使用getRender
,只需CoCreateInstance
EVR,这是通常和直接的方式。在您收到错误的第一时刻,您有兴趣暂停所有内容并查看您目前拥有的过滤器图形拓扑。
Windows SDK示例包含\Samples\multimedia\directshow\vmr9\windowless
,它在无窗口模式下显示VMR-9,这可能是从VMR-9切换到EVR的最近起点。