2009-10-26 25 views
17

मैं वर्चुअल वेबकैम ड्राइवर विकसित करना चाहता हूं जो उपयोगकर्ता मोड से मैं छवि को पास कर दूंगा और यह वेबकैम आउटपुट के रूप में प्रदर्शित होगा।वर्चुअल वेबकैम ड्राइवर

मैं डायरेक्टएक्स फ़िल्टर और सीएसओएसस्ट्रीम इत्यादि का उपयोग नहीं करना चाहता हूं क्योंकि वे कुछ प्रोग्रामों पर काम नहीं करते हैं जो वेबकैम छवि को कैप्चर करने के लिए डायरेक्टएक्स का उपयोग नहीं करते हैं।

मुझे कर्नेल मोड डिवाइस ड्राइवर लिखना है।

कोई भी विचार? मैंने डीडीके नमूने से टेस्ट कैप की कोशिश की, लेकिन यह उपयोगकर्ता मोड से छवि को संसाधित नहीं करता है और उसे कोई इनपुट नहीं मिलता है, बस यह वेबकैम में 7 रंग प्रदर्शित करता है ...

किसी भी मदद की सराहना की जाएगी। धन्यवाद


सभी को धन्यवाद!

मैं यहाँ से कोड की कोशिश की: http://tmhare.mvps.org/downloads.htm (लगता है पर कब्जा स्रोत फ़िल्टर)

यह अच्छी तरह से काम किया जब मैं याहू, एमएसएन में यह संकलित है, लेकिन यह AIM, इंटरनेट एक्सप्लोरर फ़्लैश Webcam, फायरफॉक्स फ्लैश वेब कैमरा और स्काइप दुर्घटनाग्रस्त हो गया। .. मैं के बाद कि 8 समय कॉल QueryInterface में दुर्घटना हो गई, मैं यह चाल का एक बहुत कुछ के साथ यह पता लगाने के साथ पाया ..

अब मुझे पता है, यह HRESULT CVCamStream :: QueryInterface को 8 वीं फोन पर दुर्घटनाओं (REFIID riid , शून्य ** पीपीवी)

8 वें कॉल जब यह पहुंचता है अगर आखिरी है, तो मेरा मतलब है: वापसी CSourceStream :: QueryInterface (riid, ppv);

यह Filters.cpp

तुम्हें क्या लगता है मैं दुर्घटना हो रही है है की 17 वीं पंक्ति में है ??

आप सब मेरे मार्गदर्शक जो डायरेक्टशो, नहीं ड्राइवर

+0

आपका मतलब डब्ल्यूडीके है और डीडीके नहीं, है ना? इसके अलावा, एक बेहतर विचार प्राप्त करने के लिए जो आप खोज रहे हैं, नमूने में स्थित टेस्ट कैप कहां है, मुझे यह नहीं मिल रहा है। – mrduclaw

+0

एक बार फिर। ड्राइवर लिखने की कोशिश न करें, क्योंकि ड्राइवर वास्तव में वास्तव में बड़े होते हैं। मैं सॉफ़्टवेयर डिवाइस पंजीकृत करने के लिए अपने कोड को देखने का प्रयास करूंगा, और इसे यहां दिखाऊंगा। – Christopher

+0

यदि आपको वास्तव में विंडोज चालक तरीके से जाना है ... इस सवाल को देखें [http://stackoverflow.com/questions/1137540/connecting-windows-driver-to-userland-service) कैसे करें एक डिवाइस चालक के साथ संवाद करें। सौभाग्य। – Christopher

उत्तर

4

है सही समाधान खोजने के लिए के लिए धन्यवाद आप तय नहीं कर सकते कि अन्य कार्यक्रम अपने ड्राइवर कहेंगे। अधिकांश कार्यक्रम डायरेक्टशो का उपयोग करेंगे। कुछ Win3.x प्रौद्योगिकी VFW का उपयोग करेंगे। विंडोज एक्सपी के स्कैनर और कैमरा विज़ार्ड समेत कई नए कार्यक्रम, आपको डब्ल्यूआईए इंटरफ़ेस के माध्यम से कॉल कर सकते हैं। यदि आप इसे लागू नहीं करना चाहते हैं, तो आपको WDM के माध्यम से at least provide the DirectShow interface की आवश्यकता है और vfwwdm32.dll आपको एक वीएफडब्ल्यू इंटरफ़ेस देता है, या अपना स्वयं का वीएफडब्ल्यू ड्राइवर लिखता है।

16

माइक्रोसॉफ्ट से कई एपीआई हैं जो छवि डेटा तक पहुंच प्रदान करते हैं।

  • ट्वेन:, स्कैनर से ही छवि पर कब्जा के लिए प्रयुक्त आदि
  • WIA: यह एक ही छवि कोडेक पुस्तकालय के लिए विकृत है लगता है।
  • वीएफडब्ल्यू: एक बहुत पुराना (विन 16) एपीआई जो वास्तव में केवल वीडियो-फ़ाइल एन्कोडिंग/डिकोडिंग काम करता है, लेकिन कुछ वीडियो अधिग्रहण के लिए समर्थन है।
  • डायरेक्टशो: वर्तमान में प्लेटफार्म एसडीके में डायरेक्टएक्स एसडीके में हिस्सा। वर्तमान (सामान्य) स्ट्रीमिंग समाधानों के लिए यह जगह है।
  • विंडोज मीडिया/मीडिया फाउंडेशन: यह वीडियो प्लेबैक/रीनकोडिंग पर अधिक दिखने लगता है।
  • निर्माता विशिष्ट पुस्तकालय: पिलोन/हलकॉन/इमेजिंग नियंत्रण/...

डायरेक्टशो विशिष्ट:

खिड़कियों के तहत छवि अधिग्रहण उपकरणों बनाने के लिए, आप या तो एक डिवाइस (चालक) प्रदान करने के लिए जो (या नए AVStream) streamclasses इंटरफेस को लागू करता है या आप एक usermode COM वस्तु लिखने के लिए है जिसे VideoInputCategory गणनाकर्ता में जोड़ा जाना है।

AVstream नमूना वास्तविक छवि अधिग्रहण डिवाइस के लिए सबकुछ प्रदान करता है। वास्तविक डिवाइस के लिए केवल निचली परत वास्तव में गायब है।

यदि आप किसी डिवाइस को डिज़ाइन कर सकते हैं, तो आपको या तो इसे डीसीएएम या यूवीसी संगत बनाना चाहिए। दोनों के लिए विंडोज़ द्वारा निर्मित अंतर्निहित ड्राइवर हैं।


एक सॉफ्टवेयर स्रोत डिवाइस लिखने के लिए कैसे:

आप जो कम से कम एक उत्पादन पिन प्रदान करता है एक डायरेक्टशो फ़िल्टर बनाने और VideoInputCategory के तहत इस रजिस्टर करने के लिए है। कैप्चर एप्लिकेशन से कुछ इंटरफेस की आवश्यकता होती है, लेकिन ये एप्लिकेशन पर निर्भर करते हैं। फिल्टर को आज़माने के लिए सरल अनुप्रयोग ग्राफ़एडिट और एएमकैप हैं जो प्लेटफॉर्म एसडीके में आपूर्ति की जाती हैं।

कुछ कोड:

#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 इस 'आभासी डिवाइस' प्रवेश के लिए बनाई गई है।

+1

सी # http://www.codeproject.com/Articles/437617/DirectShow-Virtual-Video-Capture-Source-Filter-in के भीतर से ऐसा करने पर संबंधित आलेख –

संबंधित मुद्दे