أفضل طريقة لتعداد كافة برامج ترميز الفيديو المتاحة على نظام التشغيل Windows؟

StackOverflow https://stackoverflow.com/questions/30539

  •  09-06-2019
  •  | 
  •  

سؤال

أنا أبحث عن طريقة جيدة لتعداد جميع برامج ترميز الفيديو الموجودة على جهاز يعمل بنظام التشغيل Windows XP/Vista.

أحتاج إلى تقديم مجموعة من برامج ترميز الفيديو للمستخدم، بما في ذلك الضواغط وفك الضغط.سيبدو الإخراج شيء من هذا القبيل

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. يمكنك تعداد جميع برامج إلغاء الضغط باستخدام DirectShow، لكن هذا لا يخبرك بشيء عن الضواغط (أجهزة التشفير).
  2. يمكنك تعداد كافة مكونات Video For Windows، لكن لن تحصل على أي إشارة إلى ما إذا كانت هذه المكونات عبارة عن وحدات تشفير أو وحدات فك ترميز.
  3. هناك مرشحات DirectShow يمكنها القيام بهذه المهمة بشكل جيد (مرشح Motion JPEG على سبيل المثال)، ولكن لا يوجد ما يشير إلى أن مرشح DirectShow معين هو "وحدة فك ترميز الفيديو".

هل وجد أي شخص حلاً عامًا لهذه المشكلة باستخدام أي من واجهات برمجة تطبيقات Windows؟هل ويندوز فيستا واجهة برمجة تطبيقات مؤسسة الوسائط حل أي من هذه القضايا؟

هل كانت مفيدة؟

المحلول

من الأفضل التعامل مع هذا بواسطة DirectShow.

يعد DirectShow حاليًا جزءًا من النظام الأساسي SDK.

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

يقوم الاستدعاء التالي بتعداد جميع ضواغط الفيديو على وحدة التحكم:

enumerateDShowFilterList( CLSID_VideoCompressorCategory );

صفحة MSDN فئات التصفية يسرد جميع الفئات "الرسمية" الأخرى.

آمل أن تكون هذه نقطة انطلاق جيدة بالنسبة لك.

نصائح أخرى

الإجابة أعلاه لا تأخذ في الاعتبار برامج إلغاء الضغط.لا توجد فئة CLSID_VideoDecompressorCategory.هل هناك طريقة لسؤال المرشح عما إذا كان برنامج إلغاء ضغط الفيديو؟

ليس هذا ما أعلمه عن.

معظم عوامل التصفية في هذه القائمة عبارة عن برامج ترميز، لذا تحتوي على برنامج تشفير ووحدة فك ترميز.

المرشحات في

CLSID_ActiveMovieCategories

يتم تثبيت أغلفة حول مرشحات VfW.

(تقوم بعض شركات البرمجيات بإنشاء فئات خاصة بها، لذلك قد تكون هناك فئات "غير رسمية" على بعض الأجهزة)

إذا كنت تريد رؤية جميع الفئات المثبتة، فاستخدم GraphEdit المتوفر مع DirectShow SDK.

يعد GraphEdit بحد ذاته أداة رائعة لمعرفة ما يفعله DirectShow تحت الغطاء.لذلك ربما يكون هذا مصدرًا لمزيد من المعلومات حول المرشحات (وتفاعلاتها) على نظامك.

نقطة أخرى نسيتها.

Windows Media Foundation عبارة عن مجموعة أدوات لاستخدام WMV/WMA.لا يوفر كل الأشياء التي يدعمها DirectShow.إنها في الحقيقة مجرد SDK لـ Windows Media.توجد روابط في WMV/WMA إلى DirectShow، بحيث يمكنك استخدام ملفات/تدفقات WM* في تطبيقات DirectShow.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top