Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с видеопамятью 
:(
    Опции темы
Leksey
Дата 3.8.2005, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



В теме "Запись видео с рабочего стола", которую я создал в разделе Общие вопросы посоветовали обратиться сюда по поводу работы с видеопамятью.
comcon1 предложил такую идею для записи видео с рабочего стола?
Цитата

Я никогда не работал с видеопамятью. Создай такую тему где-нить в WinApi. Или обратись к Chaos - , я помню, он умеет. А насчет сравнения я бы посоветовал так. Вот вся видеопамять:
[********************************************************* ]
^________________________________________________________^
ptr1______________________________________________________ptr2
Смотришь, где начинаются изменения (_beg, и где заканчиваются _end). Отводишь память под размер (_end - _beg) и спасаешь в оперативе.
Таким образом ты хранишь список таких структур:

struct modification {
char *_end, *_beg;
char *heap;
modification *nxt;
};

Прогу стоит писать на чистом С с использованием системных вызовов. Будет быстрее.
char * - указатель на байтовую переменную, чтобы при вычитании получать реальные размеры блоков.

Специалисты, поправьте меня.


Как вы думаете можно это реализовать и какие средства для работы с видеопамятью предоставляет WinAPI?
PM MAIL   Вверх
ManiaK
Дата 3.8.2005, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 2
Всего: 29



Цитата
Функция GetDesktopWindow возвращает дескриптор рабочего стола. Окно рабочего стола занимает весь экран. Это та область, на которой изображаются все иконки и остальные окна.


С помощью этой функции можно получить дескриптор окна. Через дескриптор - контекст устройства (HDC), а через него все биты рабочего стола.
PM MAIL WWW   Вверх
Leksey
Дата 3.8.2005, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



А что-нибудь вроде размещения в видеопамяти куска информации?
PM MAIL   Вверх
ManiaK
Дата 3.8.2005, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 2
Всего: 29



Цитата(Leksey @ 3.8.2005, 15:49)
А что-нибудь вроде размещения в видеопамяти куска информации?

В Windows напрямую с видеопамятью работать нельзя.
PM MAIL WWW   Вверх
JoyEx
Дата 3.8.2005, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



Цитата(ManiaK @ 3.8.2005, 14:51)
Цитата(Leksey @ 3.8.2005, 15:49)
А что-нибудь вроде размещения в видеопамяти куска информации?

В Windows напрямую с видеопамятью работать нельзя.

А DirectX тогда для чего?

DirectDraw может отобразить нужный "кусок" видеопамяти в твой процесс.


Leksey
С помощью HDC ничего не выйдет с захватом видео, если её выводят аппаратно, через OVERLAY.



--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Leksey
Дата 3.8.2005, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



JoyEx А как выйдет?
К тому же мне важно изображение моего окна на рабочем столе, и я не использую OVERLAY.
И как мне найти нужный кусок видеопамяти в котором изображение рабочего стола?
PM MAIL   Вверх
ManiaK
Дата 3.8.2005, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 2
Всего: 29



Цитата(JoyEx @ 3.8.2005, 17:04)
С помощью HDC ничего не выйдет с захватом видео, если её выводят аппаратно, через OVERLAY.

Ты будешь смеяться, я пересмотрел все темы, которые были на этом форуме по данной теме: все приходили к выводу, что даже с помощью DD видео не ухватить smile По крайней мере стандартными способами.

А нужно ли это?.. Про видео ничего не говорилось.
PM MAIL WWW   Вверх
Leksey
Дата 3.8.2005, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



Что самое обидное софта который делает аналогичные вещи просто навал ом в Интернете. smile
PM MAIL   Вверх
Дрон
Дата 3.8.2005, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 1
Всего: 93



Цитата(ManiaK @ 3.8.2005, 17:21)
Ты будешь смеяться, я пересмотрел все темы, которые были на этом форуме по данной теме: все приходили к выводу, что даже с помощью DD видео не ухватить

Это вроде как раз потому, что видео в основном играется через оверлеи.
А оверлеи эта такая хитрая штука, которая обрабатывается на аппаратном уровне и само изображение может находится в любой области видеопамяти.


--------------------
Да. Именно так.
PM   Вверх
JoyEx
Дата 3.8.2005, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



Leksey

Если нету overlay, то тогда нет ничего проще smile

HDC - это описатель для "куска" видеопамяти, а Windows обычно работает с одной видеостраницей (все, что видно на экране на ней и находится) и поэтому, получив контект HDC своего Рабочего стола (тебе же ManiaK говорил уже) можешь спокойно сохранять картинку. В MSDN April 2003 есть пример "Storing an Image" (Windows GDI). Маленькие "куски" с Рабочего стола (- это тоже окно) в режиме приближенному к реальному времени можно таким образом сграбить, правда, это еще не видео, но вышесказанное можно спокойно сделать на WinAPI.

Цитата(ManiaK)

Ты будешь смеяться, я пересмотрел все темы, которые были на этом форуме по данной теме: все приходили к выводу, что даже с помощью DD видео не ухватить  По крайней мере стандартными способами.

Вот
Пример 1
Пример 2
Пример 3
Пример 4


там еще есть много чего ...






--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Leksey
Дата 3.8.2005, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



[quote]
правда, это еще не видео
[quote]
Вот, а нужно именно видео и чтобы во время записи не было тормозов на среднестатистическом компе.
С фоткой проблем нет.
Попробовал напрямую копировать рабочий целиком без всякой оптимизации в Avi поток .При расширении 1024x768 тормоза жуткие.

Добавлено @ 20:42
[quote]
правда, это еще не видео
[quote]
Вот, а нужно именно видео и чтобы во время записи не было тормозов на среднестатистическом компе.
С фоткой проблем нет.
Попробовал напрямую копировать рабочий целиком без всякой оптимизации в Avi поток .При расширении 1024x768 тормоза жуткие.

PM MAIL   Вверх
JoyEx
Дата 3.8.2005, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



Тогда просмотри внимательнее мой предыдущий ответ (Часть 2), где ссылки ПримерX



--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Fixin
Дата 3.8.2005, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Так ты что хочешь?
1) Записать (скопировать) видео, которое воспроизводится?
Или
2) Записать видео про то, как окошки открываются, мышка двигается и тп.
PM MAIL ICQ   Вверх
Leksey
Дата 3.8.2005, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



