Предварительный просмотр в Enhanced Video Renderer

Я пытаюсь в основном сделать предварительный просмотр с карты захвата (720p) с PS3 для улучшенного рендеринга видео.

В идеале мне хотелось бы что-то вроде этого:

GraphStudio

Я делал это:

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 я отлаживал вывод, чтобы получить имя источника (имя вывода «Capture» карты захвата AVermedia). Это сказало, что было успешно приложить к рендеру в 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

Решение

EVR может использоваться программно почти так же, как VMR-7/9. Единственное отличие состоит в том, что EVR нужен режим «без окон», в то время как более ранние рендереры поддерживали также «оконный» режим, где требуется минимальная инициализация рендерера.

Я полагаю, вы можете увидеть видео на EVR в GraphEdit? Вы должны быть в состоянии сделать это, просто используйте Pin предварительного просмотра, а не Capture. Или подключите Capture через фильтр Smart Tee и его предварительный просмотр.

Коды ошибок указывают на то, что вы неправильно строите график. Особенно, VFW_E_NOT_IN_GRAPH говорит, что ваш фильтр не в графе и, следовательно, неверный аргумент. Вам не нужно использовать getRender, просто CoCreateInstance EVR обычный и прямой способ. В первый момент вы получаете сообщение об ошибке, в которой вы заинтересованы, чтобы приостановить все и просмотреть топологию графа фильтров, имеющуюся на данный момент.

Образцы Windows SDK содержат \Samples\multimedia\directshow\vmr9\windowless который показывает VMR-9 в режиме без окон, это, предположительно, ближайшая отправная точка для переключения с VMR-9 на EVR.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]