Я разрабатываю утилиту screencasting в C++.Как я могу оптимизировать мою утилиту screencasting?
Он в основном захватывает рамы рабочего стола и создает файл AVI. Алгоритм выглядит следующим образом:
- Создать тему:
this->m_hThread=CreateThread(NULL,0,thScreenCapture,this,0,NULL);
рабочий стол Capture в
thScreenCapture
н раз в секунду (например, 5 кадров в секунду).obj->Capture();
В Capture(), добавьте растровые данные в файл AVI.
this->appendBitmapToAvi(this->avifile, bmp);
Эта утилита также записывает звук. Таким образом, в методе thScreenCapture звуковые данные также добавляются в файл avi.
Проблема заключается в том, что между кадрами и звуком возникает задержка, когда в секунду фиксируются более 6 кадров (это может меняться в зависимости от конфигурации оборудования).
Я ищу решение для оптимизации алгоритма. Решением может быть буферизация кадров в памяти, а не добавление всех из них в avi-файл на лету. Но это делает код более сложным, потому что мне приходится иметь дело со звуковыми данными, которые захватываются в другом потоке.
Что вы предлагаете увеличить значение fps, поддерживаемое этой утилитой, без потери синхронизации?
вы должны рассмотреть directshow (см. Ответ ниже). Он использует опорные часы и временную привязку кадров мультимедиа для синхронизации аудио и видео. Хотя видеокадры предназначены для дискретных интервалов, звуковые кадры обычно изменяются по продолжительности. – 2010-09-20 12:34:19
Используйте DirectX. Вы уже увеличили приоритет процесса/потока? Кроме того, используйте один поток для захвата и предварительной обработки буфера изображения, а другой - для масштабирования & преобразования & безотносительно. Вы также можете определить количество процессоров/ядер и создать один поток на ядро, чтобы отложить эту обработку. И, к сожалению, я не знаю об аудио. – jweyrich