我需要讀取給定視頻文件(其寬度和高度)的尺寸,而無需構建像Phonon這樣的視頻播放器。我的問題是我應該使用哪個類來訪問這些數據。我已經嘗試過使用QPixmap和QMovie,但是它們都不支持* .mov。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