Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
Гродненский Форум
19 Июль 2025, 21:39:50
Новости, реклама:
   Главная   Новости Гродно Помощь Игры Календарь Войти Регистрация   Меню
Страниц  :   Вниз
  Печать  
Автор Тема: Re: Видеозахват, DirectShow  (Прочитано 3703 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Старый Волк
Гость
« Ответ #0 : 05 Апрель 2012, 14:33:18 »

Тему можно закрывать. Проблема решена. Перерыв кучу интернет ссылок нашел прогу на C# для TVTuner и переделал ее под камеру, попутно переводя ее в Delphi.
Также помог Есенин С.А. (Не тот что поэтом был, а другой, автор книги "DirectX и Delphi. Разработка графических и мультимедийных приложений").
В общем вот решение проблемы - вдруг кому пригодится.

Код:
function BuildOfGraph: HResult;
begin
  ResetGraph();
  // Создаем объект для построения графа фильтров
  Result := CoCreateInstance(CLSID_FilterGraph,
                             NIL,
                             CLSCTX_INPROC_SERVER,
                             IID_IGraphBuilder,
                             FGraphBuilder);
  if FAILED(Result) then EXIT;
  // Создаем объект для построения графа захвата
  Result := CoCreateInstance(CLSID_CaptureGraphBuilder2,
                             NIL,
                             CLSCTX_INPROC_SERVER,
                             IID_ICaptureGraphBuilder2,
                             FCaptureGraphBuilder);
  if FAILED(Result) then EXIT;
  // Задаем граф фильтров для использования в построении графа захвата
  Result := FCaptureGraphBuilder.SetFiltergraph(FGraphBuilder);
  if FAILED(Result) then EXIT;
  // Получение устройтва захвата видео
  FVideoCaptureFilter := EnumerateDevices(CLSID_VideoInputDeviceCategory, VideoCaptureDeviceName, NIL, TRUE);
  if FVideoCaptureFilter <> NIL then  begin
      FGraphBuilder.AddFilter(FVideoCaptureFilter, 'VideoCaptureFilter');
      Result := FCaptureGraphBuilder.RenderStream(@PIN_CATEGORY_PREVIEW, @MEDIATYPE_Video, FVideoCaptureFilter, NIL, nil);
      if FAILED(Result) then EXIT;
      SetParamAndRouteCrossBar();
      if FVideoHandle > 0 then  begin
        FGraphBuilder.QueryInterface(IID_IVideoWindow, FVideoWindow);
        if FVideoWindow <> NIL then begin
          FVideoWindow.put_WindowStyle(WS_CHILD or WS_CLIPSIBLINGS);
          FVideoWindow.put_Owner(FVideoHandle);
          FVideoWindow.SetWindowPosition(FVideoRect.Left, FVideoRect.Top,
                                         FVideoRect.Right - FVideoRect.Left,
                                         FVideoRect.Bottom - FVideoRect.Top);
          FVideoWindow.put_Visible(TRUE);
        end;
      end;
  end;
  if FPlayed then begin
    // Запрашиваем интерфейс управления графом
    Result := FGraphBuilder.QueryInterface(IID_IMediaControl, FMediaControl);
    if FAILED(Result) then EXIT;
    // Запускаем граф
    Result := FMediaControl.Run();
  end;
end;

Основная проблема решается здесь посредством функции:

Код:
function SetParamAndRouteCrossBar(PAL_MODE: bool = true): bool;
var
   hr:  HRESULT;
   i: integer;
   pct: TPhysicalConnectorType;
   CrossBar: IUnknown;
   numOutPin, numInPin: Integer;
   nOutputVideoLink : integer;
   nInputVideoLink  : integer;
   pIdxRel : integer;
   AnalogVideoDecoder: IUnknown;
begin
    hr := FCaptureGraphBuilder.FindInterface(nil, nil, FVideoCaptureFilter, IID_IAMCrossbar, CrossBar);
    if (hr >= 0) then begin
        nOutputVideoLink := -1;
        nInputVideoLink  := -1;
        (CrossBar as IAMCrossbar).get_PinCounts(numOutPin, numInPin);
        for i := 0 to numInPin do begin
            (CrossBar as IAMCrossbar).get_CrossbarPinInfo(true, i, pIdxRel, pct);
            if (pct = PhysConn_Video_Composite) then nInputVideoLink := i;
            if (nInputVideoLink <> -1) then break;
        end;
        for i := 0 to numOutPin do begin
            (CrossBar as IAMCrossbar).get_CrossbarPinInfo(false, i, pIdxRel, pct);
            if (pct = PhysConn_Video_VideoDecoder) then nOutputVideoLink := i;
            if (nOutputVideoLink <> 1) then break;
        end;
        try
           if ((CrossBar as IAMCrossbar).Route(nOutputVideoLink, nInputVideoLink) >= 0) then result := true else result := false;
        except
           result := false;
        end
    end;
    if PAL_MODE then begin
      hr := FCaptureGraphBuilder.FindInterface(nil, nil, FVideoCaptureFilter, IID_IAMAnalogVideoDecoder, AnalogVideoDecoder);
      if hr >= 0 then begin
         if (AnalogVideoDecoder as IAMAnalogVideoDecoder).put_TVFormat(AnalogVideo_PAL_B) >= 0 then result := true else result := false;
      end else result := false;
    end;
    CrossBar := nil;
    AnalogVideoDecoder := nil;
end;

P.S. У меня просто камера выдает сигнал стандарта PAL - потому и параметр мне потребовался. Если стандарт NTSC то нужно будет предавать PAL_MODE = false.

Записан
Страниц  :   Вверх
  Печать  
 
Перейти в:  

Войти
Войдите, чтобы добавить комментарий

Войдите через социальную сеть

Имя пользователя:
Пароль:
Продолжительность сессии (в минутах):
Запомнить:
Забыли пароль?

Контакт
Powered by MySQL Powered by PHP Мобильная версия
Powered by SMF 1.1.20
SMF © 2006-2025, Simple Machines
Simple Audio Video Embedder
| Sitemap
Valid XHTML 1.0! Valid CSS!
Страница сгенерирована за 0,171 секунд. Запросов: 17.