Как я могу оптимизировать свою утилиту для создания скринкастов? - PullRequest
4 голосов
/ 09 сентября 2010

Я разрабатываю утилиту для создания скринкастов на C ++.

Он в основном захватывает кадры рабочего стола и создает файл AVI. Алгоритм выглядит следующим образом:

  1. Создать тему: this->m_hThread=CreateThread(NULL,0,thScreenCapture,this,0,NULL);
  2. Захват рабочего стола за thScreenCapture n раз в секунду (например, 5 кадров в секунду).

    obj->Capture();

  3. В Capture () добавьте данные растрового изображения в файл avi.

    this->appendBitmapToAvi(this->avifile, bmp);

Эта утилита также записывает звук. Итак, в методе thScreenCapture звуковые данные также добавляются в avi-файл.

Проблема заключается в том, что между кадрами и звуком возникает задержка, когда в секунду записывается более 6 кадров (это может изменяться в зависимости от конфигурации оборудования).

Я ищу решение для оптимизации алгоритма. Решением может быть буферизация кадров в памяти, а не добавление их всех в файл avi на лету. Но это делает код более сложным, потому что мне приходится иметь дело со звуковыми данными, которые записываются в другом потоке.

Что вы предлагаете для увеличения значения fps, которое поддерживает эта утилита, без потери синхронизации?

Ответы [ 4 ]

1 голос
/ 20 сентября 2010

Вы пишете файл AVI самостоятельно?Благородное усилие, но есть API, которые помогут с этой задачей.

Если вы работаете на платформе Windows, я бы посоветовал рассмотреть возможность использования Media Foundation DirectShow или . API для мультиплексирования аудио и видео на диск.DirectShow - это API для захвата, потоковой передачи и мультиплексирования на платформе Windows.

В этой статье о CodeProject рассказывается о проблемах синхронизации аудио и видео и о механизмеDirectShow использует для преодоления этой трудности.

По существу, используются опорные часы, а кадры имеют временную метку.

Существует очень активное сообщество DirectShow , которое чрезвычайно полезноресурс для новых людей. Сайт TMH стоит проверить - он MS MVP и активный участник сообщества.

Надеюсь, это поможет!

1 голос
/ 18 сентября 2010

Используйте круговой двойной или тройной буфер для хранения растрового изображения и озвучивания каждого кадра и используйте отдельный поток для добавления растрового изображения и звука в avi.Таким образом, сбор данных происходит в одном потоке, данные находятся в круговом (поточно-ориентированном) буфере, а хранилище данных - в другом потоке.

1 голос
/ 09 сентября 2010

Вы можете взглянуть на источник для другого программного обеспечения для создания скринкастов , такого как CamStudio , чтобы узнать, как они это делают.

Если ваша программапривязка к диску (и я подозреваю, что это так), тогда все может улучшиться с помощью сжатия (именно так работают такие известные программы, как Camtasia Studio)

0 голосов
/ 09 сентября 2010

На какую ОС вы ориентируетесь?Если вы работаете в Windows XP, я бы взглянул на код DirectShow по адресу http://tmhare.mvps.org/downloads.htm,, в частности, Filter Graph Library.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...