Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 07.02.2017, 16:20   #1
IgoRek125
Пользователь
 
Регистрация: 20.03.2012
Сообщений: 47
Репутация: 10
По умолчанию 25 скриншотов в секунду

Добрый день, дорогие друзья!
Хочу написать программу, которая будет делать 25 или даже 30 скриншотов в секунду. По сути получается видео. Но мне нужны именно скриншоты.

Вот текст программы:

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
    bmp : TBitmap;
    jpg : TJpegImage;
    i : integer;

begin
    For i:=1 to round(1000/SpinEdit1.Value) do begin     // в SpinEdit1 записано ко-во кадров в секунду.
        bmp := TBitmap.Create;
        bmp.Width := Screen.Width;
        bmp.Height := Screen.Height;
        BitBlt(bmp.Canvas.Handle, 0,0, Screen.Width, Screen.Height, GetDC(0), 0,0,SRCCOPY);

        jpg := TJpegImage.Create;
        jpg.Assign(bmp);
        jpg.CompressionQuality:=100;
        jpg.Compress;
        jpg.SaveToFile('kadr\'+label1.Caption+'.jpg');

        jpg.Free;
        bmp.Free;
        Label1.Caption:=IntToStr(FileName);
        FileName:=FileName+1;     // FileName - просто нумерация кадров.

    end;
end;
Если убрать jpg и сохранять скриншот прямо в bmp, то процесс ускоряется, но всё равно не достаточно. Да и всё равно bmp - это увесистый формат, большая идёт нагрузка на винчестер.

Проблема в том, что функция BitBlt слишком сильно нагружает компьютер и он банально не успевает справиться с поставленной задачей.

Можно ли использовать другой алгоритм, что бы ускорить процесс?
Или, может быть, возможно использовать изображение с экрана, как двумерный массив точек, перекидывать его в jpg и потом сохранять в файл?

Последний раз редактировалось Alex11223; 07.02.2017 в 20:17.
IgoRek125 вне форума   Ответить с цитированием
Старый 07.02.2017, 19:05   #2
NetSpace
Профессионал
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Адрес: п.Путеец, Печорский р-н
Сообщений: 1,410
Репутация: 537
По умолчанию

знакомое дело. максимум получается при незагруженности процессора другими задачами 15 нормальных кадров в секунду. 25-30 - уже начинает тормозить программа. давно уже как-то, года 4 назад была мысль по-максимум облегчить программу, урезав в библиотеках все неиспользуемые функции, оставив только используемые. а потом и в сами функции залезть похимичить, убрав оттуда всякие проверки на ошибки
1. как вариант: записывать скриншоты через каждые 6Мб в один файл в конец (размер файла может быть и до 15 Гб), для скорости, а в конце, когда запись с экрана остановил уже, чтоб эти файлы потихоньку оттудова извлекались и качественно записывались в папку. работа с потоками.
...вот сейчас когда расписал этот процесс, аж самому захотелось взять и реализовать...
а вообще, на исходник моего скриншотника, мож, чего и допилишь
Вложения
Тип файла: rar AutoImageScreen.rar (195.5 Кб, 23 просмотров)
__________________
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 07.02.2017 в 19:15.
NetSpace вне форума   Ответить с цитированием
Старый 07.02.2017, 19:10   #3
IgoRek125
Пользователь
 
Регистрация: 20.03.2012
Сообщений: 47
Репутация: 10
По умолчанию

Цитата:
Сообщение от NetSpace Посмотреть сообщение
а твой HTML-код в любом браузере работает????
В браузере по идее не должен работать )))

Но сработает в Delphi

Цитата:
Сообщение от NetSpace Посмотреть сообщение
1. как вариант: записывать скриншоты через каждые 6Мб в один файл в конец (размер файла может быть и до 15 Гб), для скорости, а в конце, когда запись с экрана остановил уже, чтоб эти файлы потихоньку оттудова извлекались и качественно записывались в папку. работа с потоками.
...вот сейчас когда расписал этот процесс, аж самому захотелось взять и реализовать...
а вообще, на исходник моего скриншотника, мож, чего и допилишь
1. Спасибо за исходник. Я его просматриваю. Кстати, у тебя там погрешность выходит по скорости съёмки. Чем больше кадров в секунду, тем больше погрешность. На 25 кадров в секунду, скриншоты делаются в два раза медленнее, чем должны. Но их число правильное получается.

2. Я не умею работать с потоками. Есть статья или учебник по потокам?

3. Я не совсем понимаю, как следить за объёмом файла. Ты предлагаешь просто записывать каждый скрин в один файл подряд, обновляя его? Потом, когда процесс останавливается, всю эту массу программа должна разобрать по отдельным файликам.
Но какой в этом смысл? Разве так будет плюс к скорости?
А если программа работает так час или даже два. Там ведь такая каша получится...

Мне кажется, что я просто не понял тебя.


Хотя, если брать и допустим каждую секунду кидать в один TBitmap 25 скринов подряд, увеличивая его размер лишь в памяти компьютера, а потом сразу все 25 кадров разом сохранить. И так столько времени, сколько хочется, пока место на диске не закончится.
Может так имеешь в виду?

Последний раз редактировалось Вадим Мошев; 08.02.2017 в 00:02.
IgoRek125 вне форума   Ответить с цитированием
Старый 07.02.2017, 23:24   #4
kropotkina-alice
Участник клуба
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Адрес: в России
Сообщений: 596
Репутация: 588
По умолчанию

Видать, поиск запрещен?
http://programmersforum.ru/showthread.php?t=23471
kropotkina-alice вне форума   Ответить с цитированием
Старый 22.01.2019, 16:44   #5
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Адрес: Московская Область, скверное место, не рекомендовал бы тут жить.
Сообщений: 359
Репутация: 248
По умолчанию

0. http://programmersforum.ru/showpost.php?p=1766869

1. Изменение Label1.Caption съедает время. А ещё нельзя просто совать GetDC(0) в параметры BitBlt(), у вас утечка из-за этого. Не говоря о том что GetDC(0) тоже съедает время, а его можно делать один раз и заранее.

2.
Цитата:
Сообщение от IgoRek125 Посмотреть сообщение
функция BitBlt слишком сильно нагружает компьютер
Никак нет.

3.
Цитата:
Сообщение от IgoRek125 Посмотреть сообщение
Если убрать jpg и сохранять
Цитата:
Сообщение от ResourceSpace Посмотреть сообщение
Стандартный TJPEGImage чудовищно тормознутый. Его удалить бы с корнями к чертям...
4.
Цитата:
Сообщение от IgoRek125 Посмотреть сообщение
что бы ускорить процесс?
Вот что в цикле точно делать не надо:
* TBitmap.Create;
* TJpegImage.Create;
* jpg.Free;
* bmp.Free;
Да и вообще, почему у вас цикл в OnTimer??
ResourceSpace вне форума   Ответить с цитированием
Ответ

Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Утилита для запрета скриншотов в Windows Davidrator Фриланс 30 17.01.2015 11:02
Программа для создания скриншотов экрана. Release Софт 17 06.08.2013 07:47
Создание скриншотов StretchBlt Andreyy Общие вопросы Delphi 1 19.07.2011 17:44
Программа для снятия скриншотов penek Фриланс 3 08.02.2011 18:42
Программа для снятия и пересылки скриншотов Neroxen Фриланс 3 11.09.2010 23:06


10:21.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.