Цитата

2) Записать видео про то, как окошки открываются, мышка двигается и тп.

Вот вот оно самое!!!
PM MAIL   Вверх
Fixin
Дата 3.8.2005, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Ловишь указатель на Раб Стол (GetDesctopWindow), организуешь класс ДД на него, получаешь указатель на память и копируешь каждые х*100 мсек видеодамп. Скорость 24 Гц - в не надо. Достаточно 6-12 - сам смотри. И делай преобразование в 8 битную картинку. Для начала просто набор бмп-шек гони, потом можно и видео делать. Просто надо будет узнать, как кодеки юзать.

Это сообщение отредактировал(а) Fixin - 3.8.2005, 22:15
PM MAIL ICQ   Вверх
p0s0l
Дата 4.8.2005, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 3
Всего: 112



Цитата(JoyEx @ 3.8.2005, 20:05)
Вот
Пример 1
Пример 2
Пример 3
Пример 4
Чего-то я там не нашёл примера, который бы захватывал оверлеи... smile Можешь дать конкретный рабочий пример, который бы граббил содержимое оверлея ?...




--------------------
С уважением, г-н Посол.
PM   Вверх
Leksey
Дата 4.8.2005, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



Fixin сразу на диск писать не получается это слишком медленно.
Сделал по таймеру 1с запись всего рабочего стола в Avi поток, тормозит ужасно smile
PM MAIL   Вверх
ManiaK
Дата 4.8.2005, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 2
Всего: 29



Цитата(JoyEx @ 3.8.2005, 21:05)
Вот

Первый пример уловка, там грабление происходит не из проигрывателя, а из самого файла, насколько понял. Остальные интересней, спасибо smile
PM MAIL WWW   Вверх
Leksey
Дата 4.8.2005, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



Написал захват изображения в лоб по кадрам.
Беру по таймеру изображение в прямоугольнике и записываю в Avi поток по кадрам.
Неплохо получается при небольших размерах прямоугольника, но если весь рабочий стол,то жуткие тормоза.
Вот только курсор самому надо рисовать.
Возникает глюк- в MS Paint курсор карандаш, а у меня обычная стрелка?!
Пользуюсь функцией GetCursor(),а рисую DrawIconEx.
Никто не знает как это исправить?
Еще нашел в интернете пару ActiveX контролов,которые позволяют добавить в приложение запись экрана монитора, но они все платные.

PM MAIL   Вверх
Leksey
Дата 4.8.2005, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



И еще как можно избежать повторного копирования:
BitBlt
GetDIBits
AVIStreamWrite
Можно ли пропустить промежуточный шаг?

PM MAIL   Вверх
Fixin
Дата 4.8.2005, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Цитата(Leksey @ 4.8.2005, 10:24)
Fixin сразу на диск писать не получается это слишком медленно.
Сделал по таймеру 1с запись всего рабочего стола в Avi поток, тормозит ужасно smile

Сразу? Естественно. Надо по несколько кадров кучей и в отдельном потоке (программном).
Поток AVI тормозит из-за сжатия (возможно). Я бы делал собственный формат - один заголовок и далее набор кадров.

В любом случае, кадры нужно буферизировать.
Добавлено @ 20:58
Цитата
Вот только курсор самому надо рисовать.
Цитата
И еще как можно избежать повторного копирования:
BitBlt
GetDIBits
AVIStreamWrite
Можно ли пропустить промежуточный шаг?
Все это исправляется при прямом использовании видеобуфера. Надо поискать...
PM MAIL ICQ   Вверх
Fixin
Дата 4.8.2005, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Порылся в МСДН, но искал я всега плохо...
PM MAIL ICQ   Вверх
JoyEx
Дата 5.8.2005, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



Цитата(p0s0l @ 4.8.2005, 01:04)
Цитата(JoyEx @ 3.8.2005, 20:05)
Вот
Пример 1
Пример 2
Пример 3
Пример 4
Чего-то я там не нашёл примера, который бы захватывал оверлеи... smile Можешь дать конкретный рабочий пример, который бы граббил содержимое оверлея ?...

p0s0l
У тебя получается как в анекдоте, в военкомате:
Цитата

- Ну чё? Взяли?
- Да. А  тебя?
- Нет.
- А почему?
- Хм... К примеру, ты вон тот, желтый автобус на мосту видишь?
- Да.
- А я вот не вижу...


К примеру, Пример 1:

FrameGrabberdemo.zip – это проект для DirectShow

Чтобы скомпилировать этот проект:

0) Пропиши в VC++ пути к DirectX 9.0 SDK

1) Если будет fatal error LNK1181: cannot open input file 'Strmbase.lib', то тогда иди в \DX90SDK\Samples\C++\DirectShow\BaseClasses\ и компилируй проект, получишь Strmbase.lib, StrmbaseD.lib

У себя в проекте добавь в .cpp
Код

#pragma comment (lib,"..\\BaseClasses\\Debug\\strmbasd.lib")

или в св-вах проекта (через диалог)

2) Если компилятор не найдет CLSID-ы и IID-ы, то тогда следует подсунуть ему strmiids.lib

3) В функции CFrameGrabberDemoDlg::DoExtractFrame() исправь код, чтобы было примерно так:
Код

    long size = 0;
    pSampleGrabber->GetCurrentBuffer(&size, (long *)NULL);
    
    hr = pSampleGrabber->GetCurrentBuffer(&size, (long *)buffer);    
 


т.е. в переменную size необходимо записывать размер картинки и токо потом в битмап (через buffer) засовывать что-то.


4) В mt.subtype = MEDIASUBTYPE_RGB??? укажи правильный подтип, в зависмости от bpp экрана.



Видео обычно выводится через оверлей, но если видяха не поддерживает его аппаратно, то тогда программно эмулируется оверлей, а это значит, что тебе DirectX не нужен: из видеопамяти Рабочего стола, через HDC можно сграбить картинку. Ну, а если вывод осуществляется аппаратно, то тогда приходит на помощь интерфейс ISampleGrabber (чтобы увидеть окно с оверлеем - pVideoWindow->put_AutoShow(OATRUE);), т.е. проигрываешь видео и с помощью фильтров делаешь что хочешь.





--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
ManiaK
Дата 5.8.2005, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 2
Всего: 29



Модератор: Кхе-кхе... не отклоняемся от темы, господа smile
Добавлено @ 10:14
Смотрим сюды: http://forum.vingrad.ru/index.php?showtopi...40&st=0&hl=jpeg
Тырим код кодирования изображения в JPG. Далаем вот это:

Цитата(Leksey @ 4.8.2005, 15:16)
Беру по таймеру изображение в прямоугольнике и записываю в Avi поток по кадрам.

Только кодируя на лету. Из каждого кадра в 3 мега получаем примерно 40-50 кб. Тормоза должны уйти.
PM MAIL WWW   Вверх
Leksey
Дата 5.8.2005, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



Fixin я пробовал и с сжатием и без сжатия.
Если кодек нормальный то разница не очень большая.
А вообще хранить кадры целиком в виде кучи не очень красиво.
Слишком большой рост занимаемой оперативной памяти будет.


PM MAIL   Вверх
Leksey
Дата 5.8.2005, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



Ой я ошибся попробовал с кодеками Microsoft MPEG4- загрузка ЦП 100%, в то время как полные кадры 50% при захвате прямоугольника 500x500.
Maniak зачем самому кодировать,если можно использвать готовые кодеки?
PM MAIL   Вверх
ManiaK
Дата 5.8.2005, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 2
Всего: 29



Цитата(Leksey @ 5.8.2005, 11:51)
Maniak зачем самому кодировать,если можно использвать готовые кодеки?

Мне не очень понятно как эти кодеки могут работать. Как ты делаешь?..
PM MAIL WWW   Вверх
Leksey
Дата 5.8.2005, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



С помощью AviCompressedStream функции получаю указатель на stream/
Потом просто кадры не сжатые в него пишу.Если выбрать нормальный кодек, то размер файла получается очень маленький.
Кстати протестил две программки, которые тоже самое делают, они тоже сильно тормозят, когда 1024X768.
еще когда прямоугольник маленький они увеличивают количество кадров в секунду.
PM MAIL   Вверх
Leksey
Дата 5.8.2005, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



Как-то можно юзать DirectX для этих целей.
Недавно тестил программку, которая тем же занимается, она при 1024X768 30% процессора хавает, но почему то курсор мыши при этом мигает.
Правда из DirectDraw импортирует только DirectDrawCreate,как узнать как она это делает?
Похоже пора перемещаться на раздел DirectX.
PM MAIL   Вверх
ManiaK
Дата 5.8.2005, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 2
Всего: 29



Leksey проблема интересная, перемещайся smile
PM MAIL WWW   Вверх
p0s0l
Дата 5.8.2005, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 3
Всего: 112



Цитата(JoyEx @ 5.8.2005, 08:02)
1) Если будет fatal error LNK1181: cannot open input file 'Strmbase.lib'
Я так-то прогаю в Delphi, и меня интересуют не проблемы компилирования в VC, а способ решения задачи - как заграббить содержимое оверлея, созданного чужим (любым) процессом... Я так понял, ты описал способ, как заграббить содержимое оверлея при проигрывании фильма своим же процессом через DirectShow ?... Если неправильно тебя понял, то приведи плиз полный исходный код, если несложно...
А те 4 примера, что ты привел не работают для этой цели...
Первый пример - не то чтобы не граббит оверлеи, он даже из фильма не хочет грабить (запускал готовый .exe), да и причем здесь фильм ? smile, из названия понятно, что это не то что нужно.
Второй и третий пример - это получение изображений с различных устройств. Или есть возможность захватить то, что идёт на монитор ? Вряд ли... (эти примеры не стал пробовать...)
Четвертый пример - автор даже не упомянул об оверлеях... Впрочем, для пущей убедительности, я навсякий случай скачал пример и запустил - оверлеи не граббятся...

Цитата(JoyEx @ 5.8.2005, 08:02)
p0s0l
У тебя получается как в анекдоте, в военкомате:
Анекдот конечно смешной, но попрошу потактичнее общаться на форуме, есть правила поведения. Непонятно, как расценивать это анекдот относительно меня: то ли я слепой, то ли я претворяюсь слепым... Ни то, ни другое мне неприятно... Но на первый раз пока выставлять предупреждение тебе не буду, т.к. я не очень обидчивый smile.


--------------------
С уважением, г-н Посол.
PM   Вверх
JoyEx
Дата 6.8.2005, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



p0s0l

Самый простой вариант это перехватить API-вызов DirectDrawCreate() в чужом (или своём) процессе и тем самым получить интерфейс IDirectDraw, а затем можно с помощью lpDirectDraw->EnumSurfaces() найти оверлейную поверхность и lpDDSurface->GetDC (&hdc). Всё! Имея HDC оверлея делай чё хочешь smile

Если это подходит, то завтра дам пример.

PS Чё "бородатый" анектод рассказать нинзя?!



