2016-04-24 12 views
2

グッドイブニングMedia Foundation - クロスバーからの入力方法

私は、SimpleCaptureとCaptureEngine SDKのサンプルから大部分が変更されたMedia Foundationを使用して、少しビデオキャプチャDLLをまとめようとしています。キャプチャのソースが私の組み込みのウ​​ェブカメラであるとき、すべてのことがうまく機能します。

問題は、複数の入力(s-ビデオ、コンポジット&ステレオオーディオ)を備えた外部USBフレームグラバーを使用しようとするときに、プレビューストリームがないことです。クロスバーの選択された入力を正常に変更するDShowインターフェイスを使用する機能があります(機能を実行した後、AMCAPのオプションを確認することで確認できます)。しかし、デバイスをプレビューすることができませんでした。

クロスバーから入力を選択するMedia Foundationの方法はありますか?かない場合は、下記のクロスバー入力選択コードと間違っているかもしれないものを提案することができます

HRESULT CaptureManager::doSelectInputUsingCrossbar(std::wstring deviceName, long input) 
{ 


IGraphBuilder *pGraph = NULL; 
ICaptureGraphBuilder2 *pBuilder = NULL; 
IBaseFilter* pSrc = NULL; 

ICreateDevEnum *pDevEnum = NULL; 
IEnumMoniker *pClassEnum = NULL; 
IMoniker *pMoniker = NULL; 
bool bCameraFound = false; 
IPropertyBag *pPropBag = NULL; 


bool crossbarSet = false; 

HRESULT hr = S_OK; 

if (!(input == PhysConn_Video_Composite || input == PhysConn_Video_SVideo)) 
{ 
    return S_FALSE; 
} 



// Create the Filter Graph Manager. 
hr = CoCreateInstance(CLSID_FilterGraph, NULL, 
    CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph); 

if (SUCCEEDED(hr)) 
{ 
    // Create the Capture Graph Builder. 
    hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, 
     CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, 
     (void **)&pBuilder); 
    if (SUCCEEDED(hr)) 
    { 
     pBuilder->SetFiltergraph(pGraph); 
    } 
    else return hr; 
} 
else return hr; 

////////////////////////// 


// chooses the default camera filter 

hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, 
    IID_ICreateDevEnum, (void **)&pDevEnum); 
if (FAILED(hr)) 
{ 

    return E_FAIL; 
} 

// Create an enumerator for video capture devices. 

if (FAILED(pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0))) 
{ 

    return E_FAIL; 
} 

if (pClassEnum == NULL) 
{ 
    CheckHR(hr, "Class enumerator is null - no input devices detected?"); 
    pDevEnum->Release(); 
    return E_FAIL; 
} 



while (!bCameraFound && (pClassEnum->Next(1, &pMoniker, NULL) == S_OK)) 
{ 

    HRESULT hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void**)(&pPropBag)); 
    if (FAILED(hr)) 
    { 
     pMoniker->Release(); 
     continue; // Skip this one, maybe the next one will work. 
    } 

    // Find the description or friendly name. 
    VARIANT varName; 
    VariantInit(&varName); 
    hr = pPropBag->Read(L"Description", &varName, 0); 
    if (FAILED(hr)) 
    { 
     hr = pPropBag->Read(L"FriendlyName", &varName, 0); 
    } 
    if (SUCCEEDED(hr)) 
    { 
     if (0 == wcscmp(varName.bstrVal, deviceName.c_str())) 
     { 
      pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc); 
      bCameraFound = true; 
      break; 
     }//if 
     VariantClear(&varName); 
    } 

    pPropBag->Release(); 
    pMoniker->Release(); 
}//while 

pClassEnum->Release(); 
pDevEnum->Release(); 

if (!bCameraFound)//else 
{ 
    CheckHR(hr, "Error: Get device Moniker, No device found"); 
    goto done; 
} 



