Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];

Вниз

Если стоят две карты(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 вся ветка

Форум: "Media";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.011 c
15-1139824556
Гарри Поттер
2006-02-13 12:55
2006.03.12
VPN+Outlook+Exchange


15-1139988050
DelphiN!
2006-02-15 10:20
2006.03.12
Требуется программист на Delphi. г.Алматы. р.Казахстан


2-1140918545
HiTTeR
2006-02-26 04:49
2006.03.12
Помогите в решении задачи


2-1140419004
integery
2006-02-20 10:03
2006.03.12
обновление даних


10-1114698193
vlad_ri
2005-04-28 18:23
2006.03.12
многопоточность и COM





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский