2015-02-03 2 views
0

Я пытаюсь подключить настраиваемый исходный фильтр к x264. Я могу подключить его к ведущему кодеру, главному кодексу понятий. Я могу подключить их непосредственно в graphedit. Я получаю результат HR 0x80040207 VFW_E_NO_ACCEPTABLE_TYPES.connect x264vfw для настраиваемого фильтра источника

HRESULT CStreaming::Init(){ 
    CoInitialize(NULL); 
    HRESULT hr; 
    hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&m_pGraph)); 
#ifdef _DEBUG 
    DWORD dwRegister; 
    hr = AddToRot(m_pGraph, &dwRegister); 
#endif 
    A_CheckResult(hr); 
    IBaseFilter* pSource; 
    IBaseFilter* pEncoder; 
    IBaseFilter* pColorSpaceConverter; 
    IBaseFilter* pTransport; 
    FILTER_INFO pfi; 

    /* Source Filter*/ 
    hr = InitFilter(StreamingFilterGUID, &pSource); 
    A_CheckResult(hr); 
    hr = pSource->QueryFilterInfo(&pfi); 
    A_CheckResult(hr); 
    hr = m_pGraph->AddFilter(pSource, pfi.achName); 
    A_CheckResult(hr); 

    hr = InitFilter(x264EncodeGUID, &pEncoder); 
    A_CheckResult(hr); 
    hr = pEncoder->QueryFilterInfo(&pfi); 
    A_CheckResult(hr); 
    hr = m_pGraph->AddFilter(pEncoder, pfi.achName); 
    A_CheckResult(hr); 
    ... 
    /* Queryt Control and Events */ 
    hr = m_pGraph->QueryInterface(IID_PPV_ARGS(&m_pControl)); 
    A_CheckResult(hr); 
    hr = m_pGraph->QueryInterface(IID_PPV_ARGS(&m_pEvent)); 
    A_CheckResult(hr); 

    /* Connect */ 
    hr = ConnectFilters(pSource, pEncoder); 
    A_CheckResult(hr); 
    hr = ConnectFilters(pEncoder, pColorSpaceConverter); 
    A_CheckResult(hr); 
    hr = ConnectFilters(pColorSpaceConverter, pTransport); 
    A_CheckResult(hr); 

    /* Release */ 
    SafeRelease(&pSource); 
    SafeRelease(&pEncoder); 
    SafeRelease(&pColorSpaceConverter); 
    SafeRelease(&pTransport); 

    return S_OK; 
} 

Connect Наполнитель берется прямо из MSDN

HRESULT CStreamingAgent::ConnectFilters(IBaseFilter *pSrc, IBaseFilter *pDest) 
{ 
    IPin *pOut = NULL; 

    // Find an output pin on the first filter. 
    HRESULT hr = FindUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut); 
    if (SUCCEEDED(hr)) 
    { 
     hr = ConnectOutputPinToFilter(pDest, pOut); 
     pOut->Release(); 
    } 
    return hr; 
} 

ConnectOutputPinToFilter изменяется, но в основном из MSDN

HRESULT CStreamingAgent::ConnectOutputPinToFilter(IBaseFilter *pDest,IPin *pOut) 
{ 
    IPin *pIn = NULL; 

    // Find an input pin on the downstream filter. 
    HRESULT hr = FindUnconnectedPin(pDest, PINDIR_INPUT, &pIn); 
    if (SUCCEEDED(hr)) 
    { 
     // Try to connect them. 
     hr = m_pGraph->ConnectDirect(pOut, pIn, NULL); 
     pIn->Release(); 
    } 
    return hr; 
} 

В ConnectOutputPinToFilter я осмотрел MajorType и подтип каждого пальца, и они совпадают.
Мой заказ выходной фильтр закодирована выхода RGB32 1920х1080 24fp Init фильтр является оберткой CoCreate с некоторой проверкой ошибок и AddRef

#define A_CheckResult(p) {if ((FAILED(p))) return(p);} 
+0

Вы должны проверить, какие форматы ввода 'x264vfw' принимает. RGB не является типичным входом для кодировщика H.264. Некоторые кодировщики конвертируются из таких форматов внутри, но другие требуют, чтобы вы позаботились об этом. Кроме того, 'x264vfw' доступен в источнике, поэтому вы можете проверить, что там ожидается. –

+0

Или другая причина (источник 'x264vfw' предполагает, что RGB может быть принят), что формат ввода не совсем допустим. Все еще принимается некоторыми фильтрами (LEAD) и отклоняется другими. –

+0

x264vfw выглядит так, как будто RGB32 и RGB24 являются источником входного сигнала и преобразуют его в NV12. Кроме того, они соединяются в редактировании графа. – KevinA

ответ

1

x264vfw не стандартный фильтр. Старые кодеки VFW (видео для Windows) завернуты и все имеют один и тот же CLSID. Вам нужно найти его, используя имя дружелюбного имени или имени прозвища. Эта строка кода не применяется:

hr = InitFilter(x264EncodeGUID, &pEncoder);

Инструкция здесь: Choosing a Compression Filter

Смотрите также: Encoding with DirectShow filters