Форум: "Media";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];
ВнизDSPack Найти похожие ветки
← →
Nik2006 (2006-03-28 16:22) [0]делаю захват видео сразу с нескольких входов карточки:
в обработчике SampleGrabber.OnBuffer
пишу следующее:
...
var
channel : integer = 0 ;
...
procedure TVideoForm.SampleGrabberBuffer(sender: TObject;
SampleTime: Double; pBuffer: Pointer; BufferLen: Integer);
begin
if channel > 3 then channel : = 0 ;
if channel = 0 then
SampleGrabber.GetBitmap(Image0.Picture.Bitmap) ;
if channel = 1 then
SampleGrabber.GetBitmap(Image1.Picture.Bitmap) ;
if channel = 2 then
SampleGrabber.GetBitmap(Image2.Picture.Bitmap) ;
if channel = 3 then
SampleGrabber.GetBitmap(Image3.Picture.Bitmap) ;
inc(channel) ;
(CrossBar as IAMCrossBar).Route(0,channel) ;
end;
//---------------------
работает всё нормально, листает источники видео ("каналы") как я и хотел, но .... проблемма заключается в том, что изображение постоянно дёргается или половина изображения от одного источника, вторая от другого. Я бы сказал нет синхронизации.
пробовал останавливать граф, встявляя SampleGrabber.SapleGrabber.SetOneShot(..) , всё равно идёт наслоение. А как работать с буфером устройства, что бы контроллировать заполняемость его - я не знаю ... Кто что может подсказать ???
← →
Nik2006 (2006-03-28 16:23) [1]Как "синхронизировать" вводимое изображение ?
← →
Анонимщики © (2006-03-29 16:39) [2]А как ты узнаешь текущий номер канала?
И как карточка назыается?
← →
nik2006 (2006-03-29 18:27) [3]текущий номер канала ??? я его изначально ставлю в ноль а потом переключаю. (через глобальные переменные).
lifeview 98 EZ - на bt878 чипе
← →
Анонимщики © (2006-03-30 16:55) [4]Ты кусок кода приведи.
Кроме того, ты убеждаешься, что сейчас активен именно нужный тебе канал?
Самый правильный способ - искать ответ в SDK для карточки. Должны быть интерфейсы, поддерживаемые фильтром источника, реализуемого драйвером, с помощью которого твою проблему можно решить (после переключения каналов нужно дождаться сигнала кадровой синхронизации, в противном случае кадры налезут друг на друга).
Как альтернативу можно использовать задержку после переключения (т.е. нельзя захватывать кадр, если после переключения каналов прощло меньше некоторого заранее обкучловленного интервала времени). Она должша быть, еслине ошибаюсь, в районе 65 мсек, во всяком случае, 80-ти мсек будет достаточно почти наверняка.
← →
nik2006 (2006-03-31 14:16) [5]>> 80-ти мсек будет достаточно почти наверняка
и такого времени недостаточно ... всё равно наложение происходит. Путём проб и ошибок я выявил, что при 120 ещё можно работать, хотя иногда кадр прыгает или пирекрывается .... Сделал 250 мс, что значит кадр на канал - всё работает замечательно!
А на счёт каналов делаю так:
hr := (CrossBar as IAMCrossBar).Route(0,channel) ;
sleep(N) ;
if hr <> S_OK then
begin
...
SaveStateToLogFile() ;
end
старым дедовским методо ...:))
блин SDK для карточки есть, но .... драйверов родных .... нет. Пользую WDM драйвер от Ивана Ускова (www.pctuner.ru - это не для рекламмы а просто где я их взял)
>> дождаться сигнала кадровой синхронизации
вот бы мне узнать как это сделать ... :)
← →
Анонимщики © (2006-03-31 16:19) [6]Более корректно проверять, какой канал активен с помощью метода get_IsRoutedTo того же интерфейса.
Я имел в виду, что скорость захвата - 25 кадров в секунду (полная), исходя из этого и приводил временные задержки.
Если нет родных драйверов, то что можно сказать? Спроси у Ускова (он обычно что-нибудь отвечает, вроде того, что, мол, давно было дело, я уже забыл). Ну и докуменацию на bt смотри, только не помню уже, где ее искать.
← →
nik2006 (2006-03-31 17:25) [7]кстати - get_IsRoutedTo проверяю ... он мне говорит что мол всё ОК.
var
cur_channel :integer=-1 ;
begin
...
(CrossBar as IAMCrossBar).Route(0,channel) ;
while cur_channel <> chqnnel do
(Filter as IAMCrossBar).get_IsRoutedTo (0,cur_channel) ;
и всё равно идёт наслоение кадров .....
← →
WondeRu © (2006-03-31 17:41) [8]nik2006 (31.03.06 14:16) [5]
думаю не верно переключать канал внутри SampleGrabber.OnBuffer.
← →
nik2006 (2006-03-31 17:44) [9]>> WondeRu
вполне возможно, но я так же пробовал и таймер к примеру использовать .... тоже самое. И ещё, по собственному наблюдению, событие SampleGrabber.OnBuffer вызывается при полном заполнении буффера :) т.е. впринципе, здесь можно вызов делать ... только после переключения каналов всё равно делать задержку по времени
← →
Анонимщики © (2006-03-31 17:44) [10]А откуда известно, что он это делает именно там?
← →
nik2006 (2006-03-31 17:50) [11]>> А откуда известно, что он это делает именно там?
что именно ?
← →
WondeRu © (2006-03-31 17:55) [12]nik2006 (31.03.06 17:50) [11]
просто вызывай SampleGrabber.GetBitmap(Image2.Picture.Bitmap) по таймеру и все, а о OnBuffer забудь...
← →
WondeRu © (2006-03-31 17:56) [13]WondeRu © (31.03.06 17:55) [12]
просто вызывай SampleGrabber.GetBitmap(Image2.Picture.Bitmap) по таймеру и щелкай каналом и все, а о OnBuffer забудь...
← →
nik2006 (2006-03-31 18:04) [14]WondeRu >>
так делал ... всё равно наслоение кадров идёт, даже если подтверждать переключение кадров get_IsRoutedTo ...
вот кусочек кода из обработчика таймера
...
Image.Canvas.Lock;
Image1.Canvas.Lock;
Image2.Canvas.Lock;
Image3.Canvas.Lock;
(Filter1 as IAMCrossBar).get_IsRoutedTo(0,tmp);
if tmp = 1 then
SampleGrabber.GetBitmap(Image.Picture.Bitmap);
if tmp = 2 then
SampleGrabber.GetBitmap(Image1.Picture.Bitmap);
if tmp = 3 then
SampleGrabber.GetBitmap(Image2.Picture.Bitmap);
if tmp = 4 then
SampleGrabber.GetBitmap(Image3.Picture.Bitmap);
Image.Canvas.UnLock;
Image1.Canvas.UnLock;
Image2.Canvas.UnLock;
Image3.Canvas.UnLock;
(Filter1 as IAMCrossBar).Route(0,channel) ;
Channel := Channel + 1 ;
if channel > 4 then channel := 1 ;
sleep(120); {или можно просто таймер интервал поставить в 120}
...
всё равно наслоение есть .... (но реже).
просто почему я так нехочу делать, хочу из карты выжать максимум скорости и не думагь, гадать какой интервал времени поставить что бы не было наслоений ....
← →
WondeRu © (2006-03-31 18:22) [15]на всякий случай, чтоб потом не гадать сделай наподобие:
Image.Canvas.Lock;
try
...
finally
Image.Canvas.UnLock;
end;
← →
nik2006 (2006-03-31 18:23) [16]сделал ..... непомогло ...:) всё нормально обрабатывется и без ошибок ....
← →
nik2006 (2006-03-31 18:43) [17]УРА !!!! Всё получилось !!!!!!!!!!!! просто надо было выбрасывать первый кадр после переключения!!! Все спасиба за помощь!
← →
Анонимщики © (2006-04-01 11:41) [18]Это ты фактически совершенно извратным способом добился-таки кадровой синхронизации.
Лучшее, что можно сделать, это найти родные драйвера, вряд ли это большая редкость, и использовать штатные средства. Заметь, если тот кадр, что ты выбрасываешь, нормальный, то ты теряешь в скорости.
Да, кстати, а чем ты временные задержки измерял?
← →
nik2006 (2006-04-03 13:35) [19]>> Да, кстати, а чем ты временные задержки измерял?
использовал системное время ... (в мс)
← →
Анонимщики © (2006-04-03 15:32) [20]Нужно GetTickCount использовать.
А системное время имеет большую погрешность - порядка 20мс.
← →
WondeRu © (2006-04-04 15:40) [21]Анонимщики © (03.04.06 15:32) [20]
Нужно GetTickCount использовать.
Наоборот не нужно :)
← →
nik2006 (2006-04-05 09:55) [22]Анонимщики >> да нет, впринципе мне системного хватало .... :)
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.045 c