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了。这时,你的程序就能正常地播放音频视频了。

其他的注意事项:

  1. 例程中的capabilities我一直无法编译,每次都是gcc出段错误,这是MinGW的问题。或许换4.0+版本的MinGW可以解决。
  2. mplayer不提供音效选项
  3. Qt的插件机制非常严格,在加载时会核对库版本和编译器版本,不同的不会加载,所以你如果更换了编译器,可能仅仅是很小的版本变化,你的程序也可能出现phonon backend plugin could not be loaded 的情况。请保证你的phonon库,你的程序,以及你的后端插件由同一编译器编译,不然可能造成不可知的错误。
  4. phonon-mplayer在编译后会产生debug和release2个版本。如上条,插件检查机制非常严格,所以这两个版本就分别对应你自己程序的编译形式。好在phonon的插件检查是不按照文件名的,所以你把2个dll改成不重名都拷贝到插件目录中去,程序是会自动识别对应的插件的。
  5. 发布程序时请将插件放在 程序主目录/phonon_backend/ 下即可,注意只需要release版就可以了,如果你还没蛋疼到发布debug版的话

Relate Posts:

Tags: MinGW Phonon Qt Mplayer

Posted in Qt |

21 Responses to “Phonon MinGW 编译指南”

  1. jude On

    嗯,不错!小白也来顶一下!

  2. nightsea On

    我想问下,按照文中描述,编译Qt的demo中的mediaplayer,已经可以运行,但是依然不能播放文件,显示mplayer process not running,同时会弹出Mplayer的播放界面,这是什么原因呢,盼解答,谢谢!
    你说的的Mplayer是什么版本,相关文件又是哪些呢?
    我用的是Qt4.5,会是这个原因吗?

  3. jamie On

    為什麼用mingw32無法編譯phonon的plugins
    可以說一下為什麼嗎?

  4. vinsonlv On

    Mplayer版本无所谓

    mingw32無法編譯phonon的plugins 是因为mingw不认directx的sdk

  5. vinsonlv On

    你不放心的话就用smplayer的mplayer好了,那个确认可以用

  6. jamie On

    不好意思,可以再問看看:
    "首先進入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

  7. vinsonlv On

    你把那行
    return new QVariant();
    改成
    QVariant temp();return temp;
    试试

    估计是mingw版本问题。你用的gcc4+?

  8. jamie On

    謝謝你的解答
    我用的mingw版本是MinGW-5.1.4,不過我不太清楚是不是gcc4+?
    我把"Effect.cpp"和"MediaController.cpp"的
    "return new QVariant();"改成"QVariant temp();return temp;"
    編譯成功了,不過並沒有看到dll檔,只看到"libphonon_mp.a"和"*.o"

  9. vinsonlv On

    ……
    我给的pro应该是没问题的

  10. jamie On

    那我可以再問一下
    我在編譯Qt4.5.0時的參數
    "configure -debug-and-release -static -fast -phonon -webkit
    -no-phonon-backend"
    結束後"mingw32-make"
    所以想問看看是不是我參數有錯所以才會無法編譯成功
    不好意思~~問了一些很...的問題

  11. vinsonlv On

    你把qt静态编译了
    我不清楚静态编译的情况下,plugin是怎么工作的,所以我也不好说
    你去文档里查下静态编译后的plugin是怎么工作的吧

  12. jamie On

    嗯~~~謝謝你的解答
    那我再試試看了

  13. yysr On

    我在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 文件。
    总之,按照本文所述,最终我听到了音乐。

    感谢感谢感谢感谢!!!!

  14. hyj On

    为什么我编译后,不能打开mplayer?我将mplayer内的文件都考到程序的mplayer文件夹下了。

  15. jklbupt On

    受益,多谢!

  16. user On

    代码编译有错,在libmplayer下通过前两个命令可以生成.a文件,但是,返回去编译工程代码的时候出现了十一个错误,不知道为什么?等待楼主回复!

  17. vinsonlv On

    我没出错……你出什么错,我可不知道

  18. love425429 On

    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这是什么原因?谢谢

  19. vinsonlv On

    debug坂本的phonon库没有编译

  20. love425429 On

    非常感谢lz的回答!
    我是新手,不好意思,编译debug坂本的phonon库如何实现。
    我的步骤是这样的:
    我在QT 4.5.0下
    进入到phonon-mplayer \libmplayer
    qmake
    mingw32-make
    成功
    再到回到phonon-mplayer
    再下
    qmake
    mingw32-make
    出错。
    编译debug坂本的phonon库是在那个步骤时实现的呢

  21. vinsonlv On

    参照文档

Leave a Reply

7+5