Qt:在不创建视频播放器的情况下阅读视频尺寸
问题描述:
我需要读取给定视频文件(其宽度和高度)的尺寸,而无需构建像Phonon这样的视频播放器。我的问题是我应该使用哪个类来访问这些数据。我已经尝试过使用QPixmap和QMovie,但是它们都不支持* .mov。Qt:在不创建视频播放器的情况下阅读视频尺寸
谢谢!
答
帕夫洛,你可以试试这个:
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);
}
}
但是我必须承认,这段代码在我看来很慢。声音库仅用于我的程序中的一个地方,这是在这里,在一个对话窗口中,用户可以选择要嵌入的视频剪辑,并且我希望从文件中读取视频尺寸。这个对话窗口打开需要一些时间,所以我想,这个解决方案对于我的问题来说有点过于苛刻。但是,我无法找到另一种解决方案。如果对这篇文章的主题有不同意见,我会很高兴听到他们的声音。
谢谢你的回答!我会执行它并让你知道它是否有效。 – 2011-04-20 06:10:46
我没有使用Qt Modility,因为那需要额外下载我和我编写代码的所有其他人。我坚持默认的Qt安装,并找到了一个不同的解决方案,如果我有兴趣,可以在下面找到它。无论如何,谢谢你的帮助! – 2011-05-02 11:31:10