Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DirectShow. Как воспроизвести сразу 2 видеокамеры? [D7, WinXP]


Страницы:   1 2

WondeRu ©   (2004-07-29 15:07:00) 

Есть карточка захвата! К 2-ум композитным входам подключены камеры! Написал прогу, которая вызывает IAMCrossbar PropertyPage, там можно выбрать лишь одну камеру для текущего графа!
Как одновременно воспроизвести и получить опорные кадры с этих камер???


WondeRu   (2004-08-25 15:59:00) [21]

Анонимщик ©   (25.08.04 15:32) [19]
плата дома валяется, сейчас вспомнить не могу (но отношение помню 3:1, тока не помню чего входит и чего выходит)! Вообще планировал сначала 2 камеры вешать на 2 композитных входа, но потом решил сделать на все (стандартная conexant bt 878: 2 composite, 1 tv, 1 s-video)!
Щас пытаюсь делать смотрелку для всех входов!


Анонимщик   (2004-08-25 15:32:00) [22]

WondeRu
Меня интересовали InputPins именно видео, и именно те, что соответствуют твоему выходу.
Так, вот еще увидел. Ты сначала пишешь, что у тебя два композитных входа, а затем - что четыре. Так сколько их?
Какая плата?
А количество пинов проверь с помощью вызовов нужных функций, а не на глазок.


WondeRu   (2004-08-25 14:51:00) [23]

WondeRu ©   (25.08.04 14:31) [16]
4 шт!

вообще-то не помню! )


Sapersky   (2004-08-25 14:45:00) [24]

А это вообще к чему?

Это к
WondeRu ©   (02.08.04 16:52) [9]

Вроде бы в тему? :)


WondeRu   (2004-08-25 14:31:00) [25]

Анонимщик ©   (25.08.04 11:57) [13]
сколько у тебя InputPins

4 шт!

где задержку?
у меня в коде после
if FCrossBar.RoutedInputPinsCount > 0 then
  FCrossBar.RouteNext; ????
Боюсь - там  никак! Отдельно таймер делать для переключения?


Анонимщик   (2004-08-25 13:57:00) [26]

Sapersky
А это вообще к чему?


Sapersky   (2004-08-25 13:05:00) [27]

Не знаю, как там конкретно в DirectShow, но вообще при видеозахвате имеет смысл переключать каналы после прихода очередного кадра...
То, что синхронизации нет - ну, камеры не синхронизированы, вот её и нет :)
И реалтайм с 4 каналов определённо не получится... Делим 25 FPS на 4, да ещё, если синхронизации нет, дополнительные задержки при переключении... в общем, кадра 3-4 в секунду будет.


Анонимщик   (2004-08-25 11:57:00) [28]

Щелкай где хочешь. Но потом либо делай задержку миллисекунд, скажем, 65, либо, что лучше, если у тебя карточка с родными драйверами и есть компакт с демо какими нибудь, то посмотри, как там сделан этот момент. Кстати, посмотри, сколько у тебя InputPins?


WondeRu   (2004-08-24 12:58:00) [29]

Анонимщик ©   (16.08.04 16:58) [11]
Ветку наверх.
Ну как, получилось уже?


неа! может я не в том месте переключаю каналы? где их щелкать?


Анонимщик   (2004-08-16 16:58:00) [30]

Ветку наверх.
Ну как, получилось уже?


WondeRu   (2004-08-04 09:29:00) [31]

Может кто скажет в чем ошибка, плизз!!!


WondeRu   (2004-08-02 16:52:00) [32]

