Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2009, 17:21   #1
PIKACHU
Пользователь
 
Аватар для PIKACHU
 
Регистрация: 20.10.2009
Сообщений: 23
По умолчанию DS фильтр

Как опредилить какой фильтр используется при построении цепочки, а именно фильтр кодирования, даже если на компе не установлен его ax файл.

ПС DirectShow

Последний раз редактировалось PIKACHU; 30.11.2009 в 17:24.
PIKACHU вне форума Ответить с цитированием
Старый 30.11.2009, 17:29   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

ммм... а GraphEdit не помог?
зы: правда с неустановленными не пробовал
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 30.11.2009, 18:43   #3
PIKACHU
Пользователь
 
Аватар для PIKACHU
 
Регистрация: 20.10.2009
Сообщений: 23
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
ммм... а GraphEdit не помог?
зы: правда с неустановленными не пробовал
даже если на компе не установлен его ax файл
PIKACHU вне форума Ответить с цитированием
Старый 30.11.2009, 19:36   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

Цитата:
Как опредилить какой фильтр используется при построении цепочки, а именно фильтр кодирования
так, давайте подробнее для чего чего строите, какого файла? может вам просто кодек нужно определить, который будет использоваться DS для воспроизведения файла?

ну и подробнее вникните в graphedit (позволяет определить набор фильтров, которые DirectShow использует для воспроизведения медиа файлов)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 30.11.2009 в 19:47.
raxp вне форума Ответить с цитированием
Старый 30.11.2009, 20:03   #5
PIKACHU
Пользователь
 
Аватар для PIKACHU
 
Регистрация: 20.10.2009
Сообщений: 23
По умолчанию

Да, это мне и нужно как определить какой кодек используется для воспроизвидения, понятие не имею в каком интерфейсе DSa копать.
PIKACHU вне форума Ответить с цитированием
Старый 30.11.2009, 21:10   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

при использовании менеджера графа, он сам выбирает "подходящий" кодек и строит цепочку фильтров... или вы забиваете заранее цепочку вручную и не пользуетесь CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph)? Информация же о кодеке обычно содержиться в контейнере медиафайла, смотрите в сторону - чтения хэдеров (применительно к разным типам видеофайлов и аудиофайлов их выделение будет отличаться)... даю подсказку, применительно к avi файлам копайте в сторону - TAVIFileInfo
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 01.12.2009, 12:23   #7
PIKACHU
Пользователь
 
Аватар для PIKACHU
 
Регистрация: 20.10.2009
Сообщений: 23
По умолчанию

Делаю через IGraphBuilder.RenderFile, а если нужного фильтра нет, он ругается, дак вот нужно опредилить какого фильтра ему не хватает.
PIKACHU вне форума Ответить с цитированием
Старый 01.12.2009, 12:50   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

IGraphBuilder.RenderFile идет гораздо позже менеджера графов. Вы не конкретизировали какой файл загружаете? для разных типов и определение будет отличаться
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 01.12.2009, 13:12   #9
PIKACHU
Пользователь
 
Аватар для PIKACHU
 
Регистрация: 20.10.2009
Сообщений: 23
По умолчанию

Я так думаю вы не совсем понимаете, что делает RenderFile у IGraphBuilder?
PIKACHU вне форума Ответить с цитированием
Старый 01.12.2009, 16:43   #10
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

вот код загрузки видео моего >>> directshow-плеера <<<:
Код:
function dsmpLoadFile(var _dsmp: TDSMP; _filename: string): boolean;
var _wfn: array[0..MAX_PATH-1] of wchar;
    _vis: longBool;
    _tpf: double;