hr = pGraph->AddFilter(pSrc, L"video capture adapter"); 
if (FAILED(hr)) 
{ 
    CheckHR(hr, "Can't add capture device to graph"); 
    goto done; 
} 


/////////////// 


IAMCrossbar *pxBar = NULL; 
hr = pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Interleaved, pSrc, IID_IAMCrossbar, (void **)&pxBar); 
if (FAILED(hr)) 
{ 
    hr = pBuilder->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pSrc, IID_IAMCrossbar, (void **)&pxBar); 

    if (FAILED(hr)) 
    { 
     CheckHR(hr, "Failed to get crossbar filter"); 
     goto done; 
    } 
}//if 
else 
{ 
    CheckHR(hr, "Failed to get crossbar (capture)"); 
    goto done; 
} 

LONG lInpin, lOutpin; 
hr = pxBar->get_PinCounts(&lOutpin, &lInpin); 

BOOL IPin = TRUE; LONG pIndex = 0, pRIndex = 0, pType = 0; 

while (pIndex < lInpin) 
{ 
    hr = pxBar->get_CrossbarPinInfo(IPin, pIndex, &pRIndex, &pType); 

    if (pType == input) 
    { 
     break; 
    } 

    pIndex++; 
} 

BOOL OPin = FALSE; LONG pOIndex = 0, pORIndex = 0, pOType = 0; 

while (pOIndex < lOutpin) 
{ 
    hr = pxBar->get_CrossbarPinInfo(OPin, pOIndex, &pORIndex, &pOType); 

    if (pOType == PhysConn_Video_VideoDecoder) 
    { 
     break; 
    } 

    pIndex++; 
} 

hr = pxBar->Route(pOIndex, pIndex); 




done: 
SafeRelease(&pPropBag); 
SafeRelease(&pMoniker); 
SafeRelease(&pxBar); 


SafeRelease(&pGraph); 
SafeRelease(&pBuilder); 
SafeRelease(&pSrc); 

return hr; 

}

答えて

1

USBフレームグラバーは、Microsoftメディア財団によってサポートされていません。 Microsoft Media Foundationは、USBビデオクラスデバイスドライバを介してライブソースをサポートしています。最新のWebカメラはこのようなドライバをサポートしていますが、USBフレームグラバーはサポートしていません。 PUSHモデルの処理パイプラインに基づいたDirectShowフィルタのUSBフレームグラバーサポート - Microsoft Media FoundationがPULLモデル処理パイプラインを使用している間に、ソースがメディアグラフにメディアサンプルを送信 - シンクは新しいメディアサンプルとソースを要求します要求。

最高です。

+0

こんにちは、Evgeny、聞いて悲しいですが、あなたの答えに感謝します。あなたは、USBビデオクラスデバイスドライバとしてUSBフレームグラバーを提示するインターフェイスを記述できると思いますか? – Crackerjack55

+0

近いうちにできないと思います。 Microsoft Media FoundationがWindows Store - Surface上のライブビデオとオーディオを扱うためのフレームワークであるという事実。サーフェス上では、Webカメラだけで作業する必要があります。ただし、サイト[リンク](http://www.codeproject.com/Articles/1017223/CaptureManager-SDK)には、Windows Media Store、スクリーンキャプチャ、およびオーディオのサンプルが含まれているMicrosoft Media Foundationで作業するための膨大なサンプルがありますループバック。 –

+0

ああ、私はそのリンクを見るまで、あなたが誰だったかを実際には気づかなかった。 Media Foundationを使用してWindows 7および8上のWebカメラからビデオをキャプチャするためのCodeProjectの記事は、以前は素晴らしいものでした。 **アップデート:** TopoEditのUSBフレームグラバーからライブイメージを取得できました! (そしてDShowメソッドを使ってクロスバー入力を選択する)これは私自身のコードで行うことができると私に信じさせます。 – Crackerjack55

関連する問題