QT:在QVideoWidget中获取视频尺寸

5

这应该是一个简单的问题,但我无法解决。如何获取加载到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个回答

7

理论上有两种方法可以获取这些信息:

  1. Through QMediaPlayer::metaData using the key Resolution you should get the resolution as QSize:

    if (m_MediaPLayer->isMetaDataAvailable()) {
      qDebug() <<"resolution:"  <<m_MediaPLayer->metaData("Resolution");
    }
    
  2. Using QMediaResource.resolution() which also returns a QSize:

    qDebug() << "resolution:" << m_MediaPLayer->media().canonicalResource().resolution();
    
然而,在我尝试的两个视频中(一个是avi,一个是mp4),它都返回-1,-1。关于这个问题,有一些旧的Qt线程:get resolution of a video fileQMediaPlayer resolution returns (-1x-1)。虽然给出了一些解决方案,但对我来说都不起作用,事实上还有一个bug report

QTBUG-28850-QMediaResource返回没有媒体信息

该错误仍然未被解决。

一些相关问题:

上一个问题的答案建议使用包含可以提取视频元数据的库的{{link5:MediaInfo}}。

我原本以为OpenCV可以做到这一点,然而事实并非如此


1
第二个版本对我不起作用,但如果我在QMediaPlayer :: BufferedMedia状态的事件处理程序中使用第一个版本,它会返回正确的大小。我会让它对我起作用,感谢您非常详细的答案。 - Luca
好的,我很高兴听到这个消息!只有一个问题,你使用哪个操作系统? - agold
我使用的是Linux Mint 17,它是Ubuntu 14.04的一个分支。实际上,我需要在基于ARM的处理器上运行它,所以今天晚些时候我们将看到它的表现如何,但那个处理器也在运行Ubuntu 14.04(Tegra Jetson Tk1,NVIDIA)。 - Luca
好的,谢谢。我正在使用Ubuntu 14.04,但可能是因为我尝试的视频所致。 - agold
我也在使用gstreamer 1.2.4版本。也许这与后端有关。此外,我在mediaStatusChanged信号事件处理程序中获取了大小。这也可能是一个原因。 - Luca
显示剩余2条评论

1
我已经通过用QGraphicsView + QGraphicsVideoItem替换QVideoWidget来解决这个问题。 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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接