2016-07-04 25 views
2

カメラパラメータを制御しようとすると問題が発生します。ここでは明るさのパラメータを設定する機能は、(私がWindows Media Foundation recording audioからコードを延長しています)です:IAMVideoProcAmp GetRangeは遅延後にのみ動作します(C++)?

HRESULT deviceInput::SetupCamera(UINT32 deviceID) { 
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); 
IMFActivate* device = this->getDevice(deviceID); 
if (device == NULL) 
    return E_FAIL; 
IMFMediaSource* pCameraSource = NULL; 
HRESULT hr = (m_devices[deviceID])->ActivateObject(IID_PPV_ARGS(&pCameraSource)); 
if (FAILED(hr)) { 
    wcout << "Could not activate object" << endl; 
    return hr; 
} 
IAMVideoProcAmp* spVideo = NULL; 
hr = CoCreateInstance(__uuidof(IMFMediaSource) , NULL, CLSCTX_INPROC_SERVER, __uuidof(IAMVideoProcAmp), 
         reinterpret_cast<void**>(&spVideo)); 
hr = pCameraSource->QueryInterface(IID_PPV_ARGS(&spVideo)); 
if(FAILED(hr)) { 
    wcout << "Could not get interface" << endl; 
    return hr; 
} 
if(spVideo) { 
    wcout << "Getting brightness" << endl; 
    long Min, Max, step, def, control; 
    Sleep(100); // if I remove this - will get "Element not found error" 
    hr = spVideo->GetRange(VideoProcAmp_Brightness, &Min, &Max, &step, &def, &control); 
    if (SUCCEEDED(hr)) 
     wcout << "Brightness. Min = " << Min <<", max = " << Max << endl; 
    else { 
     _com_error err(hr); 
     LPCTSTR errMsg = err.ErrorMessage(); 
     wcout << "Failed: " << errMsg << endl; 
    } 
} 
CoUninitialize(); 
return hr; 
} 

私がそうでなければ、私は「要素が見つかりません」というエラーを取得しています、GetRange()メソッドを呼び出す前にポーズを挿入する必要があると思われます。 HRESULT値をチェックしているので、QueryInterfaceは正しく動作し、遅延に関係なくspVideoにデータが取り込まれます。誰もが任意の遅延を挿入せずにこれを動作させる方法を知っていますか?

+0

このソースからビデオキャプチャを開始し、アクティブデバイスのパラメータを変更する必要があるとします。バックステージのものが適切に初期化されていることを確認する必要があります。 –

答えて

1

あなたはよく知られている問題を説明しました。事実、起動システムの実行後にカメラ用ドライバを初期化する時間が必要です。それは時間が必要です。 Sleep関数を実際に削除したい場合は、DeviceIoControl でカメラプロパティを呼び出す必要があります。MSDN USB Video Class Propertiesで、次のテキスト「ユーザーモードコンポーネントからのプロパティ要求を行うためにKsSynchronousDeviceControlまたはDeviceIoControlを呼び出します」DeviceIoControlはMicrosoft Windows SDKドキュメント" ところで、DeviceIoControlの使用のために、MediaSourceを有効にする必要はありません。 DeviceIoControl関数はカメラのシンボリックリンクのみ必要です。しかし、ドライバーとの直接作業のためのコードを書くことは非常に困難です(私は1つのC++クラスで書いています)。

+0

Evgeny、答えに感謝します。したがって、ドライバがMediaFoundationクラスの中から準備が整っているかどうかをチェックする方法はありません(ある種のブロッキングコールは多分でしょうか?)。 – Ilya

+0

いいえ、 'MediaFoundation'でカメラのプロパティを操作する方法はありません。 'IAMVideoProcAmp' DirectShowまたは' DeviceIoControl'を介してのみ。カメラはハードウェアデバイスです。つまり、Windows上の任意のデバイス(ハードディスクなど)と同じコードを使用する必要があります。つまり、「DeviceIoControl」です。 –

関連する問題