Форум: "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.012 c