gpt4 book ai didi

c++ - 捕获预览到增强型视频渲染器

转载 作者:行者123 更新时间:2023-11-28 07:06:04 24 4
gpt4 key购买 nike

我正在尝试基本上从 PS3 的采集卡 (720p) 渲染到增强的视频渲染。

理想情况下,我想要这样的东西:

GraphStudio

我曾经这样做过:

hr = m_pCapture->RenderStream (&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, m_pSrcFilter, NULL, NULL);

但我发现它只渲染到一个旧的默认渲染器,这不足以将图像拉伸(stretch)到 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 预览采集卡。我没有找到全面的教程或源代码来执行此操作。如果您需要更多信息,我可以添加更多信息。

提前致谢。

最佳答案

EVR 可以像 VMR-7/9 一样以编程方式使用。唯一的区别是 EVR 需要“无窗口”模式,而早期的渲染器也支持“窗口”模式,您需要对渲染器进行最少的初始化。

我想你可以在 GraphEdit 中看到 EVR 上的视频?您应该能够这样做,只需使用 Preview pin,而不是 Capture。或者,通过 Smart Tee 过滤器及其预览输出连接 Capture。

错误代码表明您没有正确构建图形。特别是,VFW_E_NOT_IN_GRAPH 表示您的过滤器不在图表中,因此参数无效。您不需要使用 getRender,只需使用 CoCreateInstance 以通常且直接的方式使用 EVR。在您收到错误消息的第一时间,您有兴趣搁置所有内容并查看您当前拥有的过滤器图拓扑。

Windows SDK 示例包含 \Samples\multimedia\directshow\vmr9\windowless,它在无窗口模式下显示 VMR-9,这应该是从 VMR-9 切换到 EVR 的最接近起点。

关于c++ - 捕获预览到增强型视频渲染器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21744791/

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