Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-1157636310
SergP.
2006-09-07 17:38
2006.11.05
Неравномерность скорости выборки из базы...


2-1161085423
L15
2006-10-17 15:43
2006.11.05
Создание Теста на Делфи


1-1159295713
AlexeyT
2006-09-26 22:35
2006.11.05
Задать рамке TPanel стиль от TEdit


1-1159196321
newbie2
2006-09-25 18:58
2006.11.05
Какой сhart в "Домашние финансы"


6-1149699693
Whitevova
2006-06-07 21:01
2006.11.05
Как передать голос по сети и ..., Internet





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский