![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DirectShow. Как воспроизвести сразу 2 видеокамеры? [D7, WinXP]
WondeRu © (2004-07-29 15:07:00)Есть карточка захвата! К 2-ум композитным входам подключены камеры! Написал прогу, которая вызывает IAMCrossbar PropertyPage, там можно выбрать лишь одну камеру для текущего графа!
Как одновременно воспроизвести и получить опорные кадры с этих камер???
WondeRu (2004-08-25 15:59:00) [21]Анонимщик © (25.08.04 15:32) [19]
плата дома валяется, сейчас вспомнить не могу (но отношение помню 3:1, тока не помню чего входит и чего выходит)! Вообще планировал сначала 2 камеры вешать на 2 композитных входа, но потом решил сделать на все (стандартная conexant bt 878: 2 composite, 1 tv, 1 s-video)!
Щас пытаюсь делать смотрелку для всех входов!
Анонимщик (2004-08-25 15:32:00) [22]WondeRu
Меня интересовали InputPins именно видео, и именно те, что соответствуют твоему выходу.
Так, вот еще увидел. Ты сначала пишешь, что у тебя два композитных входа, а затем - что четыре. Так сколько их?
Какая плата?
А количество пинов проверь с помощью вызовов нужных функций, а не на глазок.
WondeRu (2004-08-25 14:51:00) [23]WondeRu © (25.08.04 14:31) [16]
4 шт!
вообще-то не помню! )
Sapersky (2004-08-25 14:45:00) [24]А это вообще к чему?
Это к
WondeRu © (02.08.04 16:52) [9]
Вроде бы в тему? :)
WondeRu (2004-08-25 14:31:00) [25]Анонимщик © (25.08.04 11:57) [13]
сколько у тебя InputPins
4 шт!
где задержку?
у меня в коде после
if FCrossBar.RoutedInputPinsCount > 0 then
FCrossBar.RouteNext; ????
Боюсь - там никак! Отдельно таймер делать для переключения?
Анонимщик (2004-08-25 13:57:00) [26]Sapersky
А это вообще к чему?
Sapersky (2004-08-25 13:05:00) [27]Не знаю, как там конкретно в DirectShow, но вообще при видеозахвате имеет смысл переключать каналы после прихода очередного кадра...
То, что синхронизации нет - ну, камеры не синхронизированы, вот её и нет :)
И реалтайм с 4 каналов определённо не получится... Делим 25 FPS на 4, да ещё, если синхронизации нет, дополнительные задержки при переключении... в общем, кадра 3-4 в секунду будет.
Анонимщик (2004-08-25 11:57:00) [28]Щелкай где хочешь. Но потом либо делай задержку миллисекунд, скажем, 65, либо, что лучше, если у тебя карточка с родными драйверами и есть компакт с демо какими нибудь, то посмотри, как там сделан этот момент. Кстати, посмотри, сколько у тебя InputPins?
WondeRu (2004-08-24 12:58:00) [29]Анонимщик © (16.08.04 16:58) [11]
Ветку наверх.
Ну как, получилось уже?
неа! может я не в том месте переключаю каналы? где их щелкать?
Анонимщик (2004-08-16 16:58:00) [30]Ветку наверх.
Ну как, получилось уже?
WondeRu (2004-08-04 09:29:00) [31]Может кто скажет в чем ошибка, плизз!!!
WondeRu (2004-08-02 16:52:00) [32]Вообще муть получается!!!(((
Кадры бегают! Нет синхронизации! Иногда част ькартинки с одной камеры налазит на др камеру!
После получения очередного кадра я прорисовываю картинку (на своем месте каждый канал), затем переключаю канал!
все дрыгается!
как правильно сделать, чтобы сразу показывать все 4 канала БиТишки в реалтайме?
код:
procedure TVideoCapture.SampleGrabberBuffer(sender: TObject;
SampleTime: Double; pBuffer: Pointer; BufferLen: Integer);
var
BIHeader: tagBitmapInfo;
MediaType: TAMMediaType;
xpos, ypos, Index: Integer;
begin
try
FSampleGrabber.SampleGrabber.GetConnectedMediaType(MediaType);
if IsEqualGUID(MediaType.formattype, FORMAT_VideoInfo) then
begin
if MediaType.cbFormat = SizeOf(TVideoInfoHeader) then // check size
BIHeader.bmiHeader := (PVideoInfoHeader(MediaType.pbFormat)^.bmiHeader);
end
else if IsEqualGUID(MediaType.formattype, FORMAT_VideoInfo2) then
begin
if MediaType.cbFormat = SizeOf(TVideoInfoHeader2) then // check size
BIHeader.bmiHeader := (PVideoInfoHeader2(MediaType.pbFormat)^.bmiHeader);
end;
finally
FreeMediaType(@MediaType);
end;
Canvas.Lock;
try
try
SetStretchBltMode(Canvas.Handle, COLORONCOLOR);
with BIHeader.bmiHeader do
begin
Index := FCrossbar.InputCrossbarPins[FCrossbar.RoutedInputPins[FCrossBar.NowRoute].PinIndex].PinIndex;
xpos := (Index mod 2) * (biWidth div 2 + 5);
ypos := (Index div 2) * (biHeight div 2 + 5);
StretchDIBits(Canvas.Handle,
xpos,
ypos,
biWidth div 2,
biHeight div 2,
0,
0,
biWidth,
biHeight,
pBuffer,
BIHeader,
DIB_RGB_COLORS,
SRCCOPY);
end;
except
end;
finally
Canvas.Unlock;
end;
//переключение камер
if FCrossBar.RoutedInputPinsCount > 0 then
FCrossBar.RouteNext;
end;
Анонимщик (2004-07-30 13:20:00) [33]Пожалуйста.
WondeRu (2004-07-30 13:17:00) [34]Анонимщик, спасибо БОЛЬШОЕ за помощь!
Кстати, а где твоя анкета?
Анонимщик (2004-07-30 13:08:00) [35]Прав.
FIAMStreamConfig - для конфигурирования
FIAMVideoProcAmp - для получения/установки, например, яркости-контраста и т.д.
FIAMCrossBar - для переключения каналов (Route и get_IsRoutedTo)
FIAMAnalogVideoDecoder - для установки PAL/SECAM и т.д.
FICustomCameraProp - это выброси вообще, специфично для той карточки, что я использую
Более подробно читай в хелпе по интерфейсам и функциям.
WondeRu (2004-07-30 13:04:00) [36]Для моего случая я думаю можно отставить только создание
FIAMCrossBar и RenderStream. Я прав?
Если не сложно прокомментируй каждый FindInterface в 2-х словах. Что для чего? это так, для общего развития!
Анонимщик (2004-07-30 12:53:00) [37]Одна микросхема, значит - коммутация.
// пример, когда все создается в run-time:
// код пишу весь подряд, посмотри, кстати, тут кое-чего
// тебе сразу и не нужно, но потом пригодится
FFilterGraph := TFilterGraph.Create(nil);
FFilter := TFilter.Create(nil);
FSampleGrabber := TSampleGrabber.Create(nil);
FSampleGrabber.OnBuffer := NewPictureEvent; (* обработкой у меня эта пройедура занимается *)
FFilterGraph.Mode := gmCapture;
FFilter.FilterGraph := FFilterGraph;
FSampleGrabber.FilterGraph := FFilterGraph;
FFilterGraph.ClearGraph;
FFilterGraph.Active := false;
FFilter.BaseFilter.Moniker := AMoniker; (* об этом моникере сам позаботься следующим образом:
SysDev := TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);
for i := 0 to SysDev.CountFilters - 1 do
begin
SysDev.GetMoniker(i); // этот твои моникеры
end;
*)
FFilterGraph.Active := true;
(FFilterGraph as ICaptureGraphBuilder2).FindInterface
(
nil,
nil,
FFilter as IBaseFilter,
IID_IAMStreamConfig,
FIAMStreamConfig
);
(FFilterGraph as ICaptureGraphBuilder2).FindInterface
(
nil,
nil,
FFilter as IBaseFilter,
IID_IAMVideoProcAmp,
FIAMVideoProcAmp
);
(FFilterGraph as ICaptureGraphBuilder2).FindInterface
(
@LOOK_UPSTREAM_ONLY,
nil,
FFilter as IBaseFilter,
IID_IAMCrossBar,
FIAMCrossBar);
(FFilterGraph as ICaptureGraphBuilder2).FindInterface
(
nil,
nil,
FFilter as IBaseFilter,
IID_IAMAnalogVideoDecoder,
FIAMAnalogVideoDecoder
);
(FFilterGraph as ICaptureGraphBuilder2).FindInterface
(
@PIN_CATEGORY_CAPTURE,
@MEDIATYPE_Video,
FFilter as IBaseFilter,
PROPSETID_VIDCAP_CUSTOMBT848,
FICustomCameraProp
);
(FFilterGraph as ICaptureGraphBuilder2).RenderStream
(
@PIN_CATEGORY_PREVIEW{@PIN_CATEGORY_CAPTURE},
nil,
FFilter as IBaseFilter,
nil,
FSampleGrabber as IBaseFilter
);
FFilterGraph.Play;
В процедуре NewPictureEvent вызываешь процедуру
FSampleGrabber.GetBitmap(tmpBitmap, Buffer, BufferLen);
Что неясно?
WondeRu (2004-07-30 12:24:00) [38]2Анонимщик ©
Одна микросхема!
Другой вопрос: Я работаю в режиме Preview! А как сделать так, чтобы картинка не показывалась, т.е. картинка шла в какой-нить буфер, а затем бы я его прорисовывал в зависимости от камеры на две области?
Использую компоненты DSPack, картинка выводится с помощью TVideoWindow! если нет его на форме, то граф создает свое окно и выводит картинку туда!
Анонимщик (2004-07-29 17:58:00) [39]Забыл спросить. Сколько у тебя на карточке микросхем bt8xx? Если одна, то делать нужно так, как я сказал. Если две, тогда можно и "одновременно".
Анонимщик (2004-07-29 17:57:00) [40]Одновременно никак, у тебя ведь каналы коммутируемые. Делай что-то вроде IAMCrossBar.Route(0, 0) получай с одного канала, потом IAMCrossBar.Route(0, 1) - с другого.