Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Снимок экрана [D6, Win2k, WinXP]


Страницы:   1 2 3

Nic2 ©   (2004-09-22 17:41:00) 

Здравствуйте Мастера.
Пишу программу, которая передает снимки моего экрана на др. машину по сети и там их отображает (короче просмотр экрана удаленной машины). Делать это пытаюсь 24 кадра в сек., пакуя снимки в JPEG Проблема такая: упаковка в JPEG длится долго, а по сему получается максимум 8 кадров в секунду. Можно ли как-то увеличить кол-во кадров в секунду.
Код:
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
procedure TFORM1.CopyScrMy();
var
ScrBitmap: TBitmap;
jpg: TJPEGImage;
begin
    DC := GetDC(0);
    BInfo.bmiHeader.biSize := sizeof(tagBITMAPINFOHEADER);
    BInfo.bmiHeader.biWidth := 1024;
    BInfo.bmiHeader.biHeight := 768;
    BInfo.bmiHeader.biPlanes := 1;
    BInfo.bmiHeader.biBitCount := 24;
    BInfo.bmiHeader.biCompression := BI_RGB;
    binfo.bmiHeader.biSizeImage:=0;
    ScrBitmap := TBitmap.Create();
    ScrBitmap.Handle := CreateDIBSection(Canvas.Handle, BInfo, DIB_RGB_COLORS, Scr, 0, 0);
    bitblt(ScrBitmap.Canvas.Handle,0,0,1024,768,DC,0,0,srccopy);
    ScrBitmap.ScanLine[1];
try
  if not ScrBitmap.Empty then
   begin
    ms:=TMemoryStream.Create;
    jpg := TJPEGImage.Create;
    jpg.Performance:=jpBestspeed;
    jpg.PixelFormat:=jf8Bit;
    jpg.Scale:=jsHalf;
    jpg.CompressionQuality:=50;
    jpg.Compress;
    jpg.Assign(ScrBitmap);
    ScrBitmap.Assign(jpg);
    jpg.SaveToStream(ms);
    ms.Position:=0;
    try
     Socket.PostIt(ms);
    except
    end;
   end;
finally
 ms.Clear;
 b.Free;
 jpg.Free;
 DeleteDC(DC);
 SCRBitmap.Free;
end;
end;
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Заранее спасибо.


_silver   (2004-10-24 17:21:00) [1]

485 - связано с popup menu.
WM_LBUTTONUP
WM_MBUTTONUP
WM_RBUTTONUP
WM_CHAR,WM_KEYUP  - могут влмять на состояние окон( и не только).
Но в принципе их не обязательно обрабатывать.


snif   (2004-10-24 15:32:00) [2]

а 485 это что?
а
   WM_CHAR,WM_KEYUP
   WM_LBUTTONUP
   WM_MBUTTONUP
   WM_RBUTTONUP какое отношение имеют к прорисовке?


_silver   (2004-10-24 13:35:00) [3]


> snif   (24.10.04 11:43) [41]

    WM_NCPAINT,WM_NCACTIVATE
    WM_CHAR,WM_KEYUP
    WM_LBUTTONUP
    WM_MBUTTONUP
    WM_RBUTTONUP
    WM_HSCROLL,WM_VSCROLL
    485  //почему-то не документированно
    WM_SYSCOLORCHANGE,WM_PALETTECHANGED,
    WM_SETTEXT,WM_ENABLE,BM_SETCHECK,
    BM_SETSTATE,EM_SETSEL
    WM_PAINT
    WM_WINDOWPOSCHANGED
    WM_WINDOWPOSCHANGING

Возможно это не все сообщения которые надо перехватывать, но их хватает для получения почти полной картины.


snif   (2004-10-24 11:43:00) [4]

_silver ©   (18.10.04 12:23) [40]
Приведи пожалуйста список. Очень надо. Желательно с комментариями. Лучше исходник библотеки с хуком. А еще лучше исходник всей проги. :)) Можно мылом...
Заранее благодарен.


_silver   (2004-10-18 12:23:00) [5]

GROL   (17.10.04 1:33) [39]
Зависит от того какие сообщения перехватывать.
Я делал перехват всех сообщений связаных с перерисовкой экрана, в том числе и те которые связаны с перерисовкой выпадающих меню.
Могу привести полный список сообщений которые надо перехватывать.


GROL   (2004-10-17 01:33:00) [6]


> _silver ©   (25.09.04 14:38) [20]
> Я делал подобное.

Ловилась всякиая Windows-анимация, ну, тип выезжающее или плавно появляющееся меню, или только конечный результат?


_silver   (2004-10-14 17:41:00) [7]

Nic2   (04.10.04 20:06) [37]
Так чем тебе

> _silver ©   (27.09.04 19:19) [35][Ответить]

не подходит?


Nic2   (2004-10-04 20:06:00) [8]

Сделал упаковку через ZLibEx. Передаваемые кадры получаются обрезанными сверху  процентов на 20-25 (ну не обрезанные, а вместо полезного изображения черный фон). Может кто сталкивался, в чем прикол?

Заранее спасибо.


Nic2   (2004-09-27 19:48:00) [9]

Ну со вторым ступил, согласен....
Спасибо, попробую.


_silver   (2004-09-27 19:19:00) [10]

1. хук(обязательно в dll) на
WH_CALLWNDPROC
WH_GETMESSAGE
WH_SYSMSGFILTER
далее определяешь какое сообщение пришло
Самое сложное с WM_PAINT
Если WM_PAINT - определяешь координаты с помощью GetRegionData() (не забывая о том что для одного WM_PAINT может изменяться несколько регионов)
далее bitblt
для остальных сообщений - GetWindowRect.
2. ну это совсем уж
Что тебе мешает передать сначала координаты, а потом сам изменившийся кусок?
А потом тотже bitblt.


_silver   (2004-09-27 19:08:00) [11]

Nic2   (27.09.04 17:34) [33]
Копай исходники WinVNC.
Если не знаешь С могу привести пример на delphi.


Nic2   (2004-09-27 17:34:00) [12]

_silver ©   (25.09.04 14:38) [20]

Если не затруднит, хотя бы  в общих чертах объясните:
- как получить координаты изменившегося куска экрана;
- после передачи этого куска на др. машину, как мне слить(а точнее наложить) изменившийся кусок на старый битмам?

Заранее спасибо.


PGM_X   (2004-09-27 16:52:00) [13]

И чего это его утроило?


PGM_X   (2004-09-27 16:50:00) [14]

Удалено модератором


PGM_X   (2004-09-27 16:50:00) [15]

Удалено модератором


PGM_X   (2004-09-27 16:49:00) [16]

За все GeForce я вероятно поспешил, radeon тоже старый какой-то был. Конкретно у меня: GeForce MX400, Athlon 800, 1024х768х16 = 56 FPS.


Nic2   (2004-09-27 15:19:00) [17]

<<Для информации: чтение из видеопамяти операция на порядки медленне чем запись (на многи картах меряется в 5-6 Мб/с, только GeForce может похвастать приличной скоростью . Так что на тех же ATI лимитирует не сжатие в JPEG, а банальная низкая скорость чтения из памяти. Как раз BitBlt с экрана и будет все тормозить.>>

Заинтересовало меня это, проверил:
У меня машина с Radeon 9000(не про)128М
Проверил у коллеги у нее GeForce FX5200(не ультра)128М

Процы - чистые Pentium(не Celeron-ы): у меня-2,4. У нее - 2,6.
Оперативки по 512.

У меня мать 845, у нее - 848

Результат:
у меня - (как уже писал-7-8 кадров)
у нее - 2-3

По скорости Радик похоже все же круче.
ЗЫ: Это все уже становится интересным...(аж похоже на тесты видях!!!!)


_silver   (2004-09-27 12:37:00) [18]


> _silver ©   (25.09.04 14:38) [20]

Оптимальнее этого варианта не будет.


Анонимщик   (2004-09-27 11:45:00) [19]

Еще раз говорю, посмотри на свой код - если ты отключишь сохранение в поток, то и операции с jpeg-сжатием теряют смысл, поэтому оптимизатор может просто проигнорировать эти команды. Ты должен действительно проверить, какие операции самые тяжелые. Вполне возможно, PGM_X совершенно прав.


PGM_X   (2004-09-27 00:16:00) [20]

2 _silver: bitblt работает довольно быстро, а сжатие в jpeg довольно долгая процедура. Если не веришь проверь

Любая видеоплата не GeForce и 1280 на 1024 на 32 бита из видеопамяти (!) в обычную и фраза "довольно быстро" не будет казаться правильной. Была конкретная задача и тормоз было именно чтение из памяти при помощи BitBlt. А кодирование в JPEG решается хорошим процессором и чем дальше тем легче :-).


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо