Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Asm для Windows/Dos > Как обратится напрямую к видеопамяти |
Автор: shedon 27.9.2004, 14:06 |
сабж собственно, вобщем хочу получить скриншот напрямую из видеобуфера. |
Автор: Akina 27.9.2004, 14:41 |
Нормально... в каком видеорежиме? или его еще определить надо? под какой ОС? или вообще платформонезависимо? на каком железе? или для всех мыслимых? Добавлено @ 14:42 а так - сэмулировать нажатие PrintScreen и перехватить вывод на печать (это под ДОСом... под Виндой вытянуть содержимое клипборды) ![]() |
Автор: shedon 27.9.2004, 14:54 | ||||
это не подходит
в любом, Win98/2k/XP/2k3, на любом железе |
Автор: oleg1973 28.9.2004, 13:30 |
ну так в виндосе, в ддраве, в опенжль ? там во всех 3х случаях по разному будет |
Автор: shedon 28.9.2004, 15:38 |
oleg1973 В виндосе.... |
Автор: oleg1973 1.10.2004, 02:30 |
1 HDC handle нада 2 сделать компатибиле контекст 3 битблит туда ну и все |
Автор: shedon 2.10.2004, 23:00 |
oleg1973 Этот способ не работает, при получение скриншота фильмов. |
Автор: oleg1973 2.10.2004, 23:03 |
shedon там наверняка через директ драв кино крутят из другого процесса нада подумать... |
Автор: shedon 2.10.2004, 23:05 |
Ну дак я в начале и спросил, как напрямую сграбить изображение из видеобуфера... |
Автор: oleg1973 2.10.2004, 23:13 |
ну из своего процесса не проблема а вот с чужого... а проги есть такого типа? я грабилки тока дектопа видел |
Автор: Victorier 17.10.2004, 12:43 |
А нельзя прочитать память B800:xxxx? |
Автор: oleg1973 17.10.2004, 13:11 |
в досе можно в виндосе нет |
Автор: p0s0l 17.10.2004, 15:48 |
Для проигрывания фильмов иногда или даже часто используются оверлеи (Overlay Mixer в Direct Show). Для проверки - запусти фильм и нажми PrintScreen. Далее запусти Paint (но фильм не закрывай и окно проигрывателя лучше не двигать), жми в нём Ctrl-V (вставить из буфера) - и прямо в Paint'е будет просматриваться фильм ![]() Возможно, повозившись с DirectDraw/DirectShow ты сможешь легально достать содержимое оверлеев, но я пробовал скриншотить фильмы с помощью HyperSnap-DX4 и CaptureSolution, которые якобы грабят и DirectX-овые игры и видеофильмы... Но эффект - как от обычного PrintScreen'а... ЗЫ: возможно, я ошибаюсь ![]() |
Автор: oleg1973 17.10.2004, 16:44 |
остается вариант написания драйвера для непосредственного чтения из видеопамяти |
Автор: p0s0l 17.10.2004, 23:58 |
oleg1973, а как ты узнаешь, в какой области видеопамяти хранится содержимое оверлея ? И какой области экрана этот оверлей соответствует ? Чем писать драйвер, имхо, легче сделать так, чтобы проигрыватели не могли использовать оверлеи - их максимальное количество ограничено, и если одна прога юзает оверлей, то другая уже не сможет ;) У меня, к примеру, видяха GF5600 держит максимум 1 оверлей - если запустить 2 проигрывателя, то второй уже будет нормально скриншотиться... |
Автор: p0s0l 18.10.2004, 01:27 |
Кстати, я тут посмотрел, похоже к видеопамяти есть прямой доступ без всяких прибамбасов. В директдраве у PrimarySurface делаем Lock ( + можно сразу же Unlock), при этом получаем адрес сурфейса. Этот адрес соответсвует базовому адресу видеопамяти (очень похоже на это). Читайте и пишите туда наздоровье, как говорится, только против оверлеев это не спасёт... |
Автор: oleg1973 18.10.2004, 09:36 |
Neo! оверлеев не бывает ![]() есть видеокарта и линейный кусок видепамяти адресс его находится елементарно далее найдя адр начала , логично предположить что достаточно скопировать к примеру 1024*768*3 байт чтоб получить копию LFB которая будет являтся непосредственной частью видео памяти которую мы видим на экране, внеэкранная нас в данный момент не интересует |
Автор: oleg1973 18.10.2004, 10:44 |
p0s0l совершенно верно при lock получаем адрес на видеопамять но тут есть нюанс ddraw позволяет делать эмуляцию в оперативе, если к примеру мала видеопамяти а нам нада 10 бэкбуферов, оно будет в оперативе хотя в принципе на результат не повлеяет осталось тока залесть в чужой процесс и сделать оттуда lock ![]() предлагаю написать враппер ddraw.dll который по нажатию там каких нить кнопок будет шкрин грабить ![]() |
Автор: p0s0l 18.10.2004, 17:06 | ||||||||
Можно тогда просто создать любой малюсенный сурфейс в видеопамяти (в dwCaps указав DDSCAPS_VIDEOMEMORY), делаем Lock, получаем адрес сурфейса, далее VirtualQuery выдаст базовый адрес региона (AllocationBase), то бишь начало видеопамяти.
Объясни почему ? Откуда такая уверенность ? Загляни в настройки видеопроигрывателя и ты скорее всего найдешь метод вывода. Например, в Zoom Player: Standart Renderer, Overlay Mixer, Video Mixing Renderer (VMR9). Если выставишь Overlay Mixer (а он выставлен по умолчанию), то при проигрывании фильма PrintScreen будет снимать вместо фильма черноту.
Проигрыватель закрашивает всю клиентскую область окна ключевым цветом оверлея, DirectShow рендерит фильм не на окно проигрывателя, а на невидимый оверлейный сурфейс. Поэтому и в куске видеопамяти, выводимой на экран, хранится только КЛЮЧЕВОЙ ЦВЕТ на месте оверлея, а то, что должно выводится вместо этого ключевого цвета (кадр фильма к примеру), тоже хранится в видеопамяти, но уже в другом куске памяти, и это и есть оверлей. Я себе представляют так: видяха при выводе на монитор читает последовательно видеопамять. Если есть хотя бы один видимый оверлей, она проверяет, входит ли выводимый пиксел в область оверлея, если да, то еще проверят, является ли считанный пиксел ключевым цветом, и если является, то вместо него выводит соотвествующий пиксел оверлея... |
Автор: oleg1973 21.10.2004, 12:34 |
p0s0l шас как тока будет свободная минутка попробую сделать грабилку, (ddraw.dll wrapper) |
Автор: p0s0l 21.10.2004, 12:40 | ||
oleg1973, почитай, главное выделено, из MSDN:
Т.е. если хочешь делать грабилку, то придётся грабить как ПримариСурфейс, так и Оверлейный Сурфейс... |
Автор: RuslanB 6.11.2004, 23:04 |
Вы мое спасенье!!! ![]() |
Автор: Byo 21.10.2005, 19:27 |
Нефиг спорить )) p0s0l абсолютно прав . так что удачи в поисках ). |
Автор: JoyEx 3.12.2005, 19:59 |
Касательно Win!!! ![]() Лучше всего иметь у себя PRM (Programmer's Reference Manual) на свою видяху. Например, http://www.intel.com/design/chipsets/manuals/29823701.pdf и затем работать напрямую А если по-умному, то лучше изучить http://www.osronline.com/ddkx/graphics/vidintro_9tev.htm и делать драйверок. p0s0l, с Днем Варенья тебя! |
Автор: JoyEx 5.12.2005, 10:36 |
И потом, напрямую адрес (>0x80000000) видеопамяти получить можно, а вот вычислить внеэкранную будет намного сложнее. Еще можно вспомнить об основных VGA регистрах, чтобы попытаться сделать что-то нехорошое с видяхой. |
Автор: oleg1973 5.12.2005, 11:34 | ||
ну если в досе все делать то там можно получить данные о установленом видеорежиме и в том же массиве есть адрес (линейный) видеобуффера |
Автор: JoyEx 5.12.2005, 11:52 |
oleg1973 ДА. shedon Через HDC проще всего сделать и потом сразу забыть о проблеме. В DVD самое ценное это меню, а через видяху DVD-менюшку не сграбить. Если тебе нужно типа VHS, то тогда дерзай! |