Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.12;
Скачать: CL | DM;

Вниз

Если стоят две карты(TVTuner) с видеовходом ...   Найти похожие ветки 

 
palgen ©   (2005-09-09 14:02) [0]

Использую DSPack. Как мне поступить в случае, когда у меня стоят две карты и на них подаётся два разных видеосигнала, которые нужно отобразить? Использовать для каждой карты отдельно VideoWindow, FilterGraph и Filter? Или как-то по другому можно?


 
palgen ©   (2005-09-09 14:06) [1]

Желательно кодом ...


 
Дмитрий Белькевич   (2005-09-11 20:06) [2]

Лови: добыто собственноручно, после кучи геморроя. Много не тестил, но везде, где тестил - работало. Если кто чего поправит - буду признателен.

procedure TfrmMainCapture.SelectDevice(DeviceNum: integer);
var
hR: HRESULT;
StreamConf: IAMStreamConfig;
pmt: PAMMediaType;
pvi: PVideoInfoHeader;
begin
if DeviceNum < 0 then
 exit;
FilterGraph.ClearGraph;
FilterGraph.Active := false;
Filter.BaseFilter.Moniker := SysDev.GetMoniker(DeviceNum);
FilterGraph.Active := true;

with FilterGraph as ICaptureGraphBuilder2 do
 hR := FindInterface(@LOOK_UPSTREAM_ONLY, nil, Filter as IBaseFilter, IID_IAMCrossbar, CrossBar);
if (SUCCEEDED(hr)) then
begin
 with Crossbar as IAMCrossbar do
  if Succeeded(CanRoute(0, VideoCaptureDeviceInputIndex)) then
   Route(0, VideoCaptureDeviceInputIndex);
end;

with FilterGraph as ICaptureGraphBuilder2 do
 RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter, SampleGrabber as IBaseFilter, DSVideoWindowEx1 as
  IbaseFilter);

with FilterGraph as ICaptureGraphBuilder2 do
 hR := FindInterface(@PIN_CATEGORY_PREVIEW, @MEDIATYPE_Video, Filter as IBaseFilter, IID_IAMStreamConfig, StreamConf);
if SUCCEEDED(hr) then
 if SUCCEEDED(StreamConf.GetFormat(pmt)) then
 begin
  pvi := pmt.pbFormat;
  pvi.bmiHeader.biWidth := VideoCaptureResX;
  pvi.bmiHeader.biHeight := VideoCaptureResY;
  if not (SUCCEEDED(StreamConf.SetFormat(pmt^))) then
   ShowMessage(rsCannotSetVideoFrm);
 end;
FilterGraph.Play;
end;


 
palgen ©   (2005-09-12 07:15) [3]

а можно поподробнее об элементах на форме, о функциях данного кода ? как я понял, здесь отображается один из двух видеосигналов ... а можно ли отображать два одновременно ?
зараннее благодарен


 
Дмитрий Белькевич   (2005-09-14 03:27) [4]

На форме лежит DSVideoWindowEx1 типа TDSVideoWindowEx - окно просмотра.
Лежит FilterGraph типа TFilterGraph, лежит Filter типа TFilter. Лежит SampleGrabber типа TSampleGrabber - захватываю им отдельные картинки.
SampleGrabber, Filter, DSVideoWindowEx1 привязаны к FilterGraph.
Смотри - там всё в примерах есть. Единственное - с кроссбаром пришлось  повозиться.


 
palgen ©   (2005-09-22 07:46) [5]

хелп ми ... С одной картой всё работает, а вот с двумя не хочет. Что можно сделать ?


 
palgen ©   (2005-09-22 08:02) [6]

я использую следующий код
//=========================================================
FilterGraph.ClearGraph;      
FilterGraph.Active := false;
Filter.BaseFilter.Moniker := SysDev.GetMoniker(TMenuItem(Sender).tag);
FilterGraph.Active := true;
with FilterGraph as ICaptureGraphBuilder2 do
         RenderStream(@PIN_CATEGORY_CAPTURE, nil, Filter as IBaseFilter, SampleGrabber as IBaseFilter, VideoWindow as IbaseFilter);      
SetVideoParams(FilterGraph as ICaptureGraphBuilder2, PIN_CATEGORY_CAPTURE, Filter as IBaseFilter);
FilterGraph.Play;
//========================================================
SetVideoParams - это функция меняет разрешение ...
Когда пробую подключать вторую карту, то ругается "Interfase not supported"
Вот код ... (неработающий)
//========================================================
FilterGraph.ClearGraph;
     FilterGraph1.ClearGraph;
     FilterGraph.Active := false;
     FilterGraph1.Active := false;
     Filter.BaseFilter.Moniker := SysDev.GetMoniker(TMenuItem(Sender).tag);
     Filter1.BaseFilter.Moniker := SysDev.GetMoniker(TMenuItem(Sender).tag + 1);
     FilterGraph.Active := true;
     FilterGraph1.Active := true;
     with FilterGraph as ICaptureGraphBuilder2 do
         RenderStream(@PIN_CATEGORY_CAPTURE, nil, Filter as IBaseFilter, SampleGrabber as IBaseFilter, VideoWindow as IbaseFilter);
     with FilterGraph1 as ICaptureGraphBuilder2 do
         RenderStream(@PIN_CATEGORY_CAPTURE, nil, Filter1 as IBaseFilter, SampleGrabber1 as IBaseFilter, VideoWindow1 as IbaseFilter);
     SetVideoParams(FilterGraph as ICaptureGraphBuilder2, PIN_CATEGORY_CAPTURE, Filter as IBaseFilter);
     SetVideoParams(FilterGraph1 as ICaptureGraphBuilder2, PIN_CATEGORY_CAPTURE, Filter1 as IBaseFilter);
