我想在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 方法。使用它来缩放视频帧以适合您的小部件区域。