3

这似乎太简单了,我一定是忽略了什么?

如何从 a 显示的视频文件中找到本机视频大小或宽高比QMediaPlayer

视频Resolution,PixelAspectRatio等,应该在MetaData中,但是我等待MetaData Update Signals,在video .play()s后等待几秒,但是isMetaDataAvailable()总是返回false,.availableMetaData()并且.metaData(QMediaMetaData::Resolution).toSize()总是返回空。

似乎没有其他地方可以获取视频分辨率信息,或者我错过了什么?

我可以打开视频,全屏播放视频等。

4

3 回答 3

1

您可以使用 QVideoWidget 实例作为视频输出,QMediaPlayer并从 QVideoWidget::sizeHint 检索视频的原生大小。

QSize MyVideoPlayer::getVideoNativeSize(const QString& videoFilePath)
{
    m_mediaPlayer = new QMediaPlayer(0, QMediaPlayer::VideoSurface);
    m_mediaPlayer->setVideoOutput(m_videoWidget);
    m_mediaPlayer->setMedia(QUrl::fromLocalFile(videoFilePath));
    connect(m_mediaPlayer, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)),
            this, SLOT(OnMediaStatusChanged(QMediaPlayer::MediaStatus)));

    m_isStoppingVideo = false;
    QEventLoop loop;
    m_mediaPlayer->play();
    while (!m_isStoppingVideo)
    {
        loop.processEvents();
    }
    disconnect(m_mediaPlayer, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)),
                this, SLOT(OnMediaStatusChanged(QMediaPlayer::MediaStatus)));

    m_mediaPlayer->stop();
    return m_videoWidget->sizeHint();
}

void MyVideoPlayer::OnMediaStatusChanged(QMediaPlayer::MediaStatus mediaStatus)
{
    if (mediaStatus == QMediaPlayer::BufferedMedia)
    {
        m_isStoppingVideo = true;
    }
}
于 2017-09-01T18:44:48.253 回答
0

要查找没有元数据的解决方案,您可以查看 Qt 论坛中的这个问题以获取可能的解决方案:

http://forum.qt.io/topic/31278/solved-get-resolution-of-a-video-file-40-qmediaplayer-41/2

我通过等到用户播放视频来解决我的问题,一旦他们这样做,我就会得到 QGraphicsVideoItems 类属性:nativeSize。

于 2015-03-13T05:47:34.020 回答
0

QGraphicsVideoItem我也用snativeSize属性解决了这个问题。但棘手的是,nativeSize只有在您开始播放视频后的一段时间后才会生效。诀窍是连接到QGraphicsVideoItem::nativeSizeChanged(const QSizeF &size)在真正获得的情况下发出的特殊信号nativeSize

于 2017-07-25T15:21:14.297 回答