FilterGraph.Play;
FilterGraph1.Play;


 
palgen ©   (2005-09-22 08:02) [7]

Если кто подскажет буду очень благодарен !


 
palgen ©   (2005-09-22 08:31) [8]

при запуске второго устройства ругается на строке
//=======================================================
with FilterGraph1 as ICaptureGraphBuilder2 do
         RenderStream(@PIN_CATEGORY_CAPTURE, nil, Filter1 as IBaseFilter, SampleGrabber1 as IBaseFilter, VideoWindow1 as IbaseFilter);


 
palgen ©   (2005-09-22 10:44) [9]

А что здесь такое IBaseFilter ?


 
palgen ©   (2005-09-22 15:00) [10]

кто-нибудь ...


 
Дмитрий Белькевич   (2005-09-25 16:05) [11]

>"Interfase not supported"
Какой-то из интерфейсов не поддерживается карточкой, либо неправильно установлены дрова.

>при запуске второго устройства ругается на строке
Как ругается?

>SetVideoParams - это функция меняет разрешение ...

Полный код приведи.

>Когда пробую подключать вторую карту, то ругается "Interfase not supported"

См. Выше.

>Вот код ... (неработающий).

Где конретно валится?

IBaseFilter - интерфейс, описан в DirectShow9.pas, нажми же ctrl+mouse:

 IBaseFilter = interface(IMediaFilter)
   ["{56A86895-0AD4-11CE-B03A-0020AF0BA770}"]
   (*** IBaseFilter methods ***)
   function EnumPins(out ppEnum: IEnumPins): HResult; stdcall;
   function FindPin(Id: PWideChar; out ppPin: IPin): HResult; stdcall;
   function QueryFilterInfo(out pInfo: TFilterInfo): HResult; stdcall;
   function JoinFilterGraph(pGraph: IFilterGraph; pName: PWideChar): HResult; stdcall;
   function QueryVendorInfo(out pVendorInfo: PWideChar): HResult; stdcall;
 end;


 
palgen ©   (2005-09-30 07:53) [12]

Спасибо за помошь ! я разобрался в чём было дело - код правильный, не была произведена инициализация второго VideoWindows.
А вот код функции SetVideoParams - она рабочая.
//========================================================
function SetVideoParams(CB_B2: ICaptureGraphBuilder2; Category: TGUID;
fSource: IBaseFilter): HResult;
var
   StreamConf: IAMStreamConfig;
   PAMT: PAMMediaType;
begin
   Result:= E_FAIL;
   StreamConf:= nil;
   PAMT:= nil;
   try
     Result:= CB_B2.FindInterface(@Category, @MEDIATYPE_Video, fSource, IID_IAMStreamConfig, StreamConf);
       if Assigned(StreamConf) then
         begin
             StreamConf.GetFormat(PAMT);
               if Assigned(PAMT) then
                 begin
                   if PAMT.cbFormat= sizeOf(TVideoInfoHeader) then
                     begin
                       PVIDEOINFOHEADER(PAMT^.pbFormat)^.bmiHeader.biWidth:= 720;
                       PVIDEOINFOHEADER(PAMT^.pbFormat)^.bmiHeader.biHeight:= 576;
                       PVIDEOINFOHEADER(PAMT^.pbFormat)^.bmiHeader.biBitCount:= 24; //rgb24
                       PVIDEOINFOHEADER(PAMT^.pbFormat)^.AvgTimePerFrame:= 10000000 div 25; //25 fps
                       with PVIDEOINFOHEADER(PAMT^.pbFormat)^.bmiHeader do
                       PAMT^.lSampleSize := ((biWidth + 3) and (not (3))) * biHeight * biBitCount shr 3;
                       PVIDEOINFOHEADER(PAMT^.pbFormat)^.bmiHeader.biSizeImage:= PAMT^.lSampleSize;
                     end;
                   Result:= StreamConf.SetFormat(PAMT^)
                 end;
         end;
         result:= S_OK;
   except
   on E: Exception do
   MessageBox(0, PChar(E.Message), "", MB_OK or MB_ICONERROR);
   end;
   StreamConf:= nil;
   if Assigned(PAMT) then DeleteMediaType(PAMT);
end;
//==========================================================



Страницы: 1 вся ветка

Текущий архив: 2006.03.12;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.047 c
2-1140609531
zxcv
2006-02-22 14:58
2006.03.12
время, затрачиваемое на выполнение процедуры или ф-ии


2-1140614072
nap<>
2006-02-22 16:14
2006.03.12
SQL


15-1140292750
Nick Denry
2006-02-18 22:59
2006.03.12
Что такое "снижение процентной ставки"


15-1139941005
Кто - то
2006-02-14 21:16
2006.03.12
Вопрос законопослушного программиста


15-1140376426
Guest117
2006-02-19 22:13
2006.03.12
Где можно скачать хороший учебник по Java