Phonon MinGW 编译指南 March 4th, 2009 by vinsonlv
想了解Phonon的请看前文http://c-home.appspot.com/2009/03/2/phonon_pic.html
这里说下怎么用MinGW编译Phonon
网上可以找到一些文章关于MinGW+Phonon的,几乎都说MinGW。但是从上文的分析可以知道,Phonon只是一个接口,根本不存在平台相关性。连Qt文档里也仅仅是说:
Warning: The MinGW version of Qt does not support building the Qt backend.
也就是说MinGW可以编译Phonon!不能编译的仅仅是后端插件。至于原因,大概是因为DirectX 的SDK和MinGW的兼容性不怎么好吧。后端问题下面另有解决方案!
所以用MinGW编译Phonon很简单,在Qt做configure的时候加上phonon的选项就可以,编译phonon-backend的选项最好还是去掉,加了也只会给之后的编译造成麻烦,具体参数用configure --help查询。
configure完成之后,如果你做出改动的只有Phonon库,那你完全不必把Qt的其他部分一一编译,只需进入src/phonon/,把phonon编译即可。在这过程中一般不会发生问题,编译完成后,你就在lib/里得到了phonon的库文件了(默认是动态库)
此时,你的phonon程序已经可以编译了。你可以把Qt demo中的mediaplayer和musicplayer拿来编译,都可以生产可执行文件,也可以执行。但是运行时会弹出phonon backend plugin could not be loaded 。这就是缺少后端插件的情况,这时的程序除了显示出界面什么都不能干。
接下去我们就要想办法找一个可以控制音视频解码播放的后端,并且写一个插件让phonon可以调用这个后端。基本上,这是一件相当麻烦的事情。幸好有高人已经替我们把烦人的事情都做了。
phonon-vlc-mplayer是一个用vlc或者mplayer来做phonon后端的项目,他提供了vlc/mplayer的后端插件源码。现在发布的版本只支持mplayer了,因为支持vlc的版本另外有人写了,链接可以在上面找。详细的情况都可以在该项目主页上查到。
但这个项目不能直接拿来用,因为他使用了比Qt所带的更新版本的phonon库,和Qt自带库不匹配。要么替换掉Qt的phonon库到最新版,要么就是改插件。其实最新版的增加功能也就字幕和声道切换,为了保证最大兼容性,咱们还是改插件吧。
这里提供改好的插件源代码:phonon-mplayer.zip
项目管理我已经改成qmake了。首先进入libmplayer子目录编译,将mplaye的控制端编译成静态库。
qmake
make
在release文件夹下生成的libmplayer.a就是静态库。把这个文件copy到libmplayer子目录下。
然后再到回到phonon-mplayer目录编译即可得到插件。
把编译完的插件(dll文件)拷贝到Qt主目录下的plugins/phonon_backend。之后你的程序中的Phonon就能找到他了。
但这时你还不能用,因为你还没有作为后端的mplayer。
网上去找个好用的mplayer下载了,把mplayer.exe和相关文件拷贝到 程序主目录/mplayer/ 下,你的插件就能调用mplayer了。这时,你的程序就能正常地播放音频视频了。
其他的注意事项:
- 例程中的capabilities我一直无法编译,每次都是gcc出段错误,这是MinGW的问题。或许换4.0+版本的MinGW可以解决。
- mplayer不提供音效选项
- Qt的插件机制非常严格,在加载时会核对库版本和编译器版本,不同的不会加载,所以你如果更换了编译器,可能仅仅是很小的版本变化,你的程序也可能出现phonon backend plugin could not be loaded 的情况。请保证你的phonon库,你的程序,以及你的后端插件由同一编译器编译,不然可能造成不可知的错误。
- phonon-mplayer在编译后会产生debug和release2个版本。如上条,插件检查机制非常严格,所以这两个版本就分别对应你自己程序的编译形式。好在phonon的插件检查是不按照文件名的,所以你把2个dll改成不重名都拷贝到插件目录中去,程序是会自动识别对应的插件的。
- 发布程序时请将插件放在 程序主目录/phonon_backend/ 下即可,注意只需要release版就可以了,如果你还没蛋疼到发布debug版的话
嗯,不错!小白也来顶一下!
我想问下,按照文中描述,编译Qt的demo中的mediaplayer,已经可以运行,但是依然不能播放文件,显示mplayer process not running,同时会弹出Mplayer的播放界面,这是什么原因呢,盼解答,谢谢!
你说的的Mplayer是什么版本,相关文件又是哪些呢?
我用的是Qt4.5,会是这个原因吗?
為什麼用mingw32無法編譯phonon的plugins
可以說一下為什麼嗎?
Mplayer版本无所谓
mingw32無法編譯phonon的plugins 是因为mingw不认directx的sdk
你不放心的话就用smplayer的mplayer好了,那个确认可以用
不好意思,可以再問看看:
"首先進入libmplayer子目錄編譯,將mplaye的控制端編譯成靜態。"
這裡要下什麼指令才可以編譯成靜態呢?
我是下
qmake
make
再到回到phonon-mplayer
再下
qmake
make
但是卻出現錯誤訊息
Effect.cpp: In member function `virtual QVariant Phonon::MPlayer::Effect::parameterValue(const Phonon::EffectParameter&) const':
f:/Qt/Qt4.5.1/include/QtCore/../../src/corelib/kernel/qvariant.h:413: error: `QVariant::QVariant(void*)' is private
Effect.cpp:88: error: within this context
mingw32-make[1]: *** [debug/Effect.o] Error 1
mingw32-make[1]: Leaving directory `F:/Jamie/06.BackUp/98-04/98-04-14-00/phonon-mplayer'
mingw32-make: *** [debug-all] Error 2
你把那行
return new QVariant();
改成
QVariant temp();return temp;
试试
估计是mingw版本问题。你用的gcc4+?
謝謝你的解答
我用的mingw版本是MinGW-5.1.4,不過我不太清楚是不是gcc4+?
我把"Effect.cpp"和"MediaController.cpp"的
"return new QVariant();"改成"QVariant temp();return temp;"
編譯成功了,不過並沒有看到dll檔,只看到"libphonon_mp.a"和"*.o"
……
我给的pro应该是没问题的
那我可以再問一下
我在編譯Qt4.5.0時的參數
"configure -debug-and-release -static -fast -phonon -webkit
-no-phonon-backend"
結束後"mingw32-make"
所以想問看看是不是我參數有錯所以才會無法編譯成功
不好意思~~問了一些很...的問題
你把qt静态编译了
我不清楚静态编译的情况下,plugin是怎么工作的,所以我也不好说
你去文档里查下静态编译后的plugin是怎么工作的吧
嗯~~~謝謝你的解答
那我再試試看了
我在QT 4.5.1(qt-sdk-win-opensource-2009.02.exe)下
qmake
mingw32-make
再到回到phonon-mplayer
再下
qmake
mingw32-make
也出現錯誤訊息
Effect.cpp: In member function `virtual QVariant Phonon::MPlayer::Effect::parameterValue(const Phonon::EffectParameter&) const':
f:/Qt/Qt4.5.1/include/QtCore/../../src/corelib/kernel/qvariant.h:413: error: `QVariant::QVariant(void*)' is private
Effect.cpp:88: error: within this context
mingw32-make[1]: *** [debug/Effect.o] Error 1
mingw32-make[1]: Leaving directory `F:/Jamie/06.BackUp/98-04/98-04-14-00/phonon-mplayer'
mingw32-make: *** [debug-all] Error 2
但是我把"Effect.cpp"和"MediaController.cpp"的
"return new QVariant();"改成"QVariant temp();return temp;"
編譯成功了,有phonon_mp4.dll 和libphonon_mp4.a 文件。
总之,按照本文所述,最终我听到了音乐。
感谢感谢感谢感谢!!!!
为什么我编译后,不能打开mplayer?我将mplayer内的文件都考到程序的mplayer文件夹下了。
受益,多谢!
代码编译有错,在libmplayer下通过前两个命令可以生成.a文件,但是,返回去编译工程代码的时候出现了十一个错误,不知道为什么?等待楼主回复!
我没出错……你出什么错,我可不知道
D:\Qt\2009.01\mingw\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\mingw32\bin\ld.exe:
cannot find -lphonond
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\phonon_mp.dll] Error 1
请问lz这是什么原因?谢谢
debug坂本的phonon库没有编译
非常感谢lz的回答!
我是新手,不好意思,编译debug坂本的phonon库如何实现。
我的步骤是这样的:
我在QT 4.5.0下
进入到phonon-mplayer \libmplayer
qmake
mingw32-make
成功
再到回到phonon-mplayer
再下
qmake
mingw32-make
出错。
编译debug坂本的phonon库是在那个步骤时实现的呢
参照文档