【问题标题】:QVideoWidget: Video is cut offQVideoWidget:视频被切断
【发布时间】:2016-07-14 12:26:30
【问题描述】:

我想在 Qt 应用程序中播放视频。到目前为止,这是我的代码:

#include <QApplication>
#include <QWidget>
#include <QMediaPlayer>
#include <QVideoWidget>
#include <QUrl>

#include <iostream>

using namespace std;

const int WIDTH = 1280;
const int HEIGHT = 720;

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWidget window;
    window.resize(WIDTH, HEIGHT);
    window.setWindowTitle("Video Test");
    window.show();

    QMediaPlayer *player = new QMediaPlayer();
    player->setMedia(QUrl::fromLocalFile("/Path/To/Video.mp4"));

    QVideoWidget *videoWidget = new QVideoWidget(&window);
    player->setVideoOutput(videoWidget);

    videoWidget->resize(WIDTH, HEIGHT);

    videoWidget->show();
    player->play();


    return app.exec();
}

问题:视频显示和播放正常,但视频没有调整大小以适应 QVideoWidget。视频中比小部件大的部分被截断。

提前致谢!

编辑:我减少了代码并注意到,当应用程序启动时视频被切断,但是当我使用鼠标调整窗口大小时,它实际上适合大小:

#include <QApplication>
#include <QWidget>
#include <QMediaPlayer>
#include <QVideoWidget>
#include <QUrl>

#include <iostream>

using namespace std;

const int WIDTH = 1280;
const int HEIGHT = 720;

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QMediaPlayer *player = new QMediaPlayer();
    QVideoWidget *videoWidget = new QVideoWidget();

    player->setVideoOutput(videoWidget);

    player->setMedia(QUrl::fromLocalFile("/Path/To/Video.mp4"));
    player->play();

    videoWidget->resize(WIDTH/3, HEIGHT/3);

    videoWidget->show();

    return app.exec();
}

【问题讨论】:

    标签: qt video qwidget qmediaplayer qapplication


    【解决方案1】:

    在寻找错误数小时后,我认为这是 OSX 上 Qt 中的一个错误,因为我观看了这个 YouTube 视频 https://www.youtube.com/watch?v=tGKmQy-VBX0 并尝试了代码。

    在视频缩放中工作正常,但在我的机器上不行。

    【讨论】:

    • 这(仍然)发生在 os x 和 fedora 24 上。叹息。和ubuntu?他们的 qtmultimedia 包太坏了,它使用 gstreamer 0.1,他们甚至不发货。有没有人用这玩意儿?
    【解决方案2】:

    对于 2016 年的任何人来说,QVideoWidget 仍然失败。但是,使用一个包含场景图的 QGraphicsView 小部件,并将单个 QGraphicsVideoItem 添加到场景图中。似乎工作......

    好吧,只是它不完全居中。左边有一个1px的边框。并且它大部分时间都挂在全屏状态。并且我收到诸如“在没有 AVPlayerLayer 的情况下调用 updateVideoFrame 之类的错误(这不应该发生”。进度!

    ..哦,它也占用了大约 10 倍的 cpu。

    你知道什么是有效的,并且效果很好吗? GStreamer。谢谢你,gstreamer。甚至将它集成到 python/qt 中也能很好地工作。

    【讨论】:

    • 能否告诉我,您是如何集成 GStreamer 的。
    【解决方案3】:

    我在 PyQt5 中遇到了类似的问题。在播放视频之前,我通过将 QVideoWidget 的几何形状设置为其当前几何形状来解决它。我猜 resizeEvent 信号中的某些东西必须处理媒体的缩放并且在初始化时不会被触发。

    【讨论】:

      【解决方案4】:

      播放后,我将 QVideoWidget 的大小调整了 1,然后调整为原始大小。 绝对是“软糖”,但这对我有用,直到我找到真正的解决方案: (使用 PyQt5 和 High Sierra)

      s1 = self.MediaFrame.size() # QVideoWidget
      s2 = s1 + QSize(1, 1)
      self.MediaPlayer.play() # QMediaPlayer
      self.MediaFrame.resize(s2) # enlarge by one pixel
      self.MediaFrame.resize(s1) # return to original size
      

      【讨论】:

        【解决方案5】:

        通常,缩放模式决定了视频如何填充小部件。 缩放模式FitInView 将强制视频填充视图保持纵横比。

        但是,这种缩放模式应该是默认的。您可以尝试手动设置:

        QVideoWidget *videoWidget = new QVideoWidget(&window);
        videoWidget->setScaleMode(Phonon::VideoWidget::FitInView);
        player->setVideoOutput(videoWidget);
        

        【讨论】:

        • 感谢您的快速响应,但我无法使用 Phonon,当我将 phonon 添加到 QT (QT += phonon) 时,我收到错误:QT 中的未知模块:phonon .我正在运行 OSX 顺便说一句,我应该如何配置/安装它?
        • 不幸的是,我不熟悉在 OSX 上使用 Qt/Phonon。关于这个话题有很多问题here,也许有帮助。
        • 是否还有没有 Phonon 的选项,因为 Phonon 不再是 Qt5 的一部分?
        • 我将我的问题更新为没有父小部件的替代版本
        【解决方案6】:

        如果您仍在寻找解决方案,QVideoWidget 类有setAspectRatioMode 方法。使用它来缩放视频帧以适合您的小部件区域。

        【讨论】:

          猜你喜欢
          • 2022-08-10
          • 1970-01-01
          • 1970-01-01
          • 2016-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多