--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
JoyEx
Дата 6.8.2005, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



А в том примере №1, если не исправить ошибку (в п.4 я говорил уже о ней), то ничего не будет работать у "родного" FrameGrabberDemo.exe.


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
p0s0l
Дата 7.8.2005, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 3
Всего: 112



Цитата(JoyEx @ 6.8.2005, 22:03)
Самый простой вариант это перехватить API-вызов DirectDrawCreate() в чужом (или своём) процессе и тем самым получить интерфейс IDirectDraw, а затем можно с помощью lpDirectDraw->EnumSurfaces() найти оверлейную поверхность и lpDDSurface->GetDC (&hdc). Всё! Имея HDC оверлея делай чё хочешь
Подобная идея была уже у Олега, но имхо этот способ не катит, т.к. требуется сделать снимок экрана в данный момент, а чужие процессы могли создасться до нашего процесса. Реально задача может решиться, если каким-то образом быстро получить все интерфейсы директдрава всех процессов, но не через перехват DirectDrawCreate... Или напрямую с видяхой общаться, что так-то очень извратно...

Цитата(JoyEx @ 6.8.2005, 22:03)
Если это подходит, то завтра дам пример.
Не пример не надо, это не подходит smile


--------------------
С уважением, г-н Посол.
PM   Вверх
JoyEx
Дата 7.8.2005, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



P0S0L

Если в kernel-mode лезть, то тогда можно: хучить в VideoPort драйвере DriverInit(,DataPointer ,), из DataPointer получишь адреса DdUpdateOverlay(), DdXXX и т.п...

Цитата(p0s0l @ 7.8.2005, 10:22)

Цитата(JoyEx)

Если это подходит, то завтра дам пример.

Не пример не надо, это не подходит


И всё же smile
Посмотри аттачи, там мой bin1.zip и bin2.zip (для WinXP) – там loader.exe запускает overlay.exe и грузит в него spy.dll, которая перехватывает вызов DirectDrawCreate()¸тоже самое можно сделать и с CoCreateInstance(), а чтобы не пропустить более ранние процессы надо "пораньше вставать".

Это сообщение отредактировал(а) JoyEx - 8.8.2005, 13:40

Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  bin1.zip 31,80 Kb


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
JoyEx
Дата 7.8.2005, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



Вот второй .zip

Это сообщение отредактировал(а) JoyEx - 8.8.2005, 13:40

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  bin2.zip 17,33 Kb


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
p0s0l
Дата 7.8.2005, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 3
Всего: 112



За старания, конечно, спасибо! Я б и сам давно уже накатал бы, но это не катит, как я и говорил уже. Вставать пораньше не годиться... Вернее, это годиться, но не для всех задач...
Если уж вставать по-раньше, то проще вначале создать оверлейную поверхность, тогда уже другие программы будут обходиться без неё smile...
(это конечно шутка!)

PS: Архивы я скачал, но как там хоть какой-то результат-то получить ? smile Запустил значит Loader, ничего не происходит, а дальше чего ? smile Хотя в принципе это не важно...

В кернел моде хучить - тоже плохой выход smile (не лучше, чем DirectDrawCreate перехватывать)


--------------------
С уважением, г-н Посол.
PM   Вверх
JoyEx
Дата 7.8.2005, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



Цитата(p0s0l @ 7.8.2005, 14:24)
PS: Архивы я скачал, но как там хоть какой-то результат-то получить ?  Запустил значит Loader, ничего не происходит, а дальше чего ?  Хотя в принципе это не важно...


- Перед запуском Loader.exe не должен быть запущен overlay.exe, а если overlay.exe не может создать оверлей, то тогда закрой, например, проигрыватель с оверлеем или типа того. В Win9X мой пример работать не будет.

Это сообщение отредактировал(а) JoyEx - 7.8.2005, 15:27


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
p0s0l
Дата 7.8.2005, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 3
Всего: 112



Я так-то сразу и запускал loader... Щас убедился, что в процессах нет overlay.exe, запустил loader. Проигрыватели не запущены...
Лучше скажи, что я должен увидеть ? smile
Когда запускаю лоадер, в процессах на долю секунды появляется overlay.exe и исчезает...
У меня WinXP...



--------------------
С уважением, г-н Посол.
PM   Вверх
JoyEx
Дата 7.8.2005, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



overlay.exe создает в левом-верхнем углу оверлей типа "Hello, P0S0L! ...", а когда запускаешь через loader.exe - грузится spy.dll (через CreateRemoteThread()), вот она и подменяет адрес ф. DirectDrawCreate() на свой (в таблице импорта overlay.exe) и ждет, когда будет вызов DirectDrawCreate(). Ну вот, когда overlay.exe обратится к DirectDrawCreate(), то попадет в spy.dll и примерно через 1 сек. в оверлее меняется надпись на "Hello from Spy.dll".

p0s0l, тысяча извинений! Я там перепутал первую букву. smile пиво... блин

Уже исправил и переаттачил zip-ы.

Это сообщение отредактировал(а) JoyEx - 7.8.2005, 17:00


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
p0s0l
Дата 7.8.2005, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 3
Всего: 112



JoyEx, сейчас вроде получше, я хоть что-то вижу smile
Во, выдаёт:
smile

Присоединённый файл ( Кол-во скачиваний: 39 )
Присоединённый файл  err.gif 4,31 Kb


--------------------
С уважением, г-н Посол.
PM   Вверх
JoyEx
Дата 7.8.2005, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



Завтра вечером исправлю smile


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Leksey
Дата 7.8.2005, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



p0s0l и
JoyEx я надеюсь ,что не помешаю вам. smile
Написал два теста.
Один на DirectX, другой WinAPI:
WinAPI
Код

//hScreenDC-десктоп
//hMemDC-совместимый с hScreenDC
//stream обертка над API для работы с Avi файлами
  while (count<100)
  {
      count++;
      BitBlt(hMemDC,0,0,width,height,hScreenDC,0,0,SRCCOPY);
           GetDIBits(hMemDC,hBit,0,bmpInfo.bmiHeader.biHeight,buff,&bmpInfo,DIB_RGB_COLORS);
      stream.AddFrame(buff,FrameSize);
      Sleep(40);
  }

DirectX
Код

//lpDDS-внеэкранная поверхность в видео памяти
//lpDDSurface-первичная поверхность-рабочий стол
  while (count<100)
  {
      count++;
      lpDDS->BltFast(0,0,lpDDSurface,0,DDBLTFAST_WAIT|DDBLTFAST_NOCOLORKEY);
           lpDDS->Lock(0,&ddsd,DDLOCK_WAIT,0);
      stream.AddFrame(ddsd.lpSurface,ddsd.lPitch*ddsd.dwHeight);
           lpDDS->Unlock(ddsd.lpSurface);
      Sleep(40);
  }

Как вы думаете какой быстрее работает?
А вот и не угадали!!!
Быстрее работает первый!
Может кто-нибудь сможет объяснить?
PM MAIL   Вверх
ManiaK
Дата 8.8.2005, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 2
Всего: 29



Цитата(Leksey @ 7.8.2005, 23:45)
p0s0l и JoyEx я надеюсь ,что не помешаю вам.

Автор топика имеет полное право требовать закрытия флейма. Но мне показалась их беседа полезна - вдруг, наконец, решат?.. smile

Мне кажется тут из разряда "кувалдой кнопки вбивать". Скопировать изображение с рабочего стола, что на WinAPI, что на DX - одно и тоже. Никаких вычислений не требуется. Но в DX может быть куча всего, что тормозит в прогах вроде твоей. Первое, что бросается в глаза - вызовы функций Lock/Unlock. Даже если время на их вызов тратится незначительное при твоей скорости сканирования экрана это может оказаться весомым тормозом.
PM MAIL WWW   Вверх
JoyEx
Дата 8.8.2005, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



Leksey
Всё зависит от того, где размещены hMemDC и lpDDS. Если в системной памяти, то будет медленно, а если в видеопамяти – быстро, а самое главное - DirectX может сделать синхронизацию по кадрам (VSync!). Попробуй Lock/Unlock сделать вне while.

p0s0l
Я уже исправил и переаттачил zip-ы.


Это сообщение отредактировал(а) JoyEx - 8.8.2005, 14:55


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Leksey
Дата 8.8.2005, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



JoyEx не поверишь.
Задавал при создании внеэкранной поверхности размещение в видеопамяти.
На моем компе все равно через HDC быстрее было(Загруз процессора меньше).
А попробовал на другом компе на котором встроенная видюха, и не позволяет создавать в видеопамяти внеэкранную поверхность(создаю в системной, видеопамяти не хватает).
На нем вариант с DirectX быстрее работал,но только меню и курсор мыши мигают почему-то?
PM MAIL   Вверх
JoyEx
Дата 8.8.2005, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



