2015-03-12 3 views
2

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

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

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

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

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

ответ

0

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

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

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

0

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

0

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