4

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

}
4

2 回答 2

6

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

  1. 通过QMediaPlayer::metaData使用密钥Resolution,您应该获得以下分辨率QSize

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

    qDebug() << "resolution:" << m_MediaPLayer->media().canonicalResource().resolution();
    

但是,在这两种情况下,它都会返回-1,-1我尝试过的两个视频(一个 avi 和一个 mp4)。

有一些关于这个问题的旧 Qt 线程:get resolution of a video file,并且QMediaPlayer resolution returns (-1x-1)。虽然给出了一些解决方案,但没有一个对我有用,实际上有一个错误报告

QTBUG-28850 - QMediaResource 不返回媒体信息

这仍然是开放的。

一些相关问题:

最后一个问题的答案建议使用MediaInfo,其中包含可以提取视频元数据的库。

我希望OpenCV能够做到这一点,但事实并非如此

于 2016-01-20T10:48:40.043 回答
0

我已经通过替换 + 解决了QVideoWidget这个QGraphicsView问题QGraphicsVideoItemQGraphicsVideoItem有财产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);
于 2017-07-25T15:26:07.700 回答