На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
  
> Вопрос по DirectShow. , Где ошибка ?
    ОС - WinMe.
    Компилятор - MSVC++ 6.0 + SP5
    Нашел на одном сайте (кому интересно - http://fisherus-prime.hotbox.ru) пример, как проиграть MP3-файл с помощью DirectShow.
    ExpandedWrap disabled
      CoInitialize(NULL);
      // интерфейсы
      IGraphBuilder *piGraphBuilder; // граф
      IMediaControl *piMediaControl; // управление воспроизведением
      IBasicAudio   *piBasicAudio;   // управление звуком
      IMediaEventEx *piMediaEventEx; // получение состояния графа
      IMediaPosition *piMediaPosition;
      // Инициализация
      if((CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder,
      (void **)&piGraphBuilder)))
      {
          piGraphBuilder->QueryInterface(IID_IMediaControl, (void **)&piMediaControl);
          piGraphBuilder->QueryInterface(IID_IBasicAudio, (void **)&piBasicAudio);
          piGraphBuilder->QueryInterface(IID_IMediaEventEx, (void **)&piMediaEventEx);
          piGraphBuilder->QueryInterface(IID_IMediaPosition, (void **)&piMediaPosition);
      }
      //подготавливаем путь к файлу
      WCHAR wcFile[MAX_PATH];
      char* szFileName = "c:\\Мои документы\\Какой-то файл.mp3";
      if (MultiByteToWideChar(CP_ACP,0,szFileName,-1,wcFile,MAX_PATH))
      {   //строим граф
          piGraphBuilder->RenderFile(wcFile,NULL);
      }
      // воспроизводим
      piMediaControl->Run();
       
      // освобождаем все
      piMediaControl->Release();
      piBasicAudio->Release();
      piMediaEventEx->Release();
      piMediaPosition->Release();
      piGraphBuilder->Release();
       
      CoUninitialize();

    Так, как в этом примере ничего не было сказано о том, что нужно подключить для доступа к DirectShow, то я методом тыка и поиска в файлах нашел следующее, с чем этот код стал компилиться:
    ExpandedWrap disabled
      #include "amstream.h"
      #include "control.h"
      #include "uuids.h"

    и в настройках проекта
    Link -> General -> Object\Library modules добавил: strmiids.lib
    а так же добавил CoInitialize(NULL) и CoUninitialize().
    После этого все стало нормально компилиться, но при выполнении происходит ошибка в программе и после выбора Отладки: "Unhandled exception .... Access Violation" и тычет стрелочкой на
    piMediaControl->Run();
    Че делать ? Наверно я не все подключил ?
      правильно ли отработал QueryInterface на piMediaControl?
      что возращает RenderFile?

      у тебя этих проверок нет - поэтому непонятно.
        Ага, понял. Пойду проверять.
          добрый день тоже появилась потребность играть .mp3-шки
          пытаюсь так:
          ExpandedWrap disabled
                CoInitialize(NULL);
             
                IGraphBuilder* graphBuilder;
                if (CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&graphBuilder) == S_OK)
                {
                    CComPtr<IMediaControl> mediaControl;
                    HRESULT result = graphBuilder->QueryInterface(IID_IMediaControl, (void **)&mediaControl);
                    CComPtr<IBasicAudio> basicAudio;
                    result = graphBuilder->QueryInterface(IID_IBasicAudio, (void **)&basicAudio);
                    CComPtr<IMediaEventEx> mediaEventEx;
                    result = graphBuilder->QueryInterface(IID_IMediaEventEx, (void **)&mediaEventEx);
                    CComPtr<IMediaPosition> mediaPosition;
                    result = graphBuilder->QueryInterface(IID_IMediaPosition, (void **)&mediaPosition);
             
                    //подготавливаем путь к файлу
                    WCHAR wcFile[MAX_PATH];
                    char* szFileName = "c:\\Workspace\\test2.mp3";
                    if (!MultiByteToWideChar(CP_ACP,0,szFileName,-1,wcFile,MAX_PATH))
                        return;
             
                    result = graphBuilder->RenderFile(wcFile, NULL);
                    result = mediaControl->Run();
             
                    bool stop = true;
                }
             
                CoUninitialize();

          все функции (кроме mediaControl->Run();) возвращают S_OK. mediaControl->Run() возвращает S_FALSE.
          что это может быть/как лечить?
            почему возникает ошибка unresolved external symbol _IID_IMediaControl (в Test.obj) и как с ней бороться??????
              Цитата Ninetta @
              почему возникает ошибка unresolved external symbol _IID_IMediaControl (в Test.obj) и как с ней бороться??????

              Бороться с ней посредством включения strmiids.lib в проект
                спасибо огромное!!!
                а можно ещё вопрос по DirectShow и MFC?
                мне надо чтобы видео с веб-камеры проигрывалось в окне приложения, где взять хэндл окна?
                пишу и ничего не происходит:
                void CTestApp::Run()
                {

                HRESULT hr;

                IGraphBuilder *pGraph = NULL;
                ICaptureGraphBuilder2 *pBuild = NULL;

                IBaseFilter *pCapture = NULL;

                ICreateDevEnum *pDevEnum = NULL;
                IEnumMoniker* pEnum = NULL;
                IMoniker* pMoniker = NULL;

                IMediaControl * pMediaControl(NULL);
                IMediaEventEx * pEvent(NULL);

                IVideoWindow *pVidWin = NULL;
                OAHWND hWnd;

                hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
                if(SUCCEEDED(hr))
                {

                hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuild );
                if (SUCCEEDED(hr))
                {

                hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph);
                if (SUCCEEDED(hr))
                {

                pBuild->SetFiltergraph(pGraph);

                hr = CoCreateInstance(CLSID_SystemDeviceEnum, 0, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (LPVOID*)&pDevEnum);

                if(SUCCEEDED(hr))
                {


                hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnum, 0);

                if(SUCCEEDED(hr))
                {
                if( pEnum->Next(1, &pMoniker,0) == S_OK )
                {
                hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void **)&pCapture);


                if(SUCCEEDED(hr))
                {
                pGraph->AddFilter(pCapture, L"Capture Filter");
                hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCapture, NULL, NULL);
                pDevEnum->Release();
                pEnum->Release();
                pMoniker->Release();

                *pVidWin = NULL;


                pGraph->QueryInterface(IID_IVideoWindow, (void **)&pVidWin);

                pVidWin->put_Owner((OAHWND)hWnd);

                pVidWin->put_WindowStyle( WS_CHILD | WS_CLIPSIBLINGS );

                pVidWin->put_Left(0);
                pVidWin->put_Top(0);
                pVidWin->put_Width(640);
                pVidWin->put_Height(480);


                pGraph->QueryInterface(IID_IMediaEventEx, (void **)&pEvent);
                pEvent->SetNotifyWindow((OAHWND)hWnd, 0, 0);


                pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);
                pMediaControl->Run();

                }
                else
                pBuild->Release();

                }
                }
                }
                }
                }
                }
                //------------------------------------------------------------------------------------------------
                }
                Сообщение отредактировано: Ninetta -
                  Цитата Ninetta @
                  мне надо чтобы видео с веб-камеры проигрывалось в окне приложения

                  Передай сюда хендл желаемого окна
                  Цитата Ninetta @
                  pVidWin->put_Owner((OAHWND)hWnd);

                  Цитата Ninetta @
                  где взять хэндл окна?

                  Странный вопрос. CWnd::m_hWnd требуемого окна, либо AfxGetApp()->m_pMainWnd
                    спасибо!
                    а можно ещё очень глупый последний (надеюсь) вопрос -
                    где мне вызвать метод CTestApp::Run(), я его вызывала в конце метода CTestApp::InitInstance(), но он у меня в него не заходит((
                      пишу pVidWin->put_Owner((OAHWND)AfxGetApp()->m_pMainWnd);
                      и не работает.
                      походу не определяет AfxGetApp(), это почему?
                        Цитата Ninetta @
                        где мне вызвать метод CTestApp::Run(), я его вызывала в конце метода CTestApp::InitInstance(), но он у меня в него не заходит((

                        А из какого примера это все взято? Как ты оформила проект? Сдается мне, там много ошибок. Приведи сюда весь проект целиком
                          я без примера - просто создала проект MFC Dialog Based
                          и попробовала переопределить ф-ю Run

                          кстати когда пришу в файле TestDlg например в функции CTestDlg::OnPaint() всё то же самое, то воспроизводит видео (так что в этом коде ошибок нет), но не в нужном окне.

                          короче вопрос такой - где написать вот этот весь код для вывода видео с веб-камеры?

                          и я кстати исправила как вы сказали: pVidWin->put_Owner((OAHWND)AfxGetApp()->m_pMainWnd);
                          Сообщение отредактировано: Ninetta -
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0325 ]   [ 15 queries used ]   [ Generated: 19.04.24, 23:51 GMT ]