前几天开始用Qt中的第三方插件——Phonon模块进行多媒体应用程序的编写。Phonon提供了很方便的方法来实现音频视频文件的播放,在实现音频播放器的功能时没有问题,但是在使用VideoWidget类实现视频文件播放功能时遇到一个莫名其妙的问题:在编译链接过程中没有提示任何警告和错误,而程序运行起来之后,QtCreator在Starting提示之后多了一条警告:
WARNING: Phonon::createPath: Cannot connectPhonon::MediaObject ( no objectName ) to Phonon::VideoWidget ( no objectName ).
这是第一次看到在ApplicationOutput中出现WARNING而build issues和compile output完全没有异常信息。然后添加文件等功能正常,点击播放后却没有反应。检查代码,类的用法和Qt帮助文档中的例子完全一样。确信代码没有问题之后,尝试运行demos下的qmediaplayer样例,也是同样的情况。
将WARNING信息在百度上搜索之后,发现这果然是Qt库本身存在的bug,着实让人对其有点小失望。VideoWidget类的源代码实现有问题。优快云上有一篇博客讲到了这个问题并提供了解决办法,可惜关于补丁文件的使用方法没有说明,令我这种菜鸟级的人相当无奈。原文地址http://blog.youkuaiyun.com/hanzengyi/article/details/6319120。
根据所给的链接在Qt官网下载了补丁文件后,发现是txt格式的,打开一看,无从下手,不知道怎么把这个补丁打上去。只好再求助百度,结果出来的搜索结果几乎全都是某某游戏补丁怎么装=.=顿时觉得自己勤奋得不行了……勤奋归勤奋,问题还是摆在那里,从网上找不到关于txt格式补丁怎么用的方法,一下子没有了办法。
今天早上试图用Qt自己的低端的多媒体类来重写代码,但是看帮助文档和自带的例子发现这貌似是一件很麻烦的事情,用起来比较复杂,不知道要搞到神马时候才能搞出来,于是乎一懒,又回到了那个补丁文件上面。换着说法在百度和谷歌上搜索,然后一页页往后翻,终于搜到了一篇关于Linux下生成源码补丁文件的日志。早该想到了,不应该搜txt补丁文件怎么用,既然是人做的补丁文件,那就应该搜它是被怎么做出来的,知道怎么做的也就知道了怎么用。
其实那个补丁文件的用法还是比较简单的(主要是因为文件改动的地方比较集中比较少),对文件内容如何修改的描述其实很清楚。我直接把修改方法说明如下:
1.删除Qt安装目录下 src/3rdparty/phonon/ds9/videorenderer_evr.cpp与 src/3rdparty/phonon/ds9/videorenderer_evr.h这两个文件;
2.找到Qt安装目录下src/3rdparty/phonon/ds9/videowidget.cpp,首先删除或者注释掉#include "videorenderer_evr.h",然后在第360行左右,将
AbstractVideoRenderer*renderer = 0;
if (type == Native) {
#ifndef Q_OS_WINCE
renderer = newVideoRendererEVR(m_widget);
if (renderer->getFilter() == 0) {
delete renderer;
//EVR not present,let's try VMR
renderer = new VideoRendererVMR9(m_widget);
if (renderer->getFilter() == 0) {
//instanciating the renderermight fail
m_noNativeRendererSupported = true;
delete renderer;
renderer = 0;
}
}
#else
renderer = newVideoRendererDefault(m_widget);
这段代码修改为:
AbstractVideoRenderer*renderer = 0;
if (type == Native) {
#ifndef Q_OS_WINCE
renderer = newVideoRendererVMR9(m_widget);
if (renderer->getFilter() == 0) {
m_noNativeRendererSupported = true;
delete renderer;
renderer = 0;
}
#else
renderer = newVideoRendererDefault(m_widget);
3.找到Qt安装目录下src/plugins/phonon/ds9/ds9.prob/src/plugins/phonon/ds9/ds9.pro,将第54行开始的
#the EVR renderer (onlyavailable on desktop)
!wince*:SOURCES += $$PHONON_DS9_DIR/videorenderer_evr.cpp \
$$PHONON_DS9_DIR/videorenderer_vmr9.cpp
!wince*:HEADERS += $$PHONON_DS9_DIR/qevr9.h \
$$PHONON_DS9_DIR/videorenderer_evr.h \
$$PHONON_DS9_DIR/videorenderer_vmr9.h
wince*:SOURCES +=$$PHONON_DS9_DIR/videorenderer_default.cpp
wince*:HEADERS +=$$PHONON_DS9_DIR/videorenderer_default.h
这一段改为:
#the EVR renderer (only available on desktop)
!wince*:SOURCES += $$PHONON_DS9_DIR/videorenderer_vmr9.cpp
!wince*:HEADERS += $$PHONON_DS9_DIR/qevr9.h \
$$PHONON_DS9_DIR/videorenderer_vmr9.h
wince*:SOURCES +=$$PHONON_DS9_DIR/videorenderer_default.cpp
wince*:HEADERS +=$$PHONON_DS9_DIR/videorenderer_default.h
源代码文件的修改就这样,然后重新编译经修改的ds9.pro工程。编译过程中会一次次报错:moc_xxx.cpp: No such file or directory,只需要定位错误的位置然后将那个#include语句注释掉便可,继续编译。编译通过后会弹出提示说没有可执行文件,需要手动选择,不用管,直接点OK或者cancal。最后就像刚才那篇日志所说,将新生成的动态库文件拷到工程的release版本目录下就完成了。重新编译运行自己的应用程序,视频就能正常播放了。