2008-08-27 33 views
5

Tôi đang tìm một cách tốt để liệt kê tất cả các codec Video trên máy tính Windows XP/Vista.Cách tốt nhất để liệt kê tất cả các codec video có sẵn trên Windows?

Tôi cần trình bày cho người dùng một bộ codec video, bao gồm cả máy nén và bộ giải nén. Đầu ra sẽ trông giống như

 
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 

Vấn đề mà tôi đang gặp phải là không có cách nào đáng tin cậy để nắm bắt tất cả bộ giải mã có sẵn cho hệ thống. Ví dụ:

  1. Bạn có thể liệt kê tất cả các bộ giải nén bằng DirectShow, nhưng điều này không cho bạn biết gì về máy nén (bộ mã hóa).
  2. Bạn có thể liệt kê tất cả các thành phần Video cho Windows, nhưng bạn sẽ không nhận được chỉ báo nếu đây là bộ giải mã hoặc bộ giải mã.
  3. Có bộ lọc DirectShow có thể thực hiện công việc cho bạn một cách hoàn hảo (ví dụ như bộ lọc Motion JPEG), nhưng không có dấu hiệu cho thấy bộ lọc DirectShow cụ thể là "bộ giải mã video".

Có ai đã tìm thấy giải pháp tổng quát cho vấn đề này bằng bất kỳ API Windows nào không? Windows Vista Media Foundation API có giải quyết được bất kỳ vấn đề nào trong số này không?

Trả lời

6

Điều này được xử lý tốt nhất bởi DirectShow.

DirectShow hiện là một phần của SDK nền tảng.

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; 
} 

Cuộc gọi sau đây liệt kê tất cả các máy nén video sang giao diện điều khiển:

enumerateDShowFilterList(CLSID_VideoCompressorCategory); 

Trang MSDN Filter Categories liệt kê tất cả các loại 'chính thức'.

Tôi hy vọng đó là điểm khởi đầu tốt cho bạn.

+0

Tôi có thể thêm thông tin sau: http://msdn.microsoft.com/en-us/library/windows/desktop/dd375655(v=vs.85).aspx ". Ở cuối trang, nó gợi ý rằng danh mục CLSID_LegacyAmFilterCategory sẽ là danh mục chứa DMO có thể truy cập bởi DirectShow dưới dạng bộ giải nén âm thanh và trình giải nén video. – sboisse

2

Câu trả lời ở trên không giải thích cho bộ giải nén. Không có CLSID_VideoDecompressorCategory. Có phải là một cách để hỏi một bộ lọc nếu nó là một bộ giải nén video?

Tôi không biết.

Hầu hết các bộ lọc trong danh sách này là codec, do đó, chứa cả bộ mã hóa và bộ giải mã.

Các bộ lọc trong

CLSID_ActiveMovieCategories 

là hàm bao quanh các bộ lọc VfW phiền cài đặt.

(Một số công ty phần mềm tạo các danh mục riêng của họ, do đó có thể loại 'chính thức phi' trên một số máy)

Nếu bạn muốn xem tất cả các loại cài đặt, sử dụng GraphEdit mà được cung cấp với DirectShow SDK.

GraphEdit chính nó là một công cụ tuyệt vời để xem DirectShow làm gì dưới mui xe.Vì vậy, có thể đó có thể là nguồn thông tin thêm về các bộ lọc (và tương tác của chúng) trên hệ thống của bạn.

1

Một điểm khác mà tôi đã quên.

Windows Media Foundation là bộ công cụ để sử dụng WMV/WMA. Nó không cung cấp tất cả những thứ mà DirectShow hỗ trợ. Nó thực sự chỉ là một SDK cho Windows Media. Có các ràng buộc trong WMV/WMA đến DirectShow, để bạn có thể sử dụng các tệp/luồng WM * trong các ứng dụng DirectShow.

Các vấn đề liên quan