Цитата(Leksey @ 8.8.2005, 14:58)
но только меню и курсор мыши мигают почему-то?

Windows получая прерывания от мышки пытается нарисовать курсор на экране, а в этот момент уже DirectX, наверное, заблокировала 1 видеостраницу.


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Leksey
Дата 8.8.2005, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



А как это исправить?
Если получается создать внеэкранную поверхность в видеопамяти, то мерцания не наблюдается.
PM MAIL   Вверх
p0s0l
Дата 8.8.2005, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 3
Всего: 112



JoyEx, теперь другая ошибка - 88760104...
(видяха поддерживает оверлеи, FX5600)...
Ладно уж буди не мучайся smile, всё равно данный способ не решает задачу в полной мере...



--------------------
С уважением, г-н Посол.
PM   Вверх
JoyEx
Дата 8.8.2005, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



Цитата(p0s0l @ 8.8.2005, 16:51)
88760104

- до запуска проги уже кто-то юзает оверлей :-)

Цитата(p0s0l @ 8.8.2005, 16:51)

всё равно данный способ не решает задачу в полной мере


- тогда остается токо делать фильтры-кодеки



--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
p0s0l
Дата 8.8.2005, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 3
Всего: 112



Цитата(JoyEx @ 8.8.2005, 17:38)
- до запуска проги уже кто-то юзает оверлей :-)
Никто не пользует smile (даж перезапускал комп), а если я запускаю проигрывать, то там работает оверлей...



--------------------
С уважением, г-н Посол.
PM   Вверх
JoyEx
Дата 9.8.2005, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



Цитата(p0s0l @ 8.8.2005, 16:51)
Ладно уж буди не мучайся , всё равно данный способ не решает задачу в полной мере...

Ok. smile

Leksey

Почему напрямую не берешь картинку из GDI-поверхности (из своей lpDDSurface, первичной?), через ddsd.lpSurface – это же базовый адрес “куска” видеопамяти (поверхности), который DirectDraw отобразил в твой процесс?! Будет же быстрее.
Токо вот, когда работаешь через HDC не надо думать о структуре видеопамяти, а если будешь делать типа memset(ddsd.lpSurface, 0x80, логич. ширина экрана * кол-во строк), то в режиме TrueColor24 (формат пикселя - 8:8:8), TrueColor32(8:8:8:8) всё будет хорошо, а вот в HiColor15 (1:5:5:5) или HiColor16(5:6:5) уже будут проблемы.


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Leksey
Дата 9.8.2005, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



Будет быстрее, но будет происходить мерцание меню.
Я так пробовал .
У MSVS менюшки дрожат.
Добавлено @ 13:16
JoyEx а почему будут проблемы с 16-битным режимом?
И еще почему картинка получается вверх ногами?
PM MAIL   Вверх
JoyEx
Дата 9.8.2005, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



Leksey

1) 0x80 - серый цвет для 24, 32 bpp экрана, а для 16bpp уже...е не серенький smile формат пикселя уже другой

2) BITMAPINFO > BITMAPINFOHEADER:
Цитата(MSDN)

biHeight
Specifies the height of the bitmap, in pixels. If biHeight is positive, the bitmap is a bottom-up DIB and its origin is the lower-left corner. If biHeight is negative, the bitmap is a top-down DIB and its origin is the upper-left corner.


Это сообщение отредактировал(а) JoyEx - 9.8.2005, 14:30


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Leksey
Дата 9.8.2005, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: 1
Всего: 1



Цитата

2) BITMAPINFO > BITMAPINFOHEADER:

Я говорю про пример на DirectX.
PM MAIL   Вверх
ManiaK
Дата 9.8.2005, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 2
Всего: 29



Дык формат хранения один и тот же должон быть. Разницы никакой.
PM MAIL WWW   Вверх
JoyEx
Дата 10.8.2005, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 4
Всего: 12



Видеопамять отображается на экран монитора слева направо и сверху вниз, если битмап аппаратно-зависимый (HBITMAP), то тогда у него структура картинки такая же как и у видеопамяти.

Ф-цию GetDIBits() можно "попросить", чтобы она вернула перевернутую картинку, и даже заказать другой bpp.



--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1492 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.