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