Лучший способ перечислить все доступные видеокодеки в Windows?

Если нам нужно только перетасовать элементы в полностью случайном порядке (просто для смешивания элементов в списке), я предпочитаю этот простой, но эффективный код, который заказывает элементы по guid ...

var shuffledcards = cards.OrderBy(a => Guid.NewGuid()).ToList();
5
задан e-sushi 2 December 2013 в 12:53
поделиться

3 ответа

Это лучше всего обрабатывается 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 перечисляют все другие 'официальные' категории.

Я надеюсь, что это - хорошая начальная точка для Вас.

7
ответ дан 13 December 2019 в 22:20
поделиться

Ответ выше не составляет декомпрессоры. Нет никакого CLSID_VideoDecompressorCategory. Действительно ли является способом спросить фильтр, если это - видеокомпрессор?

Не то, чтобы я знаю о.

Большинство просачивается, этот список является кодеками, поэтому содержите и кодер и декодер.

Фильтры в

CLSID_ActiveMovieCategories

обертки вокруг установленных фильтров VfW.

(Некоторые компании-разработчики программного обеспечения создают свои собственные категории, таким образом, могут быть 'не официальные' категории на некоторых машинах),

Если Вы хотите видеть все установленные категории, используйте GraphEdit, который предоставляется DirectShow SDK.

Сам GraphEdit является большим инструментом для наблюдения то, что DirectShow делает под капотом. Настолько, возможно, который может быть источником большей информации о фильтрах (и их взаимодействия) в Вашей системе.

2
ответ дан 13 December 2019 в 22:20
поделиться

Другая точка я забыл.

Основа Windows Media является инструментарием для использования WMV/WMA. Это не предоставляет всем вещам тот DirectShow поддержки. Это - действительно только SDK для Windows Media. Существует привязка в WMV/WMA к DirectShow, так, чтобы можно было использовать WM* файлы/потоки в приложениях DirectShow.

1
ответ дан 13 December 2019 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: