【问题标题】:QT: get video dimensions in QVideoWidgetQT:在 QVideoWidget 中获取视频尺寸
【发布时间】:2016-04-26 00:29:41
【问题描述】:

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

}

【问题讨论】:

    标签: qt qmediaplayer


    【解决方案1】:

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

    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();
      

    但是,在这两种情况下,它都会为我尝试的两个视频(一个 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。

    【讨论】:

    • 第二个版本对我不起作用,但如果我在 QMediaPlayer::BufferedMedia 状态的事件处理程序中使用第一个版本,它会返回正确的大小。我会为我做这个工作,并感谢您提供非常详细的答案。
    • 好的,我很高兴听到这个消息!只有一个问题,您使用的是哪个操作系统?
    • 我认为我使用的是 Linux Mint 17,它是 ubuntu 14.04 的一个分支。我实际上需要在基于 ARM 的处理器上运行它,所以我们将在当天晚些时候看到它的运行情况,但它也在运行 Ubuntu 14.04(Tegra Jetson Tk1,NVIDIA)。
    • 好的,谢谢,我使用的是 Ubuntu 14.04,但这可能是因为我尝试了视频。
    • 我也在使用 gstreamer 1.2.4。也许,它与后端有关。另外,我在mediaStatusChanged 信号事件处理程序中获得了大小。这也可能是一个原因。
    【解决方案2】:

    我通过将QVideoWidget 替换为QGraphicsView + QGraphicsVideoItem 解决了这个问题。 QGraphicsVideoItem 具有 nativeSize 属性。但棘手的是nativeSize 仅在您开始播放视频后的一段时间后才会生效。诀窍是连接到特殊的QGraphicsVideoItem::nativeSizeChanged(const QSizeF &amp;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-02-18
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      • 2012-03-19
      • 2017-04-03
      • 2011-05-06
      • 2011-06-23
      • 1970-01-01
      相关资源
      最近更新 更多