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);
}
}
Я должен признать, однако, что этот код кажется мне довольно медленным. Библиотека фононов используется в моей программе только в одном месте, и это здесь, в диалоговом окне, где пользователь может выбрать видеоклип для встраивания, и я хочу, чтобы размеры видео считывались из файла. Требуется некоторое время, чтобы открыть это диалоговое окно, так что я думаю, что это решение слишком жесткое для моей проблемы. Однако я не смог найти другое решение. Если есть различные мнения относительно предмета этого поста, я был бы рад услышать их.