Qt: читать видео измерения без создания видеоплеера - PullRequest
2 голосов
/ 19 апреля 2011

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 19 апреля 2011

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

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

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

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

0 голосов
/ 02 мая 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);
    }
}

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

...