QMediaPlayer 和 QVideoWidget 的糟糕表现

Posted

技术标签:

【中文标题】QMediaPlayer 和 QVideoWidget 的糟糕表现【英文标题】:Terrible performance with QMediaPlayer and QVideoWidget 【发布时间】:2011-10-13 19:54:32 【问题描述】:

我在 Ubuntu 10.10(奔腾 4)上尝试使用 QtMobility 1.2.0Qt 4.7.4 播放视频时发现性能很差2.80GHz)。

有趣的是 totem(也使用 gstreamer 作为后端)和 vlc 能够毫无问题地播放这些视频机器,即使分辨率更高(全屏等)。

根据top,我的应用程序消耗了100%的CPU,而totem和vlc只消耗了~40%。这很奇怪!所以我在下面分享应用程序的源代码。它使用QMediaPlayerQVideoWidget 来完成这项工作。

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]

无法从其他线程播放 QMediaPlayer

8.2.1 QMediaPlayer类介绍与基本使用

哪些视频文件可以在 Android 上播放 QMediaPlayer?

使用 QAudioOutput 和 QMediaPlayer (PyQt6) 的淡化效果