2008-08-27 8 views
5

मैं Windows XP/Vista मशीन पर सभी वीडियो कोडेक्स को गिनाने का एक अच्छा तरीका ढूंढ रहा हूं।विंडोज पर सभी उपलब्ध वीडियो कोडेक्स का आकलन करने का सबसे अच्छा तरीका?

मैं कम्प्रेसर और decompressors सहित वीडियो कोडेक का एक सेट, उपयोगकर्ता को लगभग की जरूरत है। उत्पादन की तरह

 
Available Decoders 
DiVX Version 6.0 
XVID 
Motion JPEG 
CompanyX's MPEG-2 Decoder 
Windows Media Video 

**Available Encoders** 
DiVX Version 6.0 
Windows Media Video 

कुछ ऐसा दिखाई देगा समस्या यह है कि मैं डिकोडर प्रणाली के लिए उपलब्ध के सभी पर कब्जा करने के लिए कोई विश्वसनीय तरीका है कि वहाँ है में चल रहा हूँ। उदाहरण के लिए:

  1. आप डायरेक्टशो का उपयोग कर सभी डिकंप्रेसर का आकलन कर सकते हैं, लेकिन यह आपको कंप्रेसर (एन्कोडर्स) के बारे में कुछ भी नहीं बताता है।
  2. आप विंडोज़ घटकों के लिए सभी वीडियो का आकलन कर सकते हैं, लेकिन अगर आपको एन्कोडर्स या डिकोडर्स हैं तो आपको कोई संकेत नहीं मिलता है।
  3. डायरेक्टशो फिल्टर है कि पूरी तरह से अच्छी तरह से आप के लिए काम करते हैं (उदाहरण के लिए प्रस्ताव जेपीईजी फिल्टर) कर रहे हैं, लेकिन वहाँ कोई संकेत नहीं है कि एक विशेष डायरेक्टशो फिल्टर एक "वीडियो विकोडक" है।

क्या किसी को भी किसी भी विंडोज एपीआई का उपयोग करके इस समस्या के लिए सामान्यीकृत समाधान मिला है? क्या Windows Vista Media Foundation API इनमें से किसी भी समस्या का समाधान करता है?

उत्तर

6

यह सबसे अच्छा डायरेक्टशो द्वारा नियंत्रित किया जाता।

डायरेक्टशो वर्तमान में मंच एसडीके का एक हिस्सा है। Filter Categories सूचियों सभी अन्य 'सरकारी' श्रेणियों

enumerateDShowFilterList(CLSID_VideoCompressorCategory); 

MSDN पेज:

HRESULT extractFriendlyName(IMoniker* pMk, std::wstring& str) 
{ 
    assert(pMk != 0); 
    IPropertyBag* pBag = 0; 
    HRESULT hr = pMk->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag); 
    if(FAILED(hr) || pBag == 0) 
    { 
    return hr; 
    } 
    VARIANT var; 
    var.vt = VT_BSTR; 
    hr = pBag->Read(L"FriendlyName", &var, NULL); 
    if(SUCCEEDED(hr) && var.bstrVal != 0) 
    { 
    str = reinterpret_cast<wchar_t*>(var.bstrVal); 
    SysFreeString(var.bstrVal); 
    } 
    pBag->Release(); 
    return hr; 
} 


HRESULT enumerateDShowFilterList(const CLSID& category) 
{ 
    HRESULT rval = S_OK; 
    HRESULT hr; 
    ICreateDevEnum* pCreateDevEnum = 0; // volatile, will be destroyed at the end 
    hr = ::CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, reinterpret_cast<void**>(&pCreateDevEnum)); 

    assert(SUCCEEDED(hr) && pCreateDevEnum != 0); 
    if(FAILED(hr) || pCreateDevEnum == 0) 
    { 
    return hr; 
    } 

    IEnumMoniker* pEm = 0; 
    hr = pCreateDevEnum->CreateClassEnumerator(category, &pEm, 0); 

    // If hr == S_FALSE, no error is occured. In this case pEm is NULL, because 
    // a filter does not exist e.g no video capture devives are connected to 
    // the computer or no codecs are installed. 
    assert(SUCCEEDED(hr) && ((hr == S_OK && pEm != 0) || hr == S_FALSE)); 
    if(FAILED(hr)) 
    { 
    pCreateDevEnum->Release(); 
    return hr; 
    } 

    if(hr == S_OK && pEm != 0) // In this case pEm is != NULL 
    { 
    pEm->Reset(); 
    ULONG cFetched; 
    IMoniker* pM = 0; 
    while(pEm->Next(1, &pM, &cFetched) == S_OK && pM != 0) 
    { 
     std::wstring str; 

     if(SUCCEEDED(extractFriendlyName(pM, str)) 
     { 
      // str contains the friendly name of the filter 
      // pM->BindToObject creates the filter 
      std::wcout << str << std::endl; 
     } 

     pM->Release(); 
    } 
    pEm->Release(); 
    } 
    pCreateDevEnum->Release(); 
    return rval; 
} 

निम्नलिखित कॉल कंसोल के लिए सभी वीडियो कम्प्रेसर विश्लेषण करता है।

मुझे आशा है कि आप के लिए एक अच्छा प्रारंभिक बिंदु है।

+0

मैं निम्नलिखित जोड़ सकता हूं: http://msdn.microsoft.com/en-us/library/windows/desktop/dd375655(v=vs.85).aspx "। पृष्ठ के निचले भाग में यह सुझाव देता है कि श्रेणी CLSID_LegacyAmFilterCategory डायरेक्टशो द्वारा ऑडियो डिकंप्रेसर और वीडियो डिकंप्रेसर के रूप में सुलभ डीएमओ युक्त होगी। – sboisse

2

जवाब ऊपर decompressors के लिए खाते में नहीं है। कोई CLSID_VideoDecompressorCategory नहीं है। फ़िल्टर होने के लिए एक तरीका है अगर यह एक वीडियो डिकंप्रेसर है?

मुझे पता नहीं है।

इस सूची में अधिकांश फ़िल्टर कोडेक हैं, इसलिए एक एन्कोडर और डिकोडर दोनों शामिल हैं।

CLSID_ActiveMovieCategories 

में फिल्टर के आसपास VFW फिल्टर स्थापित रैपर हैं।

(कुछ सॉफ्टवेयर कंपनियों ने अपने श्रेणियां बना है, इसलिए कुछ मशीनों पर 'गैर सरकारी' श्रेणियों भी हो सकते हैं) आप सभी स्थापित श्रेणियां देखने GraphEdit जो डायरेक्टशो एसडीके साथ आपूर्ति की है उपयोग करना चाहते हैं

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

1

एक और बिंदु मैं भूल गया।

विंडोज मीडिया फाउंडेशन डब्लूएमवी/डब्लूएमए का उपयोग करने के लिए टूलकिट है। यह डायरेक्टशो का समर्थन करने वाली सभी चीजें प्रदान नहीं करता है। विंडोज मीडिया के लिए यह वास्तव में केवल एक एसडीके है। डायरेक्टशो में डब्लूएमवी/डब्लूएमए में बाइंडिंग हैं, ताकि आप डायरेक्टशो एप्लिकेशन में डब्लूएम * फाइल/स्ट्रीम का उपयोग कर सकें।

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