QMediaPlayer 和 QVideoWidget 的糟糕表现
Posted
技术标签:
【中文标题】QMediaPlayer 和 QVideoWidget 的糟糕表现【英文标题】:Terrible performance with QMediaPlayer and QVideoWidget 【发布时间】:2011-10-13 19:54:32 【问题描述】:我在 Ubuntu 10.10(奔腾 4)上尝试使用 QtMobility 1.2.0 和 Qt 4.7.4 播放视频时发现性能很差2.80GHz)。
有趣的是 totem(也使用 gstreamer 作为后端)和 vlc 能够毫无问题地播放这些视频机器,即使分辨率更高(全屏等)。
根据top,我的应用程序消耗了100%的CPU,而totem和vlc只消耗了~40%。这很奇怪!所以我在下面分享应用程序的源代码。它使用QMediaPlayer
和QVideoWidget
来完成这项工作。
movie.cpp:
#include <QtGui/QMainWindow>
#include <QtGui>
#include <qmediaplayer.h>
#include <qvideowidget.h>
int main(int argc, char* argv[])
QApplication app(argc, argv);
QMainWindow mainWindow;
mainWindow.resize(QSize(1280, 500));
QMediaPlayer* mplayer = new QMediaPlayer;
QVideoWidget* vid_widget = new QVideoWidget(&mainWindow);
vid_widget->setAspectRatioMode(Qt::IgnoreAspectRatio);
mainWindow.setCentralWidget(vid_widget);
mplayer->setVideoOutput(vid_widget);
mplayer->setMedia(QUrl::fromLocalFile(argv[1]));
mplayer->setVolume(50);
mplayer->setPlaybackRate(1);
mplayer->play();
mainWindow.show();
return app.exec();
movie.pro:
TEMPLATE = app
QT += gui
CONFIG += mobility
MOBILITY = multimedia
QMAKE_RPATHDIR += $$DESTDIR
SOURCES = \
movie.cpp
即使我创建一个较小的窗口,性能仍然很糟糕,例如:
mainWindow.resize(QSize(960, 540));
有谁知道导致这种行为的原因以及如何解决?
如果有人感兴趣,ffmpeg 会显示有关我用于测试的视频文件之一的以下信息:
Input #0, matroska, from '/home/user/movie.mkv':
Duration: 00:02:23.22, start: 0.000000, bitrate: N/A
Stream #0.0(eng): Video: h264, yuvj420p, 1280x536 [PAR 1:1 DAR 160:67], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc
Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, s16
【问题讨论】:
如果有源代码,建议准备长时间调试弱化搜索繁忙循环 @Ulterior 没有什么可调试的。看起来像是在 qt 库中搞砸了。不会是第一个 【参考方案1】:我开始使用QML Video Element,在遇到几个渲染/性能问题后,我最终放弃并编写了一个视频播放器元素来替换 QtMobility 中的那个。
对于可能感兴趣的人,GStreamer has a C++ interface 非常易于使用。
【讨论】:
我也有同样的问题,视频播放器以正常速度播放视频,但 Phonon 太慢了。你能否更详细地解释一下你是如何解决这个问题的,我关注 GStreamer 有一个 C++ 接口链接,但我没有在那里找到任何东西。谢谢。 嗯,这是一个值得讨论的问题,所以我会简短:学习一些 GStreamer 教程,直到您能够编写一个可以读取视频文件的应用程序,检索它的帧,并将其显示在窗口上。在此过程中,您会发现帧以可能不是 RGB 的格式存储其像素。为了正确显示帧,每个帧都需要转换为它们所采用的任何格式(比如说 YUV)到 RGB。 转换过程实际上是我们观察到的 Phonon 性能不佳的原因,因为它是由 CPU 完成的。为了加快速度,您可以通过GLSL shaders 编写要在 GPU 上执行的颜色空间转换代码(即 YUV 到 RGB)。随意对我的问题/答案进行投票。祝你好运! 来自 (wiki) 网站:“QtGStreamer C++ 绑定非常过时且无人维护。”【参考方案2】:你的代码没有问题,你只是把球传给Qt来解码和播放电影。
您正在使用未启用硬件加速的 Qt 构建,或者您的系统没有适合 Qt 的硬件来加速解码和播放。
【讨论】:
糟糕的视频性能在 Linux 上非常普遍。很难相信在 2.8 GHz 上需要任何硬件加速来获得不错的性能,但我们已经做到了。 h264 尤其是播放起来很痛苦,而 2.8 Ghz Pentium 4 并不能真正胜任这项任务。幸运的是,对于我们 Linux 用户来说,VAAPI 已经提供了足够多的开源驱动程序,我们不再绑定到 nVidia VDPAU 来播放甚至 1080p。我发现我的 1.2Ghz Core i3 笔记本电脑运行良好,如果我切换到内置混合 5950,即使是开源 ATI 驱动程序也能与 VAAPI 一起工作 显然Qt Multimedia还不支持VAAPI:bugreports.qt-project.org/browse/QTBUG-23761以上是关于QMediaPlayer 和 QVideoWidget 的糟糕表现的主要内容,如果未能解决你的问题,请参考以下文章
QMediaPlayer 和 QVideoWidget 的糟糕表现
在 Qt 和 C++ 中改变 mp3 速度 [QMediaPlayer]