有來自微軟多個API,其提供對圖像數據。
- 吐溫:用於從單一的掃描儀圖像採集等
- WIA:這似乎已經退化成一個單一的圖像編解碼器庫。 VfW:一個非常老的(Win16)API,它只能實現視頻文件編碼/解碼,但支持某些視頻採集。
- DirectShow:以前是DirectX SDK的一部分,目前在Platform SDK中。這是當前(通用)流媒體解決方案的地方。 Windows Media/Media Foundation:這看起來更像是針對視頻播放/重新編碼。
- 製造商特定庫:Pylon/Halcon /成像控制/ ...
DirectShow的具體:
要創建的窗口下的圖像採集設備,則必須提供任一的裝置(驅動程序),其實現了streamclasses接口(或較新的AV流),或者你必須寫一個用戶模式COM對象必須將其添加到VideoInputCategory枚舉器。
Avstream示例爲實際圖像採集設備提供了所有功能。只有實際設備的較低層確實缺失。
如果您可以設計一個設備,您應該創建它與DCAM或UVC兼容。對於這兩個都有由Windows提供的內置驅動程序。
如何編寫軟件源設備:
你必須創建一個DirectShow過濾器,其提供至少一個輸出引腳和VideoInputCategory下注冊此。某些應用程序可能需要捕捉應用程序需要幾個接口,但這些接口取決於應用程序本身。試用過濾器的簡單應用程序是在Plattform SDK中提供的GraphEdit和AMCap。
某些代碼:
#include <InitGuid.h>
#include <streams.h>
const AMOVIESETUP_MEDIATYPE s_VideoPinType =
{
&MEDIATYPE_Video, // Major type
&MEDIATYPE_NULL // Minor type
};
const AMOVIESETUP_PIN s_VideoOutputPin =
{
L"Output", // Pin string name
FALSE, // Is it rendered
TRUE, // Is it an output
FALSE, // Can we have none
FALSE, // Can we have many
&CLSID_NULL, // Connects to filter
NULL, // Connects to pin
1, // Number of types
&s_VideoPinType // Pin details
};
const AMOVIESETUP_FILTER s_Filter =
{
&CLSID_MyFilter, // Filter CLSID
L"bla", // String name
MERIT_DO_NOT_USE, // Filter merit
1, // Number pins
&s_VideoOutputPin // Pin details
};
REGFILTER2 rf2;
rf2.dwVersion = 1;
rf2.dwMerit = MERIT_DO_NOT_USE;
rf2.cPins = 1;
rf2.rgPins = s_Filter.lpPin;
HRESULT hr = pFilterMapper->RegisterFilter(CLSID_MyFilter, _FriendlyName.c_str(), 0,
&CLSID_VideoInputDeviceCategory, _InstanceID.c_str(), &rf2);
if(FAILED(hr))
{
return false;
}
std::wstring inputCat = GUIDToWString(CLSID_VideoInputDeviceCategory);
std::wstring regPath = L"CLSID\\" + inputCat + L"\\Instance";
win32_utils::CRegKey hKeyInstancesDir;
LONG rval = openKey(HKEY_CLASSES_ROOT, regPath, KEY_WRITE, hKeyInstancesDir);
if(rval == ERROR_SUCCESS)
{
win32_utils::CRegKey hKeyInstance;
rval = createKey(hKeyInstancesDir, _InstanceID, KEY_WRITE, hKeyInstance);
....
_InstanceID是此 '虛擬設備' 條目創建的GUID。
你的意思是WDK而不是DDK,對不對?另外,爲了更好地瞭解你要找的東西,樣本中的testcap的位置,我找不到它。 – mrduclaw 2009-10-26 21:51:50
再次。 不要試圖寫驅動程序,因爲驅動程序往往非常大。 我會嘗試查看我的代碼以註冊軟件設備,並在此處顯示它。 – Christopher 2009-10-26 22:06:49
如果你真的必須去Windows驅動程序的方式...請參閱[這個問題](http://stackoverflow.com/questions/1137540/connecting-windows-driver-to-userland-service)瞭解如何與設備驅動程序進行通信。祝你好運。 – Christopher 2009-10-27 11:30:48