![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Если стоят две карты(TVTuner) с видеовходом ... [D6, Win2k]
palgen © (2005-09-09 14:02:00)Использую DSPack. Как мне поступить в случае, когда у меня стоят две карты и на них подаётся два разных видеосигнала, которые нужно отобразить? Использовать для каждой карты отдельно VideoWindow, FilterGraph и Filter? Или как-то по другому можно?
palgen (2005-09-30 07:53:00) [1]Спасибо за помошь ! я разобрался в чём было дело - код правильный, не была произведена инициализация второго 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;
//==========================================================
Дмитрий Белькевич (2005-09-25 16:05:00) [2]>'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-22 15:00:00) [3]кто-нибудь ...
palgen (2005-09-22 10:44:00) [4]А что здесь такое IBaseFilter ?
palgen (2005-09-22 08:31:00) [5]при запуске второго устройства ругается на строке
//=======================================================
with FilterGraph1 as ICaptureGraphBuilder2 do
RenderStream(@PIN_CATEGORY_CAPTURE, nil, Filter1 as IBaseFilter, SampleGrabber1 as IBaseFilter, VideoWindow1 as IbaseFilter);
palgen (2005-09-22 08:02:00) [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:00) [7]Если кто подскажет буду очень благодарен !
palgen (2005-09-22 07:46:00) [8]хелп ми ... С одной картой всё работает, а вот с двумя не хочет. Что можно сделать ?
Дмитрий Белькевич (2005-09-14 03:27:00) [9]На форме лежит DSVideoWindowEx1 типа TDSVideoWindowEx - окно просмотра.
Лежит FilterGraph типа TFilterGraph, лежит Filter типа TFilter. Лежит SampleGrabber типа TSampleGrabber - захватываю им отдельные картинки.
SampleGrabber, Filter, DSVideoWindowEx1 привязаны к FilterGraph.
Смотри - там всё в примерах есть. Единственное - с кроссбаром пришлось повозиться.
palgen (2005-09-12 07:15:00) [10]а можно поподробнее об элементах на форме, о функциях данного кода ? как я понял, здесь отображается один из двух видеосигналов ... а можно ли отображать два одновременно ?
зараннее благодарен
Дмитрий Белькевич (2005-09-11 20:06:00) [11]Лови: добыто собственноручно, после кучи геморроя. Много не тестил, но везде, где тестил - работало. Если кто чего поправит - буду признателен.
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-09 14:06:00) [12]Желательно кодом ...