xp中用QT的phonon来播放视频时,编译时没有错误,但是播放不出视频,会提示以下warning信息:
WARNING: Phonon::createPath: Cannot connect Phonon::MediaObject ( no objectName ) to MediaVideoWidget ( no objectName ).
解决方法:
1、下载下面链接中的补丁文件 0001-Revert-Add-EVR-to-the-Phonon-DirectShow9-ds9-backend.patch,并对相应的修改文件打补丁;
2、用QT重新编译源码src/plugins/phonon/ds9/ds9.pro;
3、编译后将在 XX/qt/plugins/phonon_backend下生成新的动态库文件:libphonon_ds94.a,phonon_ds94.dll。将这两个文件拷贝到播放程序release版本所在目录下的phonon_backend文件夹下,xp就可以正常播放视频了。
如果编译过程中报错:moc_backendnode.cpp: No such file or directory,将报错文件中 #include "moc_backend.cpp" 一行注释掉再编译就可以了。
补丁链接网页:http://bugreports.qt.nokia.com/browse/QTBUG-13062
下面是打补丁的过程:
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版本目录下就完成了。重新编译运行自己的应用程序,视频就能正常播放了。