Нашему проигрывателю, наши же пластинки и не подходят

в 8:37, , рубрики: directshow, microsoft, Я негодую, метки: ,

Должен отметить, что всю свою карьеру разработчика, я старался держаться подальше от платформно зависимой разработки. В этом мне помогали готовые открытые библиотеки, позволяющие абстрагироваться от платформы, такие как Qt, WxWidgets, SDL, ACE и. т.д. Драйвера мне писать не приходилось, но для достаточно сложных приложений и систем этого подхода вкупе с С++ и одного, другого динамического языка хватало с лихвой.

Но вот судьба послала клиента, благодаря которому, я столкнулся со следующей проблемой — переезд с DirectShow на Media Foundation. Оба фреймворка предназначены для работы с различными аудио/видео, медиа форматами, кодеками, потоками и т.д. Media Foundation должен постепенно заменить DirectShow и остаться главным и единственным. В новой Windows 8, метро приложения с DirectShow не работают. Собственно это и явилось поводом для переезда. С DirectShow я сталкивался лет 10 назад, для запихивания видео в текстуры на ходу, он мне не понравился, но как то мы с ним справились. И, насколько мне известно, это устоявшийся, хорошо изученный фреймворк, который поддерживается в качестве backend многими проектами, такими как VideoLAN, ffmpeg, phonon и т.д.

А теперь собственно плач Ярославны. Зачем, скажите на милость, разработчикам втюхивают этот Media Foundation? И почему отменили совместимость с DirectShow в Metro приложениях? Чтобы разобраться в этом Media Foundation надо потратить кучу времени, потому что вменяемых примеров и документации попросту нет! Вот пример который захватывает видео в файл, который еще надо найти как скачать. В примере больше тысячи строк кода, написанных в жутком нечеловеческом формате. Как вынести оттуда навыки работы с именно Media Foundation? А вот кусочек кода из примера, который показывает захваченный с камеры поток:

HRESULT CaptureManager::SetDevice(HWND hwndPreview, IUnknown *pUnkVideo)
{
    DestroyCaptureEngine();

    m_pCallback = new (std::nothrow) CaptureEngineCB(m_hwndEvent);
    if (m_pCallback == NULL)
    {
        return E_OUTOFMEMORY;
    }

    m_hwndPreview = hwndPreview;

    //Create a D3D Manager
    HRESULT hr = CreateD3DManager();

    IMFAttributes *pAttributes = NULL;
    if(SUCCEEDED(hr))
    {
        hr = MFCreateAttributes(&pAttributes, 1); 
    }

    if(SUCCEEDED(hr))
    {
        hr = pAttributes->SetUnknown(MF_CAPTURE_ENGINE_D3D_MANAGER, g_pDXGIMan);
    }

    // Create the factory object for the capture engine.
    IMFCaptureEngineClassFactory *pFactory = NULL;
    if(SUCCEEDED(hr))
    {
        hr = CoCreateInstance(CLSID_MFCaptureEngineClassFactory, NULL, 
            CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pFactory));
    }       

    if (SUCCEEDED(hr))
    {
        // Create and initialize the capture engine.
        hr = pFactory->CreateInstance(CLSID_MFCaptureEngine, IID_PPV_ARGS(&m_pEngine));
        if (SUCCEEDED(hr))
        {
            hr = m_pEngine->Initialize(m_pCallback, pAttributes, NULL, pUnkVideo);
        }
        pFactory->Release();
        pAttributes->Release();
    }    
    return hr;
}

Это только маленький кусочек, «который непонятно как» назначает устройство.
21 век на дворе, как с таким чудищем жить?

Или вот пример документации. Что можно из него понять про интерфейс IAdvancedMediaCaptureInitializationSettings? Что он «Provides initialization settings for advanced media capture»? Круто, а что еще? Название интерфейса очень многообещающее. Метод какой-нибудь у него есть? Народ спешит и торопится выпустить приложения под новую ось, сколько хребтов поломается об такие инструменты разработки? А симулировать веб камеру стало возможно толъко написав драйвер, при том что в DirectShow можно было обойтись фильтром. Когда я видел подобные фреймворки в 90е, у Windows не было альтернативы, а сейчас по моему это перебор. Разработчики, разработчики, разработчки?

И собственно в заключение, если есть кто нибудь опытный в этом вопросе, скажите, это я так разбаловался на вольных хлебах открытых библиотек, где не в пример все удобнее и быстрее можно разобраться или это просто большая ошибка большой корпорации?

Автор: plushechnik

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js