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

    Должен отметить, что всю свою карьеру разработчика, я старался держаться подальше от платформно зависимой разработки. В этом мне помогали готовые открытые библиотеки, позволяющие абстрагироваться от платформы, такие как 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 не было альтернативы, а сейчас по моему это перебор. Разработчики, разработчики, разработчики?

    И собственно в заключение, если есть кто нибудь опытный в этом вопросе, скажите, это я так разбаловался на вольных хлебах открытых библиотек, где не в пример все удобнее и быстрее можно разобраться или это просто большая ошибка большой корпорации?
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 31

      –4
      В заголовке «оЧипятка»?
      Нашему прОигрывателю, наши же пластинки и не подходят
        +2
        Да, исправил, спасибо.
        +4
        А почему в вашем проекте нельзя использовать открытые библиотеки?

        Microsoft славится индусским кодом и API, а постоянство и стабильность — признак мастерства.
          +2
          Проект требует захвата видео с вебкамеры, в Metro style приложениях, в которых можно пользоваться только этим самым медиа фоундайшином, а его еще не в одну библиотеку не впихнули, если разберусь с ним толком, может сам оберну.
          +10
          Джоэл Сполски в свое время все правильно объяснил про глубоко неверный подход Майкрософт к API, вот тут можно почитать
          Лично я в этом вопросе вас полностью поддерживаю, так как самому не нравятся многие новинки в Win8 именно по таким причинам искусственных «выпиливаний» и запретов.
            0
            Действительно здравая статья, хотя немного устарела, в вебе уже можно делать почти все то, что там написно, как недоступное для веб приложений, а у MS появился XAML, похоже, что удобный инструмент.
              0
              Про XAML там уже есть. И .NET, как мы видим, развился. Но всё это многообразие API отталкивает, особенно когда смотришь на структурную схему архитектуры WIn8 — немного похоже на винегрет.
              –1
              >Да, это немного глупо: конечно Apple и Sun могут продавать компьютеры, но не на двух наиболее прибыльных рынках, а именно на рынках корпоративных и домашних пользователей. Aplle до сих пор где-то там внизу, с очень маленьким процентом рынка

              2005 год

              А как всё изменилось за 7 лет. Sun погибла, а вот ноутбуки с яблоком мелькают почти везде. Мобильные телефоны стали компьютерами, и MS там где-то внизу на этом рынке.
                +1
                Мелькает в фильмах потому что проплачивают (и не скрывают этого), и фраза «везде» не вяжется с реальной жизнь, где доля по всему миру 5%.
                0
                Завис на пол часа над статьей.
                Спасибо, очень интересная статейка хоть и старая
                  +3
                  Тогда советую почитать его блог или книжку с избранными статьями оттуда, называется «Джоэл о программировании».
                  Я читал книгу и не мог оторваться до самого конца — там много интересного про разработку в целом и в частности — про Майкрософт периода конца девяностых и начала нулевых.
                +2
                Суть претензий не очень понятна. Разумеется в сэмпле должна быть куча boilerplate-кода, иначе он работать не сможет.
                  +7
                  Вообще это не претензия, бог миловал, для меня это первый и последний опыт работы с подобным фреймворком.
                  И я кстати вовсе не «против» Микрософта, много лет покупаю их оси и очень люблю Visual Studio в качестве IDE, для С++, хотя последнее время больше пользуюсь QtCreator'ом т.к. он одинаковый на всех десктоп платформах.

                  А насчет примера, вот, на мой взгляд «человеческий пример пример» захвата видео.
                  #include "cv.h"
                  #include "highgui.h"
                  
                  #include "stdio.h"
                  
                  int main(int argc, char** argv) {
                  
                      CvCapture* capture = 0;
                      IplImage *frame = 0;
                  
                      if (!(capture = cvCaptureFromCAM(0)))
                          printf("Cannot initialize camera\n");
                  
                      cvNamedWindow("Capture", CV_WINDOW_AUTOSIZE);
                  
                      while (1) {
                          
                          frame = cvQueryFrame(capture);
                  
                          if (!frame)
                              break;
                                          
                          IplImage *temp = cvCreateImage(cvSize(frame->width/2, frame->height/2), frame->depth, frame->nChannels); // A new Image half size
                  
                          cvResize(frame, temp, CV_INTER_CUBIC); // Resize
                          
                          cvSmooth(temp, temp, CV_GAUSSIAN, 7, 7, 0, 0); // Real time filter: Gaussian blur
                  
                          cvSaveImage("test.jpg", temp, 0); // Save this image
                          cvSave("test.xml", temp, NULL, NULL, cvAttrList(0, 0)); // Save as xml
                  
                          cvShowImage("Capture", frame); // Display the frame
                          
                          cvReleaseImage(&temp);
                  
                          if (cvWaitKey(5000) == 27) // Escape key and wait, 5 sec per capture
                              break;
                      }
                      
                      cvReleaseImage(&frame);
                      cvReleaseCapture(&capture);
                  
                      return 0;
                  }
                  


                  Короткий и по моему, понятный.
                    +3
                    > Короткий и по моему, понятный

                    Короткий он потому, что в нём полностью отсутствует обработка ошибок и нештатных ситуаций, т.е. это типичный студенческий говнокод.
                    В примере от MS больше половины строк занимает как раз обработка нештатных ситуаций, т.е. это типичный качественный enterprise код.
                      +5
                      А мне же пример нужен, а не энтерпрайз, нам ведь как-то надо освоить это чудо. Как-то постичь обещанные удобство и простоту новых фреймворков, с которыми: «Разработка стала еще проще».
                        +6
                        У Microsoft традиция писать все примеры с обработкой ошибок, т.к. выяснилось что многие разработчики просто копипастят этот код в свои проекты.
                          +1
                          А это уже проблема «разработчиков», которые копипастят, не разбираясь. Если человек умеет программировать, то обработку ошибок и нештатных ситуаций, имея на руках грамотную документацию, он и сам сможет написать.
                          +3
                          А потом 10050 «индусов» сделают copy-paste вашего примера и ихнее приложение будет работать только при особом положении луны и во всём будут винить конечно Майкрософт.
                          Майкрософт уже несколько раз декларировала что подход к примерам(из MSDN) должен быть таким чтобы код можно было было безбоязнено скопировать.
                    0
                    Зачем, скажите на милость, разработчикам втюхивают этот Media Foundation? И почему отменили совместимость с DirectShow в Metro приложениях?


                    Metro приложения появились с выходом Windows 8, в них никогда не было DirectShow — как можно «отменить совместимость» с тем, чего никогда не было? Вы бы еще огорчились, что в PlayStation 3 отменили совместимость с WinAPI :).

                    Почему его в Metro нету — другой вопрос. Насколько я понимаю концепцию, Metro — это объединенная платформа для телифонов, планшетов, и, по остаточному принципу, десктопа. Соответственно приложение условно работает «везде». Платформа изначально телефонная, от Windows Phone 7. Вполне логичный шаг использовать на телефонной птформе, заточенной под тайлы и джаваскрипт, адаптированный под нее фреймворк. Вместо того чтобы тащить десктопный. У меня есть смутное подозрение, что взаимоействие того же javascript с directshow было бы не самым лучшим опытом для разработчиков :)
                      +1
                      Так довели бы его до ума, чем позориться. Книжку какую-то выпустили, толстенную и заранее устаревшую, в которой общие фразы типа MF это такое домино, сходятся только у которых одинаковые точки. А в примерах такое домино, что в глазах темно.
                      Вот на Андроиде к примеру — смог собрать библиотеку под Андроид — пользуйся, хоть тем же Qt. А DirectShow на 8й работает, но только в десктоп приложениях, а в метро нет. И у этого медиа фоундайшин какие-то хвосты в DirectShow лезут, а почему же в метро аппликациях на десктоп ПК им пользоваться тогда нельзя?
                        +1
                        Windows 8 — это наследник Windows 7. Настольной Windows 7.
                        Было в предке и не стало в наследнике = выпилили. Всё ж понятно и резонно, не придирайтесь к словам.

                        Делают из ежа ужа, выплёскивая в помойку все отличия… :(
                        +3
                        Все что связанно с захватом видео в Windows это, не побоюсь этого слова, позор для разработчик или скорее архитекторов из MS. Сначала VFW, потом фильтры, потом эти обертки DMO. Причем, чтобы написать простейший захват (при помощи любой из этих технологий) картинка + звук, сжатие, отправка, воспроизведение, нужно затратить неимоверные усилия, написать пару своих фильтров. На каком-то этапе обязательно будут проблемы. Кто сталкивался тот знает. Т.е. написать простенький видео чат, не вникая целиком и полностью во все аспекты разработки фильтров, не получится.
                          +1
                          с доками просто подстава… а так если разобраться удаётся — всё боле-мене логично там… Только вот разобраться по имеющимся докам — проще сдохнуть.
                        • UFO just landed and posted this here
                            0
                            Это было бы счастье, только не могу найти пока того плагина, в какой версии Qt он появился?
                            • UFO just landed and posted this here
                              • UFO just landed and posted this here
                                  0
                                  Действительно, нет для камеры обертки, но вообще обертки для wmf есть, что уже упрощает понимание. А то было одно время впечатление, что никто этот фрэймворк не трогал и не пробовал, кроме компании производителя.
                                  • UFO just landed and posted this here
                                  +1
                                  Громадное спасибо!!! Я видел у Qt back-end с DirectShow не знал что они готовят с MF. А в 5й не догадался посмотреть. Ура!!!
                              +4
                              Ну, как-бы страшного ничего особо нет. Здесь идет инициализация камеры для все возможных случаев (если я правильно понял по колбеку). Кому-то надо кадр с камеры, кому-то видео поток.
                              Если писать отдельное API для сдергивания кадра с камеры и отдельное API для получения потока кадров с заданным фреймрейтом, то будет либо куча разных функций с почти одинаковыми именами, либо отдельное API типа VfW :)
                              А если поток надо сразу перенаправиль в другой фильт, минуя буфер памяти?

                              В общем, не все так страшно.

                              Only users with full accounts can post comments. Log in, please.