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

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

Спасибо!

2 ответа

Решение

Павло, вы можете попробовать это:

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

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

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

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

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

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

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