QT:在QVideoWidget中获取视频尺寸

时间:2016-01-20 08:49:21

标签: qt qmediaplayer

这应该是简单的事情,但我无法弄清楚这一点。如何获取加载到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. 

}

2 个答案:

答案 0 :(得分:5)

理论上,有两种方法可以获取此信息:

  1. 通过QMediaPlayer::metaData使用密钥Resolution,你应该得到QSize的分辨率:

    if (m_MediaPLayer->isMetaDataAvailable()) {
      qDebug() <<"resolution:"  <<m_MediaPLayer->metaData("Resolution");
    }
    
  2. 使用QMediaResource.resolution()同时返回QSize

    qDebug() << "resolution:" << m_MediaPLayer->media().canonicalResource().resolution();
    
  3. 然而,在这两种情况下,对于我尝试的两个视频(一个avi和一个mp4),它返回-1,-1

    有一些关于此问题的旧Qt帖子:get resolution of a video fileQMediaPlayer 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);