Как найти разрешение видео и соотношение сторон видео 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;
}
}
Я также решил эту проблему с QGraphicsVideoItem
s 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.