Вообще муть получается!!!(((
Кадры бегают! Нет синхронизации! Иногда част ькартинки с одной камеры налазит на др камеру!

После получения очередного кадра я прорисовываю картинку (на своем месте каждый канал), затем переключаю канал!

все дрыгается!

как правильно сделать, чтобы сразу показывать все 4 канала БиТишки в реалтайме?

код:


procedure TVideoCapture.SampleGrabberBuffer(sender: TObject;
 SampleTime: Double; pBuffer: Pointer; BufferLen: Integer);
var
 BIHeader: tagBitmapInfo;
 MediaType: TAMMediaType;
 xpos, ypos, Index: Integer;
begin
 try
   FSampleGrabber.SampleGrabber.GetConnectedMediaType(MediaType);
   if IsEqualGUID(MediaType.formattype, FORMAT_VideoInfo) then
   begin
     if MediaType.cbFormat = SizeOf(TVideoInfoHeader) then  // check size
       BIHeader.bmiHeader := (PVideoInfoHeader(MediaType.pbFormat)^.bmiHeader);
   end
   else if IsEqualGUID(MediaType.formattype, FORMAT_VideoInfo2) then
   begin
     if MediaType.cbFormat = SizeOf(TVideoInfoHeader2) then  // check size
       BIHeader.bmiHeader := (PVideoInfoHeader2(MediaType.pbFormat)^.bmiHeader);
   end;
 finally
   FreeMediaType(@MediaType);
 end;

 Canvas.Lock;
 try
   try
     SetStretchBltMode(Canvas.Handle, COLORONCOLOR);
     with BIHeader.bmiHeader do
       begin
         Index := FCrossbar.InputCrossbarPins[FCrossbar.RoutedInputPins[FCrossBar.NowRoute].PinIndex].PinIndex;

         xpos := (Index mod 2) * (biWidth div 2 + 5);
         ypos := (Index div 2) * (biHeight div 2 + 5);

         StretchDIBits(Canvas.Handle,
                       xpos,
                       ypos,
                       biWidth div 2,
                       biHeight div 2,
                       0,
                       0,
                       biWidth,
                       biHeight,
                       pBuffer,
                       BIHeader,
                       DIB_RGB_COLORS,
                       SRCCOPY);
       end;
   except
   end;
 finally
   Canvas.Unlock;
 end;
 
 //переключение камер
 if FCrossBar.RoutedInputPinsCount > 0 then
   FCrossBar.RouteNext;
end;


Анонимщик   (2004-07-30 13:20:00) [33]

Пожалуйста.


WondeRu   (2004-07-30 13:17:00) [34]

Анонимщик, спасибо БОЛЬШОЕ за помощь!
Кстати, а где твоя анкета?


Анонимщик   (2004-07-30 13:08:00) [35]

Прав.
FIAMStreamConfig - для конфигурирования
FIAMVideoProcAmp - для получения/установки, например, яркости-контраста и т.д.
FIAMCrossBar - для переключения каналов (Route и get_IsRoutedTo)
FIAMAnalogVideoDecoder - для установки PAL/SECAM и т.д.
FICustomCameraProp - это выброси вообще, специфично для той карточки, что я использую
Более подробно читай в хелпе по интерфейсам и функциям.


WondeRu   (2004-07-30 13:04:00) [36]

Для моего случая я думаю можно отставить только создание
FIAMCrossBar и RenderStream. Я прав?

Если не сложно прокомментируй каждый FindInterface в 2-х словах. Что для чего? это так, для общего развития!


Анонимщик   (2004-07-30 12:53:00) [37]

Одна микросхема, значит - коммутация.

// пример, когда все создается в run-time:
// код пишу весь подряд, посмотри, кстати, тут кое-чего
// тебе сразу и не нужно, но потом пригодится

 FFilterGraph   := TFilterGraph.Create(nil);
 FFilter        := TFilter.Create(nil);
 FSampleGrabber := TSampleGrabber.Create(nil);

 FSampleGrabber.OnBuffer := NewPictureEvent; (* обработкой у меня эта пройедура занимается *)
 FFilterGraph.Mode := gmCapture;
 FFilter.FilterGraph := FFilterGraph;
 FSampleGrabber.FilterGraph := FFilterGraph;
 FFilterGraph.ClearGraph;
 FFilterGraph.Active := false;
 FFilter.BaseFilter.Moniker := AMoniker; (* об этом моникере сам позаботься следующим образом:
SysDev := TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);
for i := 0 to SysDev.CountFilters - 1 do
begin
  SysDev.GetMoniker(i); // этот твои моникеры
end;
*)

 FFilterGraph.Active := true;

(FFilterGraph as ICaptureGraphBuilder2).FindInterface
       (
       nil,
       nil,
       FFilter as IBaseFilter,
       IID_IAMStreamConfig,
       FIAMStreamConfig
       );

(FFilterGraph as ICaptureGraphBuilder2).FindInterface
       (
       nil,
       nil,
       FFilter as IBaseFilter,
       IID_IAMVideoProcAmp,
       FIAMVideoProcAmp
       );

 (FFilterGraph as ICaptureGraphBuilder2).FindInterface
       (
       @LOOK_UPSTREAM_ONLY,
       nil,
       FFilter as IBaseFilter,
       IID_IAMCrossBar,
       FIAMCrossBar);

 (FFilterGraph as ICaptureGraphBuilder2).FindInterface
       (
       nil,
       nil,
       FFilter as IBaseFilter,
       IID_IAMAnalogVideoDecoder,
       FIAMAnalogVideoDecoder
       );

 (FFilterGraph as ICaptureGraphBuilder2).FindInterface
   (
   @PIN_CATEGORY_CAPTURE,
   @MEDIATYPE_Video,
   FFilter as IBaseFilter,
   PROPSETID_VIDCAP_CUSTOMBT848,
   FICustomCameraProp
   );

 (FFilterGraph as ICaptureGraphBuilder2).RenderStream
   (
   @PIN_CATEGORY_PREVIEW{@PIN_CATEGORY_CAPTURE},
   nil,
   FFilter as IBaseFilter,
   nil,
   FSampleGrabber as IBaseFilter
   );

FFilterGraph.Play;

В процедуре NewPictureEvent вызываешь процедуру
FSampleGrabber.GetBitmap(tmpBitmap, Buffer, BufferLen);

Что неясно?


WondeRu   (2004-07-30 12:24:00) [38]

2Анонимщик ©
Одна микросхема!

Другой вопрос: Я работаю в режиме Preview! А как сделать так, чтобы картинка не показывалась, т.е. картинка шла в какой-нить буфер, а затем бы я его прорисовывал в зависимости от камеры на две области?

Использую компоненты DSPack, картинка выводится с помощью TVideoWindow! если нет его на форме, то граф создает свое окно и выводит картинку туда!


Анонимщик   (2004-07-29 17:58:00) [39]

Забыл спросить. Сколько у тебя на карточке микросхем bt8xx? Если одна, то делать нужно так, как я сказал. Если две, тогда можно и "одновременно".


Анонимщик   (2004-07-29 17:57:00) [40]

Одновременно никак, у тебя ведь каналы коммутируемые. Делай что-то вроде IAMCrossBar.Route(0, 0) получай с одного канала, потом IAMCrossBar.Route(0, 1) - с другого.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо