Трудности с Phonon
Содержание:
1. Введение ;
2. Трудности с Phonon (Вы читаете данный раздел);
3. Неясности с Phonon.
Я не хочу повторять документацию и приводить некие азбучные примеры по тому, как через Phonon проиграть mp3-файл. Я хочу рассказать о трудностях, с которыми вы столкнетесь, решив использовать Phonon в своей программе. Рассказать, но не решить - решать придется вам своим трудом.
Трудность первая - сборка программ, использующих Phonon, в Linux. Обычно Phonon устанавливается в системе как часть KDE. Вернее, плагины-бэкенды идут как плагины KDE, а сам Phonon выглядит как отдельная библиотека. Однако Phonon может быть собран и «внутри» Qt, поскольку входит в его состав. При этом, такой Phonon будет искать бэкенды в каталоге плагинов Qt, а не в каталоге плагинов KDE4. Такое положение дел совершенно естественно, когда в системе нет KDE4, однако есть Qt. Как правило, в системе «из коробки» или «из хранилища» Qt собрана без Phonon, а Phonon устанавливается отдельно и совершенно замечательно подхватывается системой сборки при обычном наборе команд:
Иначе же сборщику пакета или пользователю придется потрудиться, создавая символические ссылки на Phonon и его бэкенд, чтобы «исправить» пути.
Трудность вторая - сборка бэкенда Direct Show в Windows под MinGW/GCC. Считается, что это невозможно, поскольку GCC плохо сочетается с некоторыми заголовками из SDK, или наоборот - они с ним (зависит от того, с какой точки зрения смотреть). Пикантности положению придает тот факт, что именно собранная MinGW-версия Qt и распространяется Nokia, причем без Phonon. Умельцы научились компилировать пресловутый бэкенд и под MinGw, краткое описание процесса можно прочесть по ссылке: http://www.qtcentre.org/wiki/index.php?title=Building_the_Phonon_backend_plugin_on_Windows_using_MinGW. Ну, а если ваша цель - создание сайтов в Москве (http://newdesignlab.ru/services/sozdanie-saitov.html) по сборке Direct Show, то советую обратиться к опытным специалистам.
Однако рецепт этот тоже нельзя считать универсальным. Внимание, тут мы входим в область плясок с бубнами, горлового пения и так далее. Опишу свой опыт. Смысл хитрости сводится к тому, что нужно использовать заголовки DirectX из пакета kdewin32. Берем пакет из SVN KDE:
Распаковываем его, копируем файл comdef.h из kdewin32/ include/mingw в kdewin32/include/directx. Потом в исходниках Qt меняем начало файла
Внизу вместо «ПУТЬ _ К _ kdewin32» подставьте свой настоящий путь. После этого якобы должно собираться по qmake/make, но не компилируется. Заголовки вроде бы исправленные, однако все равно не те. Оказывается, не хватает описания нескольких структур из файла dvdmedia.h, а этот файл из состава официального SDK от Microsoft, как я уже написал, с MinGW «не дружит». Как быть? К счастью, у меня оказался установлен Perl для Windows - Strawberry Perl (strawberryperl.com). И в его состав входит - кто бы мог подумать? - заточенный нарочно для GCC заголовочный файл dvdmedia.h. Он находится в каталоге strawberry/c/include. Если у вас нет желания качать Strawberry Perl, возьмите один лишь dvdmedia.h с http://www.onlinedisk.ru/ file/136831. Копируем dvdmedia.h в подкаталог include каталога MinGw. После этого компилируем Phonon и его бэкенд. Теперь работает! Напомню, что для распространения собранной с Phonon программы надо будет скопировать в ее каталог файл phonon4.dll, а также создать подкаталог phonon_backend и поместить туда phonon_ds94.dll (берется из plugins/phonon_backend каталога Qt).

Другим, в какой-то степени более простым, способом использовать Phonon в программах для Windows является сборка Qt и ваших программ в Microsoft Visual Studio C++. Хотя в документации Qt написано, что надо предварительно установить еще и DirectX SDK, повозиться с установкой путей и запустить некий скрипт, в моем случае достаточно было тех заголовочных файлов, которые идут в составе MS Visual Studio 2008. Для сборки Qt в этой IDE надо сначала из сеанса, где установлены пути к Visual Studio (см. ярлык на командный процессор в подменю Visual Studio в «Пуске»), запустить программу configure.exe (в исходнике Qt), чтобы настроить исходник. Если вам не нужен WebKit, советую отключить его на уровне настройки - он компилируется очень долго. Также можно отключить OpenGL, если вам он не критичен. Иначе придется включать в дистрибутив программы. После настройки традиционный путь - это запуск nmake и ожидание, пока соберутся библиотеки и примеры. Но для сборки лучше не вызывать nmakе, а сделать с помощью qmake проект Visual Studio:
Тогда получится проект с расширением vcproj, который можно загрузить в Visual Studio и скомпилировать.
После этого вы можете собирать программы с Phonon. В Windows удобно иметь две версии Qt: одну - MinGW, а другую - самостоятельно собранную под Visual Studio. Разграничение между ними - через установку путей в .bat-файлах запуска командного процессора. У меня на это дело - два ярлыка запуска с разными переменными среды (для MinGW и для Visual Studio).
Но теперь возникает последняя проблема - распространение программ, собранных в Visual Studio. Для этого нужны файлы из состава Microsoft Visual C++: msvcr80.dll (число зависит от версии вашей Visual Studio), msvcp80.dll и другие. От версии к версии условия их видимости для программы меняются: раньше можно было просто скопировать в каталог программы, затем надо было указать их расположение через вызов функции qApp->addLibraryPath(), потом в определенных условиях это перестало работать - в общем, опять отдельная тема для разговора, в которую не будем углубляться (некоторые подробности можно найти в разделе Deploying an Application on Windows документации Qt).
Но есть универсальное решение. Включайте в установщик своей программы пакет Microsoft Visual C++ 2008 Redistributable Package (берется на сайте Microsoft) или давайте на него ссылку. Это чтобы не возиться с манифестами и тому подобным материалом. После установки пакета пользователем ваша программа запустится без всяких сложностей. Может оказаться и так, что у пользователя уже установлен этот пакет - сейчас многие программы содержат его вместе со своими установщиками и тоже предлагают при желании проинсталлировать.
1. Введение ;
2.
3. Неясности с Phonon.
Я не хочу повторять документацию и приводить некие азбучные примеры по тому, как через Phonon проиграть mp3-файл. Я хочу рассказать о трудностях, с которыми вы столкнетесь, решив использовать Phonon в своей программе. Рассказать, но не решить - решать придется вам своим трудом.
Трудность первая - сборка программ, использующих Phonon, в Linux. Обычно Phonon устанавливается в системе как часть KDE. Вернее, плагины-бэкенды идут как плагины KDE, а сам Phonon выглядит как отдельная библиотека. Однако Phonon может быть собран и «внутри» Qt, поскольку входит в его состав. При этом, такой Phonon будет искать бэкенды в каталоге плагинов Qt, а не в каталоге плагинов KDE4. Такое положение дел совершенно естественно, когда в системе нет KDE4, однако есть Qt. Как правило, в системе «из коробки» или «из хранилища» Qt собрана без Phonon, а Phonon устанавливается отдельно и совершенно замечательно подхватывается системой сборки при обычном наборе команд:
qmake make
make installИначе же сборщику пакета или пользователю придется потрудиться, создавая символические ссылки на Phonon и его бэкенд, чтобы «исправить» пути.
Трудность вторая - сборка бэкенда Direct Show в Windows под MinGW/GCC. Считается, что это невозможно, поскольку GCC плохо сочетается с некоторыми заголовками из SDK, или наоборот - они с ним (зависит от того, с какой точки зрения смотреть). Пикантности положению придает тот факт, что именно собранная MinGW-версия Qt и распространяется Nokia, причем без Phonon. Умельцы научились компилировать пресловутый бэкенд и под MinGw, краткое описание процесса можно прочесть по ссылке: http://www.qtcentre.org/wiki/index.php?title=Building_the_Phonon_backend_plugin_on_Windows_using_MinGW. Ну, а если ваша цель - создание сайтов в Москве (http://newdesignlab.ru/services/sozdanie-saitov.html) по сборке Direct Show, то советую обратиться к опытным специалистам.
Однако рецепт этот тоже нельзя считать универсальным. Внимание, тут мы входим в область плясок с бубнами, горлового пения и так далее. Опишу свой опыт. Смысл хитрости сводится к тому, что нужно использовать заголовки DirectX из пакета kdewin32. Берем пакет из SVN KDE:
svn checkout svn://anonsvn.kde.org/home/kde/trunk/kdesupport/
kdewin32Распаковываем его, копируем файл comdef.h из kdewin32/ include/mingw в kdewin32/include/directx. Потом в исходниках Qt меняем начало файла
src/plugins/phonon/ds9/ds9.pro на вот такое:
DESTDIR = $$QT _ BUILD _ TREE/plugins/phonon _ backend QT += phonon
win32:!win32-g++*:!wince*:contains(QT _ CONFIG,opengl):LIBS
+= opengl32.lib
win32:!win32-g++*:!wince*:LIBS += gdi32.lib
!win32-g++*:win32-msvc2005:DEFINES += _ CRT _ SECURE _ NO _ WARNINGS !win32-g++*:LIBS += strmiids.lib Dmoguids.lib uuid.lib msdmo.lib win32-g++*:contains(QT _ CONFIG,opengl):LIBS += -lopengl32 win32-g++*:LIBS += -lgdi32 -lstrmiids -lDmoguids -luuid
-lmsdmo -lole32 -loleaut32
TARGET = phonon _ ds9
DEFINES += PHONON _ MAKE _ QT _ ONLY _ BACKEND
PHONON _ DS9 _ DIR = $$QT _ SOURCE _ TREE/src/3rdparty/phonon/ds9
INCLUDEPATH +=ПУТЬ _ К _ kdewin32/include/directxВнизу вместо «ПУТЬ _ К _ kdewin32» подставьте свой настоящий путь. После этого якобы должно собираться по qmake/make, но не компилируется. Заголовки вроде бы исправленные, однако все равно не те. Оказывается, не хватает описания нескольких структур из файла dvdmedia.h, а этот файл из состава официального SDK от Microsoft, как я уже написал, с MinGW «не дружит». Как быть? К счастью, у меня оказался установлен Perl для Windows - Strawberry Perl (strawberryperl.com). И в его состав входит - кто бы мог подумать? - заточенный нарочно для GCC заголовочный файл dvdmedia.h. Он находится в каталоге strawberry/c/include. Если у вас нет желания качать Strawberry Perl, возьмите один лишь dvdmedia.h с http://www.onlinedisk.ru/ file/136831. Копируем dvdmedia.h в подкаталог include каталога MinGw. После этого компилируем Phonon и его бэкенд. Теперь работает! Напомню, что для распространения собранной с Phonon программы надо будет скопировать в ее каталог файл phonon4.dll, а также создать подкаталог phonon_backend и поместить туда phonon_ds94.dll (берется из plugins/phonon_backend каталога Qt).

Другим, в какой-то степени более простым, способом использовать Phonon в программах для Windows является сборка Qt и ваших программ в Microsoft Visual Studio C++. Хотя в документации Qt написано, что надо предварительно установить еще и DirectX SDK, повозиться с установкой путей и запустить некий скрипт, в моем случае достаточно было тех заголовочных файлов, которые идут в составе MS Visual Studio 2008. Для сборки Qt в этой IDE надо сначала из сеанса, где установлены пути к Visual Studio (см. ярлык на командный процессор в подменю Visual Studio в «Пуске»), запустить программу configure.exe (в исходнике Qt), чтобы настроить исходник. Если вам не нужен WebKit, советую отключить его на уровне настройки - он компилируется очень долго. Также можно отключить OpenGL, если вам он не критичен. Иначе придется включать в дистрибутив программы. После настройки традиционный путь - это запуск nmake и ожидание, пока соберутся библиотеки и примеры. Но для сборки лучше не вызывать nmakе, а сделать с помощью qmake проект Visual Studio:
qmake -t vcapp имя qt-проекта.proТогда получится проект с расширением vcproj, который можно загрузить в Visual Studio и скомпилировать.
После этого вы можете собирать программы с Phonon. В Windows удобно иметь две версии Qt: одну - MinGW, а другую - самостоятельно собранную под Visual Studio. Разграничение между ними - через установку путей в .bat-файлах запуска командного процессора. У меня на это дело - два ярлыка запуска с разными переменными среды (для MinGW и для Visual Studio).
Но теперь возникает последняя проблема - распространение программ, собранных в Visual Studio. Для этого нужны файлы из состава Microsoft Visual C++: msvcr80.dll (число зависит от версии вашей Visual Studio), msvcp80.dll и другие. От версии к версии условия их видимости для программы меняются: раньше можно было просто скопировать в каталог программы, затем надо было указать их расположение через вызов функции qApp->addLibraryPath(), потом в определенных условиях это перестало работать - в общем, опять отдельная тема для разговора, в которую не будем углубляться (некоторые подробности можно найти в разделе Deploying an Application on Windows документации Qt).
Но есть универсальное решение. Включайте в установщик своей программы пакет Microsoft Visual C++ 2008 Redistributable Package (берется на сайте Microsoft) или давайте на него ссылку. Это чтобы не возиться с манифестами и тому подобным материалом. После установки пакета пользователем ваша программа запустится без всяких сложностей. Может оказаться и так, что у пользователя уже установлен этот пакет - сейчас многие программы содержат его вместе со своими установщиками и тоже предлагают при желании проинсталлировать.