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

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 07.02.2017, 15:20   #1
IgoRek125
Пользователь
 
Регистрация: 20.03.2012
Сообщений: 47
По умолчанию 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 в 19:17.
IgoRek125 вне форума Ответить с цитированием
Старый 07.02.2017, 18:05   #2
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,519
По умолчанию

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

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

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

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

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

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

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

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


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

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

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

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 вне форума Ответить с цитированием
Старый 25.09.2020, 20:48   #6
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,519
По умолчанию

кто-то на этом форуме выкладывал исходник скриншотера, который использует различные кодеки для компрессии. но вот одна незадача - при попытке скомпилировать, вываливает кучу ошибок связанных с записью аудио. подключенные модули WaveUtils, WaveStorage, WaveRecorders, WaveMixer, WaveIO, WaveIn, WaveACM, msacm висят мёртвым грузом и не дают ничего, только приписанные в них типы не определяются и, видать, компилятор требует новых каких-то модулей. в итоге, решил просто убрать запись звука, оставив только видео, как мне и было нужно изначально. давно уже на него смотрел, вот, за пару вечеров вырезал всю неработающую аудионачинку. может, кому пригодится...
Вложения
Тип файла: rar Скриншотер.rar (439.0 Кб, 1 просмотров)
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 05.10.2020, 08:20   #7
nikolas0
Пользователь
 
Аватар для nikolas0
 
Регистрация: 18.12.2010
Сообщений: 85
По умолчанию

а не проще ли будет,нажимать кнопку print screen?копировать и,переименовывать в другой папке этот фото экрана.Какой кстати путь этого фото в Windows.
nikolas0 вне форума Ответить с цитированием
Старый 06.10.2020, 09:41   #8
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,519
По умолчанию

nikolas0,
нажимать вручную (физически) кнопку 25 раз в секунду? ну, Брюс Ли обзавидовался бы такой скорости...
а если программно нажимать - так я и делал, когда свою программу писал, потом автосохранение рисунков в папку. данный процесс выходит долгим, к сожалению....
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


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


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840