Qt: чтение размера видео без создания видеоплеера

Мне нужно прочитать размеры данного видеофайла (его ширину и высоту) без создания видеоплеера, такого как Phonon, например. Мой вопрос в том, какой класс я должен использовать, чтобы получить доступ к этим данным. Я уже пробовал использовать QPixmap и QMovie, но ни один из них не поддерживает *.mov.

Благодарю вас!


person Pavlo Dyban    schedule 19.04.2011    source источник


Ответы (2)


Павел, попробуй так:

QMediaContent media("myMovie.mov");
QSize resolution = media.canonicalResource().resolution();

В коде используется класс QMediaResource из проект Qt Mobility. Я еще не пробовал, и я полагаю, вам нужен хотя бы правильный бэкенд (плагин, способный читать формат MOV). Я даю этот ответ только из обзора API.

Надеюсь это поможет.

person Barbaris    schedule 19.04.2011
comment
Спасибо за ваш ответ! Я реализую это и дам вам знать, если это сработает. - person Pavlo Dyban; 20.04.2011
comment
Я не использовал Qt Modility, потому что это потребовало бы дополнительных загрузок для меня и всех других людей, для которых я программирую свой код. Я придерживался установки Qt по умолчанию и нашел другое решение, которое вы можете найти ниже, если мне интересно. Спасибо за вашу помощь в любом случае! - person Pavlo Dyban; 02.05.2011

Наконец-то я решил свою проблему и решил поделиться своим решением со всеми остальными. В конструкторе класса я инициализирую следующие две переменные:

media = new Phonon::MediaObject(this);
videoWidget = new Phonon::VideoWidget;

Я подключаю сигнал media к слоту в моем классе:

connect(media,SIGNAL(stateChanged(Phonon::State,Phonon::State)),
        this,SLOT(videoState(Phonon::State,Phonon::State)));

Я позволяю пользователю выбрать видеофайл:

QString filename = QFileDialog::getOpenFileName(this,tr("Choose video file"),QDir().homePath(),tr("Video files (*.mov *.mpg *.avi)"));

И применим этот файл к объекту media:

media->setCurrentSource(filename);
Phonon::createPath(media,videoWidget);

Поскольку объект media уже подключен к слоту, каждое изменение в media можно отслеживать с его помощью.

void VideoModuleDialog::videoState(Phonon::State newState, Phonon::State oldState)
{
    if(newState == Phonon::PlayingState || newState == Phonon::StoppedState)
    {
        width->setText(QString().number(videoWidget->sizeHint().width()));
        height->setText(QString().number(videoWidget->sizeHint().height()));
    }
    if(newState == Phonon::ErrorState)
    {
        QMessageBox::critical(this,tr("Video file error!"),
                              tr("Video file error: ") + media->errorString(),QMessageBox::Ok);
    }
}

Однако я должен признать, что этот код кажется мне довольно медленным. Библиотека Phonon используется в моей программе только в одном месте, и это здесь, в диалоговом окне, где пользователь может выбрать видеоклип для встраивания, и я хочу, чтобы размеры видео считывались из файла. Это диалоговое окно откроется через некоторое время, поэтому я думаю, что это решение слишком жесткое для моей проблемы. Однако другого решения я не нашел. Если есть разные мнения по поводу темы этого поста, буду рад их услышать.

person Pavlo Dyban    schedule 02.05.2011