QVideoWidget:视频被切断

时间:2016-07-14 12:26:30

标签: qt video qwidget qmediaplayer qapplication

我想在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();
}

6 个答案:

答案 0 :(得分:1)

经过几个小时的查找错误,我认为这是关于OSX的Qt中的一个错误,因为我观看了这段YouTube视频https://www.youtube.com/watch?v=tGKmQy-VBX0并尝试了代码。

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

答案 1 :(得分:1)

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

好吧,除了它没有完全居中。并且左边有一个1px的边框。它大部分时间都挂在全屏幕上。我得到的错误像“没有AVPlayerLayer的情况下调用updateVideoFrame(这不应该发生”。进展!

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

你知道什么工作,并且效果很好? GStreamer的。谢谢你,gstreamer。即使将它集成到python / qt中也非常有效。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

但是,此缩放模式应为默认模式。您可以尝试手动设置:

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

答案 4 :(得分:0)

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

global

答案 5 :(得分:0)

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