使用Qt多媒体库Phonon库的心得体会
首先明确一点是Phonon不是Qt的主线(mainline)项目,它是KDE项目的一部分。所以我们看到它并不带有Q开头。但是这层封装实在是太好了,所以很多介绍Qt的书籍也一并介绍了Phonon库。
其次需要了解的是Phonon的地位。因为Phonon不是Qt项目,所以Qt项目为发展自己的多媒体库而提出了QtMultimedia模块。在最新的Qt5中,我没有看到Phonon的身影,甚至在Qt的新东家Digia的网站上,也鲜有介绍Phonon。这充分地说明Qt以后不会侧重于发展Phonon,而是发展QtMultimedia,同时也说明Phonon已经成熟。
最后说一下Phonon和QtMultimedia的关系。正如Qt文档中介绍,Phonon提供的是一系列高层的调用,而QtMultimedia是对媒体低层的调用。我曾经分别实现过使用微软的DirectMusic和DirectSound,我发现使用DirectMusic的接口丰富,可支持的文件格式众多,而DirectSound则需要自己对特定格式(如ogg)进行解码转为原生支持的格式(wav格式)才能播放。其实Phonon就相当于DirectMusic,QtMultimedia就相当于DirectSound。
在linux下使用Phonon库要比在Windows下使用要麻烦得多。因为在Linux下要使用特定的后端(backend)以插件的形式进行支持才行。Linux下的后端比较多,有VLC、Gstreamer等。这里以Ubuntu为例,因为默认的多媒体后端就是Gstreamer。
开始没有留意,原来诺基亚时代的Qt的Linux安装包已经有了Phonon的Gstreamer后端,如果编译Phonon出现了类似“cannotfind -lpulse-mainloop-glib”的错误,在Linux下可以执行“sudoapt-get install libpulse-dev”来安装libpulse,如果发现了
WARNING:bool Phonon::FactoryPrivate::createBackend() phonon backend plugincould not be loaded
WARNING:bool Phonon::FactoryPrivate::createBackend() phonon backend plugincould not be loaded
WARNING:bool Phonon::FactoryPrivate::createBackend() phonon backend plugincould not be loaded
WARNING:bool Phonon::FactoryPrivate::createBackend() phonon backend plugincould not be loaded
WARNING:bool Phonon::FactoryPrivate::createBackend() phonon backend plugincould not be loaded
WARNING:Phonon::createPath: Cannot connect Phonon::MediaObject ( noobjectName ) to Phonon::AudioOutput ( no objectName ).
WARNING:bool Phonon::FactoryPrivate::createBackend() phonon backend plugincould not be loaded
错误,那么需要安装gstreamer后端,命令是“sudoapt-get installphonon-backend-gstreamer”,安装完毕后找到phonon_backend文件夹(里面有libphonon_gstreamer.so文件,我的是在$QTDIR/plugins/里面找到的,诺基亚时自带的就是好)复制粘贴到生成程序的目录下。放心,应用程序会寻找到这个动态链接库的。
Phonon在各个平台的支持情况又如何?
我制作了一个小的实验程序,发现在新安装的WindowsXP(ghost版)下只能支持asf、avi、mpeg等“古老”的格式,而在新安装的Windows8下可以支持mp4等新的格式。但是总的觉得Phonon的后端所支持的格式实在是有限。一般来说,WindowsMediaPlayer能支持的格式,使用Phonon开发的程序也能支持。不过像我一样的开发者要开发后端的插件真的很难。所以在Windows下使用Phonon不能满足我们对于新格式的解码需求,这迫使我们使用另外一个Qt的另外一个组件——QtMultimedia。目前我实现了QtMultimedia下载入Ogg文件并且播放的方法。
而在Linux(我所熟悉的Ubuntu)下,由于Gstreamer的解码能力非常强,所以大部分主流格式都能够支持。
使用Phonon的VideoWidget时,需要注意它的虚成员函数paintEvent()是无法被重载,也就是说,你重载了了paintEvent()函数,也也无法让你的paintEvent()运行,可能因为VideoWidget不使用paintEvent()函数来负责渲染。