четверг, 5 марта 2009 г.

Сборка библиотеки avcap для Windows

Итак, поэкспериментировав с различными библиотеками захвата видео, я остановился
на кроссплатформенной библиотеке avcap. Сайт проекта находится здесь.
Отличная документация к библиотеке идет в пакете с проектом. Также, есть
простенький, но понятный пример использования.

Почему я выбрал именно avcap:
1. Кроссплатформенность.
Реализация под Windows использует DirectShow, под Linux - V4L, под Mac OS X - QuickTime.
2. Написана на C++.
3. Работает достаточно стабильно.
4. Легко интегрируется с С++ проектом.

Из минусов стоит отметить проблемную сборку под Windows.
Под Linux и Mac OS X сборка и установка не вызвала никаких проблем, стандартная процедура:
./configure
make
sudo make install

Для успешной сборки avcap под Windows (XP, Vista) необходимо подготовить следующее:
1. Установить Microsoft Visual Studio (2008).
2. Установить Microsoft DirectX SDK (2008 November).
3. Установить Microsoft Windows SDK 7.
4. Скопировать каталог
C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\Multimedia\DirectShow\BaseClasses\

например в C:\Temp.
5. Снять атрибут "Только чтение с BaseClasses".
6. Открыть baseclasses.sln, согласиться на конвертацию в новый формат.
7. Выбрать цель Debug.
8. В зависимости от проекта, возможно прийдется изменить Runtime Library на Multi-threaded Debug.
9. Собрать.
10. В настройках путей Visual Studio убедиться, что пути к DirectX SDK находяться ниже,
чем пути Windows SDK.


11. С предыдущего Platform SDK взять qedit.h и закоментировать в нем упоминания
dxtrans.h и IDXEffect. Этот файл можно положить в каталог baseclasses.


Настройка проекта avcap.
1. Открыть avcap.sln, согласиться сконвертировать.
2. В свойствах проекта указать:
Character Set: Use Unicode Character Set
Additional Include Directories: C:\Temp\BaseClasses;C:\Program Files\Microsoft SDKs\Windows\v7.0\Include";..\include\avcap\windows;..\include\avcap;
Runtime Library: Multi-threaded Debug (/MTd)
4. Открываем файл avcap\avcap\windows\ds_devicedescriptor.cpp
находим строчку (477) и правим ее:
wsprintf((LPWSTR)ws, L"FilterGraph %08x pid %08x\0", (DWORD_PTR)pUnkGraph, GetCurrentProcessId());

5.Собираем библиотеку.

В настройки приложения, которое будет использовать avcap, нужно добавить следующее:
в C/C++:
Preprocessor Definitions: AVCAP_WINDOWS
и в Linker:
Additional Dependencies: avcapd.lib strmbasd.lib uuid.lib ole32.lib winmm.lib strmiids.lib oleaut32.lib


Сборка была протестирована на Windows XP SP2 и на Windows Vista SP1.
Основной источник проблем заключался в порядке путей к заголовочным файлам,
так что будьте внимательнее.

Комментариев нет: