Как добиться плавности при захвате кадров?

Здравствуйте.
Есть программа, которая захватывает кадры с области монитора, сжимает их и записывает в avi:
char* frame = getFrame(); // Выполняется быстро
compress(frame); // Выполняется медленно
writeFrame(aviFile, frame);

Проблема в том, что нужно делать это с заданным fps, но обработка кадра занимает существенное время (выполняется на CPU) и fps не соблюдается. Посоветуйте пожалуйста как решить эту проблему?

P.S.:
Например, есть вариант с буферизацией кадров. Сырые кадры сначала пишутся в буфер в оперативной памяти с заданным fps. Обработка кадров и сохранение выполняется в отдельном потоке. Таким образом добиваемся нужной плавности ценой расхода оперативки и CPU. Можете дать пару советов как это лучше реализовать? Или поделиться ссылкой на статью/пример?

Или второй вариант (слабо в него верится) похож на первый: запускать функции compress и writeFrame асинхронно с помощью QtConcurrent::run. Это проще реализовать, но как это будет работать? Не возникнет ли слишком много потоков? Не возникнет ли конфликт при записи в файл?
  • Вопрос задан
  • 2383 просмотра
Пригласить эксперта
Ответы на вопрос 1
@NoseyParker
Захват кадра, на мой взгляд, лучше осуществлять по старинке - с помощью Bitblt. В основном потоке или нет захватывать - решать Вам. Но вот сохранять кадры и, тем более, обрабатывать их настоятельно рекомендую в отдельном потоке, дабы не влиять на FPS.
А чтобы Вы, по неосторожности, не нагородили всяких функций "сжатия" изображения, особое внимание обращаю на то, что Bitblt может в процессе захвата изменять размер изображения, а также формат цвета.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы