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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2010, 08:21   #1
eldalex
Пользователь
 
Регистрация: 01.09.2010
Сообщений: 52
По умолчанию Работа с платой видеозахвата.

Добрый день! жизнь, в лице начальника, заставляет писать прогу, которая будет работать с платой видеозахвата и писать оттуда видео в какую нибудь avi'шку (это пока для начала, в последствии это будет превращаться в dicom и ложиться в бд, но до этого еще как до Китая пешком). проблема в том, что я даже не представляю пока как это сделать... может кто что подсказать, книгу или частично рабочий пример, хотя второе скорее всего проблематично если прога затачивается под какую нибудь конкретную плату...
eldalex вне форума Ответить с цитированием
Старый 16.09.2010, 09:47   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

1- сначала продумайте общую систему вашего видеонаблюдения
2- определитесь с железом, причем точно, что вот оно, ибо именно от него нужно будет отталкиваться как работать, какими методами, достаньте даташит на оборудование
3- советую почитать 1 2 3 4

...и уже после этого обращайтесь сюда с конкретными вопросами.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 16.09.2010, 10:43   #3
eldalex
Пользователь
 
Регистрация: 01.09.2010
Сообщений: 52
По умолчанию

наверное придется с азов начинать... говорила мне мама, не пользуйся cpp билдером! как можно скомпилить то что в архиве?(
Вложения
Тип файла: zip DXCapture_demo.zip (19.6 Кб, 33 просмотров)
eldalex вне форума Ответить с цитированием
Старый 16.09.2010, 10:47   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

вы наверно не поняли или не читали, что написал во втором посте ...вот вы кинулись в directx (directshow), а кто вам сказал, что с платой видеозахвата можно через нее работать? подтверждением оному- первая-же ссылка с поста #2 ...вы с оборудованием определитесь - это ваша наиглавнейшая и наипервейшая задача.

p.s.: изучать сопутствующие технологии - это конечно похвально
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 16.09.2010, 10:56   #5
eldalex
Пользователь
 
Регистрация: 01.09.2010
Сообщений: 52
По умолчанию

да это то понятно. проблема в том, что в данный момент я работаю с банальным tv tuner'ом AVerMedia AVerTV 507. дальше придется сорее всего работать с мед оборудованием, которое будет выдавать либо видео поток, либо сразу dicom.

Последний раз редактировалось eldalex; 16.09.2010 в 11:13.
eldalex вне форума Ответить с цитированием
Старый 16.09.2010, 12:01   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

если сейчас с тюнером, то вам в directshow податься надоть ccылки я вам уже дал, там есть примеры с directshow и не смотрите, что delphi, методы они и в си точно такие же.

компилировать ваш пример в борланд си билдере можно.
Цитата:
дальше придется сорее всего работать с мед оборудованием
первый раз слышу, что там тюнер используется и опять возвращаемся к конкретному железу.

Напишу тут, раз видимо вы по ссылкам не ходите: использование платы видеозахвата вовсе не предполагает использование directshow, с ней может быть реализована работа только через шину PCI и зависит это от оборудования, которые вы выберете ...если выбор за вами и вы уверены, что с вами тюнер то ссылки и примеры приведены, в том числе и на сайты по directshow и даже на примеры работы через системную avicap/

p.s.: кстати, а ТЗ вам четкое поставили? если вам тыкнули тюнер, а предполагается работа по совсем иным технологиям, то вы занимаетесь сизифовым трудом.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 16.09.2010 в 12:03.
raxp вне форума Ответить с цитированием
Старый 16.09.2010, 13:56   #7
eldalex
Пользователь
 
Регистрация: 01.09.2010
Сообщений: 52
По умолчанию

там с оборудования выходит видеопоток который можно принять обычным тюнером. вот собственно и задача, принять его, и сохранить для начала на диск в виде avi файла... пока, воспользовавшись примером отсюда пример я смог получить лишь зеленый экран. возможно это потому что на карте 3 входа и надо как то в них разобраться, а возможно этот пример вообще не подойдет... вобщем дерзаю
eldalex вне форума Ответить с цитированием
Старый 16.09.2010, 14:39   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

ясно, вас понял... вам нужно программно переключить при захвате входы (pin-ы) для того сигнала, который вы подаете, то ли по композитному входу, то ли по антенному и т.п. и собственно стандарт вещания PAL / SECAM (еще, вы не указали как вы подаете, может по ВЧ через антенное гнездо)

...к сожалению, у меня нет информации как это сделать средствами avicap автоматом, т.е. через vfw (video for windows) и пример для него будет работать с видеоустройством по-умолчанию.

...однако, для DirectShow они существуют. Видеозахват средствами directshow будет представлять собой:
1- построение цепочки существующих фильтров
2- установка размеров видеобуфера
3- связывание фильтров с добавлением интерфейса IID_ISampleGrabber для граба кадров из потока
4- настройка коммутатора сигналов на вход сигнала
5- настрока тюнера
6- назначение видеоокна при необходимости просмотра
7- установка TV-стандарта
8- инициализации регуляторов яркости
Код:
...
procedure Create_Graph;
Var hr         : HRESULT;
    pMoniker   : IMoniker;
    pPropBag   : IPropertyBag;
    varName    : OleVariant;
    Fetched    : LongInt;
    SysDevEnum : ICreateDevEnum;
    EnumMoniker: IEnumMoniker;
begin
 hr:= CoCreateInstance(IID_IFilterGraph, Nil, CLSCTX_INPROC, IID_IGraphBuilder, pFilterGraph);
 //
 hr:= pFilterGraph.AddFilter(pBaseFilter, Nil);

 //Будем искать TVTuner
 hr := CoCreateInstance(CLSID_SystemDeviceEnum, Nil, CLSCTX_INPROC, IID_ICreateDevEnum,SysDevEnum);
 If (hr = 0) Then
 Begin
  hr:= SysDevEnum.CreateClassEnumerator(AM_KSCATEGORY_TVTUNER,EnumMoniker,0);
  If (hr = 0) Then
   Begin
    While (EnumMoniker.Next(1,pMoniker,@Fetched) = S_OK) Do
     Begin
      pMoniker.BindToStorage(Nil, Nil, IID_IPropertyBag, pPropBag);
      pPropBag.Read('FriendlyName', varName, Nil);
      If Pos('Tuner',VarName) <> 0 Then
       pMoniker.BindToObject(Nil,Nil,IID_IAMTvTuner,pTVTuner);
      pMoniker := Nil;
      pPropBag := Nil;
     End;
    EnumMoniker := Nil;
   End;
  sysDevEnum := Nil;
 End;
 If Not Assigned(pTVTuner) Then raise Exception.Create('Unable to find TVTuner device');

 //GRAB ---
 CoCreateInstance(CLSID_SampleGrabber,nil, CLSCTX_INPROC_SERVER,IID_IBaseFilter,pTVGrabber);
 pFilterGraph.AddFilter(pTVGrabber as IBaseFilter, Nil);

 pTVGrabber.QueryInterface(IID_ISampleGrabber, pGrabberTV);
 ZeroMemory(@mtf, sizeof(AM_MEDIA_TYPE));
 mtf.majortype := MEDIATYPE_Video;
 mtf.subtype   := MEDIASUBTYPE_RGB24;
 mtf.formattype:= FORMAT_VideoInfo;
 pGrabberTV.SetMediaType(mtf);
 pGrabberTV.SetOneShot(false);
 pGrabberTV.SetBufferSamples(TRUE);
 //---
 pFilterGraph.AddFilter(pTVTuner as IBaseFilter, Nil);
 pBuilder.SetFiltergraph(pFilterGraph);
 //pBuilder.RenderStream(@PIN_CATEGORY_CAPTURE, @MEDIATYPE_Video, pBaseFilter, nil, nil);
 pBuilder.RenderStream(@PIN_CATEGORY_CAPTURE, @MEDIATYPE_Video, pBaseFilter, pTVGrabber, Nil);

end;

//grab- кадра
procedure FreeMediaType(mt: PAM_MEDIA_TYPE);
begin
 if (mt^.cbFormat <> 0) then begin
  CoTaskMemFree(mt^.pbFormat);
  //
  mt^.cbFormat:= 0;
  mt^.pbFormat:= nil
 end;
 if (mt^.pUnk <> nil) then mt^.pUnk:= nil
end;
procedure GetTV(Bitmap: TBitmap);
var hr        : HRESULT;
    BMIHeader : TBitmapInfoHeader;
    BufferSize: longint;
    AMediaType: AM_MEDIA_TYPE;
    buffer    : pointer;
    //
    BMPInfo : PBitmapInfo;
begin
 if not assigned(Bitmap) then exit;
 if not assigned(pGrabberTV) then exit;

 hr := pGrabberTV.GetConnectedMediaType(AMediaType);
 if (hr <> S_OK) then exit;
 if IsEqualGUID(AMediaType.majortype, MEDIATYPE_Video) then begin
  case Amediatype.formattype.D1 of
       $05589F80: BMIHeader:= PVideoInfoHeader(Amediatype.pbFormat)^.bmiHeader;
       $F72A76A0: BMIHeader:= PVideoInfoHeader2(Amediatype.pbFormat)^.bmiHeader;
  end;     
  ZeroMemory(BMPInfo, sizeof(TBitmapInfo));
  CopyMemory(@BMPInfo.bmiHeader, @bmiHeader, sizeof(TBITMAPINFOHEADER));

  bitmap.Handle:= CreateDIBSection(0, BMPInfo^, DIB_RGB_COLORS, buffer, 0, 0);
  HR := pGrabberTV.GetCurrentBuffer(BufferSize, buffer);
  if (hr <> S_OK) then exit;
 end;
 FreeMediaType(@AMediaType);
 buffer:= nil;
end;
можете воспользоваться пакетом DSPack, в нем есть демки и под билдер.
Вложения
Тип файла: zip tv.zip (36.7 Кб, 24 просмотров)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 16.09.2010, 14:42   #9
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

продолжение...
Код:
procedure set_TVFormat(p:bool);
var hr:HRESULT;
    pAMAnalogVideoDecoder:IAMAnalogVideoDecoder;
begin
 hr:= pBaseFilter.QueryInterface(IID_IAMAnalogVideoDecoder,pAMAnalogVideoDecoder);
 if p then hr:= pAMAnalogVideoDecoder.put_TVFormat(AnalogVideo_PAL_D)
  else hr:= pAMAnalogVideoDecoder.put_TVFormat(AnalogVideo_SECAM_D);
 //hr:= pAMAnalogVideoDecoder.put_TVFormat(AnalogVideo_NTSC_M);
 pAMAnalogVideoDecoder:=Nil
end;

procedure Set_TVTuner(ca: bool);
var Index: LongInt;
begin
 pTVTuner.put_CountryCode(380{CTRY_RUSSIA});
 Index:=0;
 //вход тюнера с Cable на Antennа
 if ca then pTVTuner.put_InputType(Index,2)
  else pTVTuner.put_InputType(Index,1) //1- кабель 2- антенна
end;
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 16.09.2010, 15:29   #10
eldalex
Пользователь
 
Регистрация: 01.09.2010
Сообщений: 52
По умолчанию

что за фигня, пытаюсь поставить DSPack на delphi2010, ставлю от 2006, есть три пакета, которые надо скомпилить. 1)directX9_D2006.dpk 2) Dspack_D2006.dpk 3) dspackDesign_D2006. первый скомпилился нормально, но хз что с ним делать и куда ложить(directX9_D2006.bpl) второй в одной из процедур выдает ошибку, там стоит result:=null, и ругается что null не знает null. по совету на одном из форумоз заменил на nil и оно выдало ошибку несоответствие типов OleVariant и Pointer. в третьем пакете ошибка аналогичная. может кто подсказать как их поставить? могу приложить пакеты, если надо...

------------добавил------------
пока писал уже ответ появился

------------добавил------------
у меня был подобный архив вот тока документации в нем не было... надо скачать DirectX9 SDK придется терпеть до дому, на работе с инетом особо не разбежишься... но завтра я вернусь с новыми вопросами!

Последний раз редактировалось eldalex; 16.09.2010 в 15:48.
eldalex вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DSPack и плата видеозахвата Yur@ Мультимедиа в Delphi 6 10.08.2010 22:21
Задача. Работа с псевдослучайными последовательностями (ПСП). Работа с цветом. 0101 Помощь студентам 3 17.12.2009 23:57
Работа с webbrowser - Фреймы, работа с конкретным феймом в фрейме NewDelphi Фриланс 2 08.10.2009 11:00