2016-12-07 95 views
1

私のアプリでMedia Foundation( "MF")のDirectshow( "DS")でコードを置き換えようとしましたが、1つの問題を満たしました。ウェブカメラでMFを使用して、 。 MFは30fpsしか設定できませんでした。私が25fpsを設定しようとすると、私はSetCurrentMediaType()に常にエラー0xc00d5212を取得します。 DSでは、そのパラメータを変更することができました。Media Foundation:ウェブカメラでFPSを変更できない

私のコード:任意の助け

ASSERT(m_pReader); //IMFSourceReader *m_pReader; 
IMFMediaType *pNativeType = NULL; 
IMFMediaType *pType = NULL; 
UINT32 w = 1280; 
UINT32 h = 720; 
UINT32 fps = 25; // or 30 

DWORD dwStreamIndex = MF_SOURCE_READER_FIRST_VIDEO_STREAM; 

// Find the native format of the stream. 
HRESULT hr = m_pReader->GetNativeMediaType(dwStreamIndex, 0, &pNativeType); 
if (FAILED(hr)) 
{ 
    //error 
} 

GUID majorType, subtype; 

// Find the major type. 
hr = pNativeType->GetGUID(MF_MT_MAJOR_TYPE, &majorType); 
if (FAILED(hr)) 
{ 
    //error 
} 
// Define the output type. 
hr = MFCreateMediaType(&pType); 
if (FAILED(hr)) 
{ 
    //error 
} 
hr = pType->SetGUID(MF_MT_MAJOR_TYPE, majorType); 
if (FAILED(hr)) 
{ 
    //error 
} 
// Select a subtype. 
if (majorType == MFMediaType_Video) 
{ 
    subtype= MFVideoFormat_RGB24; 
} 
else 
{ 
    //error 
} 
hr = pType->SetGUID(MF_MT_SUBTYPE, subtype); 
if (FAILED(hr)) 
{ 
    //error 
} 
hr = MFSetAttributeSize(pType, MF_MT_FRAME_SIZE, w, h); 
if (FAILED(hr)) 
{ 
    //error 
} 
hr = MFSetAttributeSize(pType, MF_MT_FRAME_RATE, fps, 1); 
if (FAILED(hr)) 
{ 
    //error 
} 
hr = m_pReader->SetCurrentMediaType(dwStreamIndex, NULL, pType); 
if (FAILED(hr)) 
{// hr = 0xc00d5212 
    //!!!!!error - if fps == 25 
} 
return hr; 

感謝。

答えて

3

カメラがフレキシブルフレームレート値をサポートしておらず、サポートされているセット(10,15,20,24,30 fpsなど)でのみ動作する可能性があります。サポートされているメディアタイプを列挙して、あなたに適したメディアタイプを選択することができます。これらのメディアタイプには通常、フレームレートオプションが含まれています。

Media FoundationとDirectShowのビデオキャプチャは、最終的に同じバックエンドで終了しますが、動作に差異が生じることがあります。具体的には、メディアソースと内部的にインターフェイスするMedia Foundationの上位レベルのAPIを使用しているため、フレームレートが0xC00D5212MF_E_TOPO_CODEC_NOT_FOUNDになる場合があります。技術的には「コンテンツをエンコードまたはデコードするには適切な変換が見つかりませんでしたそれぞれのモードでキャプチャすることができます。

も参照してください:

+0

こんにちはローマン、私はあなたのMFユーティリティを試して、次のものがあります:私のウェブカメラは1と30 fpsでのみ動作することができます。しかし、DSは5,10,15,20,25,30 fpsという別のものを示しました。どうして?ウェブカメラは30fpsしかありませんが、DSはそのフレームレートを他のフレームレートで分割できますか?それは本当ですか? –

+0

私はWDMドライバが複数のフレームレートを報告していると思いますが、情報が不完全で、MFレイヤーでフィルタにかけられている可能性があります。ちょうど推測 - 何かを明確にするのに十分な情報はありません。 –

+0

こんにちは、私はこの制限は、メディア財団のためのUVC - USBビデオクラスドライバと関連していると思います。これはプラットフォームのWindowsStoreをターゲットにしており、USBカメラでRGBやMJPEG形式だけでなくハードウェアエンコーダからH264やH265形式でビデオを取得するために最適化されているため、機能の制限があります。より多くの機能を利用するには、必要なフレームレートでフレームを取得するDShowまたは書き込みタイマーを使用する必要があります。 –

0

私はコードにfpsの制御模倣するためのタイマーを追加しました。開始時には30fpsに設定し、次にfpsスケールで私のアプリ用のフレームをスキップします。 ありがとうございます。

関連する問題