2010-09-08 5 views
4

Я разрабатываю утилиту screencasting в C++.Как я могу оптимизировать мою утилиту screencasting?

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

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

    obj->Capture();

  3. В Capture(), добавьте растровые данные в файл AVI.

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

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

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

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

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

+0

вы должны рассмотреть directshow (см. Ответ ниже). Он использует опорные часы и временную привязку кадров мультимедиа для синхронизации аудио и видео. Хотя видеокадры предназначены для дискретных интервалов, звуковые кадры обычно изменяются по продолжительности. – 2010-09-20 12:34:19

+0

Используйте DirectX. Вы уже увеличили приоритет процесса/потока? Кроме того, используйте один поток для захвата и предварительной обработки буфера изображения, а другой - для масштабирования & преобразования & безотносительно. Вы также можете определить количество процессоров/ядер и создать один поток на ядро, чтобы отложить эту обработку. И, к сожалению, я не знаю об аудио. – jweyrich

ответ

1

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

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

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

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

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

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

+0

Спасибо за консультацию. Я использую библиотеку AVI с открытым исходным кодом, которая работает очень хорошо. Я решил так много проблем, как добавление mp3-аудиоданных (которые нуждались в дополнительной информации заголовка и потребовались дни, чтобы узнать). Теперь мне нужно ускорить мой захват двигателя. – Zafer

1

Вы можете посмотреть источник для other screencasting software, например CamStudio, чтобы посмотреть, как они это делают.

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

+0

Да, это диск, поэтому я сжимаю кадры с отличным кодеком Xvid, о котором я не упоминал в моем вопросе. – Zafer

+0

@Zafer: Тогда вам понадобятся данные о буфере памяти, или вам придется разработать собственный кодек. Это то, что сделали люди Camtasia, - я имею в виду их собственный кодек. DivX и XviD хороши для общего видеоролика, но есть больше оптимизаций, которые можно сделать для скринкастов. –

+0

Знаете ли вы ресурсы о разработке кодеков? – Zafer

0

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

+0

Спасибо за ссылку. Я нацелен на Win XP, Vista и 7. – Zafer

1

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

+0

A/V кадры должны быть синхронизированы! Буферизация не решит эту проблему! – 2010-09-20 08:04:46

+0

Правильно. Я использую отдельные потоки для сбора видео и аудиоданных, но добавляю их в AVI-файл синхронно для чередования. – Zafer

+0

@freefallr Итак, Zafer делает это чередующимся образом, что означает, что сбор данных в основной нити и хранение в другом потоке будет иметь больше смысла. Поправьте меня если я ошибаюсь. –

Смежные вопросы