2016-01-20 3 views
3

Это должно быть что-то простое, но я не могу понять это. Как получить размеры видео для файла, загруженного в QVideoWidget/QMediaPlayer. Итак, мой код выглядит следующим образом:QT: получить размеры видео в QVideoWidget

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. 

} 

ответ

4

В теории есть два способа получить эту информацию:

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

Однако в обоих случаях она возвращает -1,-1 для меня два видео, которые я попробовал (один AVI, и в mp4).

Есть несколько старых тем 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.

+0

Вторая версия не работает для меня, но если я использую первый вариант в обработчик событий для состояния QMediaPlayer :: BufferedMedia, он возвращает правильный размер. Я сделаю для меня этот вихрь и благодарю за очень подробный ответ. – Luca

+0

Хорошо, я рад это слышать! Только один вопрос, какую ОС вы используете? – agold

+0

Я нахожусь в Linux Mint 17, который является вилкой ubuntu 14.04, я думаю. Мне действительно нужно запустить его на процессоре на базе ARM, поэтому мы увидим, как это происходит позже в тот же день, но также работает Ubuntu 14.04 (Tegra Jetson Tk1, NVIDIA). – Luca

0

Я решил эту проблему, заменив QVideoWidget на QGraphicsView + QGraphicsVideoItem. QGraphicsVideoItem имеет nativeSize Недвижимость. Но сложнее всего то, что nativeSize вступает в силу только через некоторое время с момента начала воспроизведения видео. Хитрость заключается в подключении к специальному сигналу QGraphicsVideoItem::nativeSizeChanged(const QSizeF &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); 
Смежные вопросы