Форум: "Media";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
ВнизDSPack Найти похожие ветки
← →
palgen © (2005-10-09 22:43) [0]Нужно брать сигнал с видеовхода TVTuner. По умолчанию сигнал берется с самого тюнера. Как мне программно изменить источник сигнала? Или иными словами у Filter есть BaseFilter, в котором можно это настроить (composite in - TVTuner - SVideo) через WDM Video Capture Sourse, а мне нужно это задать при запуске программы. Есть какие-нибудь идеи ?
← →
WondeRu © (2005-10-10 08:39) [1]Через Crossbar
← →
palgen © (2005-10-10 17:33) [2]А как его задать в программе в виде строки листинга ?
← →
palgen © (2005-10-11 20:01) [3]у какого элемента есть crossbar ? у Filter ?
← →
palgen © (2005-10-12 17:08) [4]задал croosbar , но на него реагирует только первое устройство - на второе устройство никакого действия ... почему ?
← →
Анонимщики © (2005-10-12 17:30) [5]У меня уже нет сил слушать твои причитания.
Интерфейс IAMCrossBar предоставляет не фильтр какой-то, а менеджер графа фильтров. А у фильтра его лучше не запрашивать.
Но есть еще вариант. Иногда с драйвером захвата идет еще и фильтр с названием вроде чего_то_там_CrossBar_чего_то_там_снова. Тогда можно и через этот фильтр работать.
По теме - посмотри примере в DSPack"е, как с помощью интерфейса IMoniker выбирать именно нужное устройство, по FriendlyName, например.
Вообще - тебе не совестно пытаться заниматься видеозахватом черте какое время и не понимать азов?
← →
palgen © (2005-10-15 18:59) [6]Вот листинг программы -
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
var
hR1: HRESULT;
hR2: HRESULT;
CrossBar1: IAMCrossbar;
CrossBar2: IAMCrossbar;
SysDev: TSysDevEnum;
i: integer;
Device: TMenuItem;
begin
SysDev:= TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);
if SysDev.CountFilters > 0 then
for i := 0 to SysDev.CountFilters - 1 do begin
Device := TMenuItem.Create(Devices);
Device.Caption := SysDev.Filters[i].FriendlyName;
Device.Tag := i;
Devices.Add(Device);
end;
//======== инициализация фильтра1 и графа1 ===============================
FilterGraph.ClearGraph;
FilterGraph.Active := false;
Filter.BaseFilter.Moniker := SysDev.GetMoniker(TMenuItem(Sender).tag); - выбор устройства №1
FilterGraph.Active := true;
//============ запуск рендера1 и выставление параметров ==================
with FilterGraph as ICaptureGraphBuilder2 do begin
hR1 := FindInterface(@LOOK_UPSTREAM_ONLY, nil, Filter as IBaseFilter, IID_IAMCrossbar, CrossBar1);
if (SUCCEEDED(hr1)) then begin
with Crossbar1 as IAMCrossbar do begin
Route(0, 1); - устанавливает в Composite In
end;
end;
end;
with FilterGraph as ICaptureGraphBuilder2 do begin
RenderStream(@PIN_CATEGORY_CAPTURE, nil, Filter as IBaseFilter, SampleGrabber as IBaseFilter, VideoWindow as IbaseFilter);
end;
SetVideoParams(FilterGraph as ICaptureGraphBuilder2, PIN_CATEGORY_CAPTURE, Filter as IBaseFilter);
//============ запуск графа1 =============================================
FilterGraph.Play;
//============ инициализация фильтра2 и графа2 ===========================
FilterGraph1.ClearGraph;
FilterGraph1.Active := false;
Filter1.BaseFilter.Moniker := SysDev.GetMoniker(TMenuItem(Sender).tag+1); - выбор устройства №2
FilterGraph1.Active := true;
//============ запуск рендера2 и выставление параметров ==================
with FilterGraph1 as ICaptureGraphBuilder2 do begin
hR2 := FindInterface(@LOOK_UPSTREAM_ONLY, nil, Filter1 as IBaseFilter, IID_IAMCrossbar, CrossBar2);
if (SUCCEEDED(hr2)) then begin
with Crossbar2 as IAMCrossbar do begin
Route(0, 1); - устанавливает в Composite In
end;
end;
end;
with FilterGraph1 as ICaptureGraphBuilder2 do begin
RenderStream(@PIN_CATEGORY_CAPTURE, nil, Filter1 as IBaseFilter, SampleGrabber1 as IBaseFilter, VideoWindow1 as IbaseFilter);
end;
SetVideoParams(FilterGraph1 as ICaptureGraphBuilder2, PIN_CATEGORY_CAPTURE, Filter1 as IBaseFilter);
//============ запуск графа2 =============================================
FilterGraph1.Play;
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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:= x_res;
PVIDEOINFOHEADER(PAMT^.pbFormat)^.bmiHeader.biHeight:= y_res;
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;
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Route действует только на устройство №1, на №2 вообще никакого действия... Что можно сделать ?
← →
Анонимщики © (2005-10-16 23:06) [7]Да откуда же я знаю, что у теб за тэги?
И вообще, нет времени рабираться в твоем коде. Тебе направление дали, вот и дебажь.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.012 c