Qt, Phonon и мультимедийные кодеки: как их связывать?

Я разрабатываю многоплатформенное (Windows, Linux и Mac) приложение на основе Phonon С++ на основе Qt, и я знаю, что сам Phonon - это только API, который полагается на бэкэнд для взаимодействия с установленными кодеками.

Логически, я должен предположить, что у конечного пользователя не установлены дополнительные кодеки, а только те, которые предоставляются ОС.

Итак, мой вопрос: возможно ли связать OGG (желательно) или AAC-декодер с моим приложением, чтобы бэкэнд распознал его и смог воспроизводить аудиофайлы? Какие шаги я должен предпринять в целом и где искать дополнительную информацию об этом?

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

Ответ 1

Как правило, вы можете предоставить VLC Phonon backend для Windows. По умолчанию резервная копия DirectX, к сожалению, довольно ограничена.

В Linux вы можете предположить, что подходящий фононный сервер поставляется с установкой OS Phonon. Два популярных в настоящее время бэкэнда - это GStreamer и VLC.

Ответ 2

Звуковые библиотеки для С++

Что касается получения правильных библиотек для воспроизведения звука, нужно просто выяснить, какие библиотеки используются Phonon в вашей системе. Я знаю, что Phonon - довольно большой проект, и у каждой ОС есть другой набор драйверов для воспроизведения мультимедиа и использования кодека и т.д. Я бы предложил посмотреть Audacity и VLC и проверив Google.

Плагины/Библиотеки и Qt

Что касается того, чтобы Phonon работал с Qt, у меня есть опыт там...

Я не проводил тонну тестирования с Phonon на каждой основной ОС, но у меня есть несколько разных версий Windows.

Развертывание приложения Qt очень прямое, даже с плагинами и библиотеками, такими как Phonon. Но выяснение этого в первый раз было немного болезненным, просто потому, что жаргон немного странный.

Мой ответ в контексте рабочего стола Windows с динамическим связыванием с библиотеками Qt, а не статичным.

Вот структура каталогов для окон и краткое описание того, как найдены dll.

Развертывание приложения Qt

Порядок поиска библиотеки Dynamic-Link в Windows

Для Mingw на Windows в Qt SDK есть папка для своих двоичных файлов, и в этой папке есть DLL, которые ваше приложение должно найти во время выполнения (если вы выполняете динамическое связывание). Я обычно помещаю эти DLL в ту же папку, что и EXE-приложение, которое я создаю в создателе Qt, а затем сохраняю "Рабочий каталог" или каталог, из которого выполняется EXE, и тот же каталог.

Для дополнительных плагинов/библиотек, предназначенных для определенных типов носителей, таких как форматы изображений и для фононов, вам необходимо иметь определенную структуру, в которой ваше приложение может найти ее.

Вы можете сделать некоторые очень специфичные для своего приложения и добавить их, используя функции, связанные с этим вызовом. QStringList QCoreApplication:: libraryPaths()

В общем, имитирует структуру каталогов, которую вы найдете в папке "плагины" MingW для дополнительных DLL, которые вам нужны.

Например, я хотел иметь возможность правильно отображать значок в системном трее. Очевидно, вам нужен правильный плагин для формата изображения, чтобы показать значок. (qgif4.dll, qico4.dll и qjpeg4.dll)

Здесь был плагин, расположенный на моей машине разработки:

"C:\QtSDK\Desktop\Qt\4.7.3\mingw\plugins\imageformats"

Здесь я помещаю его так, чтобы его можно было найти во время выполнения:

"C:\path\to\my\EXE\imageformats"

или

".\imageformats" (relative to my working directory of my EXE)

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