2

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

6 回答 6

1

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

于 2018-04-19T03:24:25.833 回答
1

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

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

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

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

于 2016-08-08T02:51:01.610 回答
1

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

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

于 2016-07-14T15:58:46.463 回答
1

播放后,我将 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
于 2018-08-07T22:23:04.830 回答
0

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

于 2020-08-04T11:33:41.093 回答
0

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

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

QVideoWidget *videoWidget = new QVideoWidget(&window);
videoWidget->setScaleMode(Phonon::VideoWidget::FitInView);
player->setVideoOutput(videoWidget);
于 2016-07-14T12:55:08.510 回答