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

0

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

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

Изображение 174551

Я это делал:

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 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;
    }
}

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

Заранее спасибо.

Теги:
video-capture
renderer
directshow

1 ответ

1
Лучший ответ

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

Я думаю, вы можете видеть видео на EVR в GraphEdit? Вы должны это сделать, просто используйте Preview 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.

  • 0
    Спасибо, я понял это. Может быть, я добавлю код выше

Ещё вопросы

Сообщество Overcoder
Наверх
Меню