Я пытаюсь в основном сделать предварительный просмотр с карты захвата (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;
}
}
В визуальной студии я отлаженной на булавку, чтобы получить имя источника («Захват» имя контакта из Карта захвата 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. Для этого я не нашел исчерпывающих учебников или исходного кода. Если вам нужна больше информации, я могу добавить еще.
Заранее спасибо.
Спасибо, я понял. Возможно, я добавлю код выше – user654628