QVideoWidget:视频被切断



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

对于2016年的人来说,QVideoWidget仍然被破坏。 但是,请使用包含场景图的 QGraphicsView 小组件,并将单个 QGraphicsVideoItem 添加到场景图。 似乎有效...

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

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

你知道什么有效,而且效果很好吗? GStreamer。 谢谢你,gstreamer。 即使将其集成到python/qt中也非常出色。

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

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

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

玩完后,我将 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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新