begin
  Result:= false;
  //Free previous interfaces
  if Assigned(_dsmp.GraphBuilder)
    then dsmpFree(_dsmp) else dsmpReset(_dsmp);

  //Get unicode filename
  MultiByteToWideChar(CP_ACP, 0, pChar(_filename), -1, @_wfn, MAX_PATH);

  //Create interfaces and construct the graph
  with _dsmp do
    begin
      //Create DirectShow Graph //МЕНЕДЖЕР ГРАФОВ!!! АВТОМАТОМ
      if failed(CoCreateInstance(TGUID(CLSID_FilterGraph),
                                 NIL, CLSCTX_INPROC_SERVER,
                                 TGUID(IID_IGraphBuilder),
                                 GraphBuilder)) then exit;

      //--- VMR
      {if failed(CoCreateInstance(CLSID_VideoMixingRenderer,
                nil, CLSCTX_INPROC_SERVER,
                IID_IBaseFilter,pRenderer)) then exit;
      GraphBuilder.AddFilter(pRenderer, 'VideoRenderer');
      if failed(pRenderer.QueryInterface(IID_IVMRFilterConfig,
                pConfig)) then exit;
      pConfig.SetNumberOfStreams(1);
      if failed(pRenderer.QueryInterface(IID_IVMRMixerBitmap,
                pBitmap)) then exit;}
      //---

      //--- GRAB
      if failed(CoCreateInstance(CLSID_SampleGrabber,
                nil, CLSCTX_INPROC_SERVER,
                IID_IBaseFilter,pGrabberf)) then exit;
      GraphBuilder.AddFilter(pGrabberf, 'SampleGrabber');
      if failed(pGrabberf.QueryInterface(IID_ISampleGrabber,
                pGrabber)) then exit;
      //
      ZeroMemory(@mt, sizeof(AM_MEDIA_TYPE));
      mt.majortype := MEDIATYPE_Video;
      mt.subtype   := MEDIASUBTYPE_RGB32;
      mt.formattype:= FORMAT_VideoInfo;
      pGrabber.SetMediaType(mt);
      pGrabber.SetOneShot(false);
      pGrabber.SetBufferSamples(TRUE);
      //---


      //Build the filter graph
      if failed(GraphBuilder.RenderFile(_wfn, NIL)) then exit; // ПОСТРОЕНИЕ ЦЕПОЧКИ ДЛЯ ЗАГРУЗКИ

{Интерфейс IGraphBuilder имеет метод RenderFile, который получает имя файла в качестве
  параметра и, в зависимости от типа файла (которое определяется по расширению и по
  специальным сигнатурам в файле), сканирует реестр, в поисках необходимой для построения
  графа информации, создает необходимые фильтры и строит граф, предназначенный для
  воспроизведения файлов этого тип}

      //Get the IMediaControl Interface
      if failed(GraphBuilder.QueryInterface(IID_IMediaControl,
                MediaControl)) then exit;

      //Get the IMediaSeeking Interface
      if failed(GraphBuilder.QueryInterface(IID_IMediaSeeking,
                MediaSeeking)) then exit;

      //Get the IMediaEventEx Interface
      if failed(GraphBuilder.QueryInterface(IID_IMediaEventEx,
                MediaEventEx)) then exit;

      //Get Audio and Video Interfaces
      GraphBuilder.QueryInterface(IID_IBasicAudio,  BasicAudio);
      GraphBuilder.QueryInterface(IID_IBasicVideo,  BasicVideo);
      GraphBuilder.QueryInterface(IID_IVideoWindow, VideoWindow);
      //VIDEOPROC-
      {if failed(GraphBuilder.QueryInterface(IID_IAMVideoProcAmp,
                pVProcAmp)) then exit;
                IAMVideoProcAmp *pProcAmp = NULL;
      Set_VProcAmp(_dsmp);}

      //Get file info
      VideoAvail := Assigned(BasicVideo) and Assigned(VideoWindow) and
                    (not failed(VideoWindow.get_Visible(_vis)));

      //Get video info
      if VideoAvail then
        begin
          BasicVideo.GetVideoSize(VideoWidth, VideoHeight);
          BasicVideo.get_BitRate(VideoBitRate);
          BasicVideo.get_AvgTimePerFrame(_tpf);
          if _tpf <> 0 then VideoFPS:= 1 / _tpf else VideoFPS:= 0
        end;
      //Initialized
      Initialized:= true
    end;

  Result:= true
end;
вашего-же кода пока не вижу... что касается упомянутых ошибок при загрузке медиафайла - их нужно обрабатывать до и в renderfile и прерывать... учите матчасть и смотрите пример.

...то что информация о кодеке храниться в контейнере видеофайла (пост #6) - вы абсолютно проигнорировали.

При использовании менеджера графов всю работу по определению подходящего кодека и фильтров (т.е. автоматически) осуществляет сам directshow и выявить вы можете только код ошибки...
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 01.12.2009 в 16:58.
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
фильтр и список vaga Microsoft Office Access 6 05.09.2009 23:42
Фильтр пакетов Stolen Общие вопросы Delphi 0 07.02.2009 09:38
Фильтр Инночка Помощь студентам 4 30.04.2008 20:27
Фильтр и поиск emfw БД в Delphi 1 11.03.2007 11:01