2014-02-13 4 views
0

Я пытаюсь в основном сделать предварительный просмотр с карты захвата (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; 
    } 
} 

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

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

ответ

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

Спасибо, я понял. Возможно, я добавлю код выше – user654628

Смежные вопросы