Как найти разрешение видео и соотношение сторон видео QMediaPlayer?

Это кажется слишком простым, я должен что-то упускать из виду?

Как найти собственный размер видео или соотношение сторон из видеофайла, отображаемого QMediaPlayer?

Разрешение видео, PixelAspectRatio и т. Д. Должно быть в метаданных, но я жду сигналов обновления метаданных и жду секунд после видео .play()с, но isMetaDataAvailable() всегда возвращает ложь, и .availableMetaData() а также .metaData(QMediaMetaData::Resolution).toSize() всегда возвращайся пустым.

Кажется, больше некуда получить информацию о разрешении видео, или я что-то упустил?

Я могу открыть видео, воспроизвести видео на весь экран и т. Д.

3 ответа

Вы можете использовать экземпляр 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;
    }
}

Я также решил эту проблему с QGraphicsVideoItems nativeSize имущество. Но хитрость в том, что nativeSize становится действительным только через некоторое время после начала воспроизведения видео. Хитрость заключается в том, чтобы подключиться к специальным QGraphicsVideoItem::nativeSizeChanged(const QSizeF &size) сигнал, который испускается в случае реального nativeSize получение.

Чтобы найти разрешение без метаданных, вы можете посмотреть на этот вопрос на форумах Qt для возможного решения:

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

Я решил свою проблему, подождав, пока пользователь не воспроизведет видео, и как только они это сделают, я получу свойство класса QGraphicsVideoItems: nativeSize.

Другие вопросы по тегам