这应该是简单的事情,但我无法弄清楚这一点。如何获取加载到QVideoWidget / QMediaPlayer的文件的视频尺寸。所以,我的代码如下:
QMediaPlayer m_MediaPLayer(0, QMediaPlayer::VideoSurface);
m_VideoWidget = new QVideoWidget;
m_MediaPLayer.setVideoOutput(m_VideoWidget);
m_MediaPLayer.setMedia(QUrl::fromLocalFile("file.avi"));
m_MediaPLayer.play();
// I am here checking for media status changed event
connect(&m_MediaPLayer, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)),
this, SLOT(mediaStatusChanged(QMediaPlayer::MediaStatus)));
void MyClass::mediaStatusChanged(QMediaPlayer::MediaStatus status)
{
// Here I get notification for media status change but no idea how to
// get the video size. I could not figure out a way.
}
答案 0 :(得分:5)
理论上,有两种方法可以获取此信息:
通过QMediaPlayer::metaData
使用密钥Resolution
,你应该得到QSize
的分辨率:
if (m_MediaPLayer->isMetaDataAvailable()) {
qDebug() <<"resolution:" <<m_MediaPLayer->metaData("Resolution");
}
使用QMediaResource.resolution()
同时返回QSize
:
qDebug() << "resolution:" << m_MediaPLayer->media().canonicalResource().resolution();
然而,在这两种情况下,对于我尝试的两个视频(一个avi和一个mp4),它返回-1,-1
。
有一些关于此问题的旧Qt帖子:get resolution of a video file和QMediaPlayer resolution returns (-1x-1)。虽然给出了一些解决方案,但没有一个对我有用,事实上有bug report这个:
QTBUG-28850 - QMediaResource returns no media info
仍然开放。
一些相关问题:
answer in the last question建议使用MediaInfo,其中包含可以提取视频元数据的库。
我希望OpenCV能够做到这一点,不过这是is not the case。
答案 1 :(得分:0)
我已将QVideoWidget
替换为QGraphicsView
+ QGraphicsVideoItem
,从而解决了这个问题。 QGraphicsVideoItem
具有nativeSize
属性。但棘手的是,nativeSize
仅在您开始播放视频一段时间后才会生效。诀窍是连接到获得真正QGraphicsVideoItem::nativeSizeChanged(const QSizeF &size)
时发出的特殊nativeSize
信号。
代码示例:
m_player.setVideoOutput(&m_graphicsItem); // m_player is QMediaPlayer
ui->videoView->setScene(new QGraphicsScene); // videoView is QGraphicsView
ui->videoView->scene()->addItem(&m_graphicsItem);
connect(&m_graphicsItem, &QGraphicsVideoItem::nativeSizeChanged, this, &MainWindow::calcVideoFactor);