亚洲av中文无码乱人伦在线视色,网曝黑料国产吃瓜,无码国产精品久久一区免费,亚洲av在在线观看,亚洲av国产午夜精品一区二区

從零開始學(xué)Qt(94):開發(fā)視頻播放器實(shí)例

使用QMediaPlayer可以進(jìn)行視頻文件解碼,視頻播放必須將視頻幀在某個(gè)界面組件上顯示, 有QVideoWidget和QGraphicsVideoItem兩種視頻顯示組件,也可以從這兩個(gè)類繼承,自定義視頻顯示組件。

QMediaPlayer也可以結(jié)合QMediaPlaylist實(shí)現(xiàn)視頻文件列表播放。

1.視頻播放器實(shí)例程序

QVideoWidget是用于顯示視頻的界面組件,要在項(xiàng)目中使用QVideoWidget,需要在項(xiàng)目配置 文件中添加下面一行語句:

Qt = multimediawidgets

使用QMediaPlayer和QVideoWidget實(shí)現(xiàn)的一個(gè)視頻播放器實(shí)例程序,運(yùn)行時(shí)界面如下圖所示。該程序沒有使用QMediaPlaylist,只播放單個(gè)文件。

從零開始學(xué)Qt(94):開發(fā)視頻播放器實(shí)例

界面的主體部分是一個(gè)QmyVideoWidget類組件,是從QVideoWidget繼承的自定義視頻顯示組件,重載了mousePressEvent()事件,鼠標(biāo)單擊可以暫?;蚶^續(xù)播放;重載了keyPressEvent()事件,在全屏狀態(tài)下按ESC鍵可以退出全屏。原始的QVideoWidget類沒有這些功能。

2.主窗口設(shè)計(jì)

主窗口是基于QMainWindow的類MainWindow,采用UI設(shè)計(jì)器設(shè)計(jì)界面。在設(shè)計(jì)視頻顯示組件時(shí),在窗體上放置一個(gè)QWidget組件,然后提升為QmyVideoWidget類。

主窗口功能主要是使用一個(gè)QMediaPlayer組件播放單個(gè)視頻文件。媒體播放類QMediaPlayer的功能在介紹音頻播放時(shí)(從零開始學(xué)Qt(92):使用QMediaPlayer播放音樂文件)已經(jīng)詳細(xì)介紹。

MainWindow類定義如下(忽略了自動(dòng)生成的界面組件的槽函數(shù)定義):

class MainWindow : public QMainWindow{ Q_OBJECTpublic: MainWindow(QWidget *parent = nullptr); ~MainWindow();private: Ui::MainWindow *ui; QMediaPlayer *player;//視頻播放器 QString durationTime; QString positionTime;private slots: //自定義槽函數(shù) void onStateChanged(QMediaPlayer::State state); void onDurationChanged(qint64 duration); void onPositionChanged(qint64 position);};

MainWindow類的功能實(shí)現(xiàn)代碼如下,只播放單個(gè)文件,比音頻播放器功能簡單,所以具體代碼的功能這里不再贅述。

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); player = new QMediaPlayer(this);//創(chuàng)建視頻播放器 、 player->setNotifyInterval(2000);//信息更新周期 2000 ms player->setVideoOutput(ui->videoWidget); //視頻顯示組件 ui->videoWidget->setMediaPlayer (player) ;//設(shè)置顯示組件的關(guān)聯(lián)播放器 connect(player,SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(onStateChanged(QMediaPlayer::State))); connect(player,SIGNAL(positionChanged(qint64)), this, SLOT(onPositionChanged(qint64))); connect(player,SIGNAL(durationChanged(qint64)), this, SLOT(onDurationChanged(qint64)));}void MainWindow::onStateChanged(QMediaPlayer::State state){//播放器狀態(tài)變化 ui->btnPlay->setEnabled(!(state==QMediaPlayer::PlayingState)); ui->btnPause->setEnabled(state==QMediaPlayer::PlayingState); ui->btnStop->setEnabled(state==QMediaPlayer::PlayingState);}void MainWindow::onDurationChanged(qint64 duration){//文件時(shí)長變化 ui->sliderPosition->setMaximum(duration); int secs=duration/1000;//秒 int mins=secs/60; //分鐘 secs=secs % 60;//余數(shù)秒 durationTime=QString::asprintf("%d:%d",mins,secs); ui->labRatio->setText(positionTime "/" durationTime);}void MainWindow::onPositionChanged(qint64 position){//文件播放位置變化 if(ui->sliderPosition->isSliderDown()) return; //如果正在拖動(dòng)滑條,退出 ui->sliderPosition->setSliderPosition(position); int secs=position/1000;//秒 int mins=secs/60; //分鐘 secs=secs % 60;//余數(shù)秒 positionTime=QString::asprintf("%d:%d",mins,secs); ui->labRatio->setText (positionTime "/" durationTime);}

幾個(gè)按鈕的相應(yīng)代碼如下:

void MainWindow::on_btnOpen_clicked(){//打開文件 QString curPath=QDir::homePath(); //獲取系統(tǒng)當(dāng)前目錄 QString dlgTitle="選擇視頻文件"; //對話框標(biāo)題 QString filter="wmv(*.wmv);;mp4(*.mp4);;(*.*)"; QString aFile=QFileDialog::getOpenFileName(this, dlgTitle, curPath, filter); if(aFile.isEmpty()) return; QFileInfo fileInfo(aFile); ui->labMedia->setText(fileInfo.fileName()); player->setMedia(QUrl::fromLocalFile(aFile));//設(shè)置播放文件 player->play();}void MainWindow::on_btnPlay_clicked(){//播放 player->play();}void MainWindow::on_btnPause_clicked(){//暫停 player->pause();}void MainWindow::on_btnStop_clicked(){//停止 player->stop();}void MainWindow::on_sliderPosition_valueChanged(int value){//播放位置 player->setPosition(value);}void MainWindow::on_btnMute_clicked(){//靜音按鈕 bool mute=player->isMuted(); player->setMuted(!mute); if(mute) ui->btnMute->setText("√"); else ui->btnMute->setText("×"); }void MainWindow::on_sliderVolumn_valueChanged(int value){//調(diào)節(jié)音量 player->setVolume(value);}void MainWindow::on_btnFullScreen_clicked(){//全屏按鈕 ui->videoWidget->setFullScreen(true);}

3.自定義視頻顯示組件QmyVideoWidget

原始的QVideoWidget在全屏后無法按Esc鍵退出全屏狀態(tài),為了實(shí)現(xiàn)按鍵和鼠標(biāo)控制功能,從QVideoWidget繼承了一個(gè)類QmyVideoWidget,其定義如下:

class QmyVideoWidget : public QVideoWidget{private: QMediaPlayer *thePlayer;protected: void keyPressEvent(QKeyEvent *event); void mousePressEvent(QMouseEvent *event);public: QmyVideoWidget(QWidget *parent = Q_NULLPTR); void setMediaPlayer(QMediaPlayer *player);};

私有變量thePlayer是關(guān)聯(lián)的視頻播放器,在開始播放之前由主窗口程序調(diào)用setMediaPlayer()進(jìn)行設(shè)置,以便在QmyVideoWidget里對播放器進(jìn)行控制。

下面是QmyVideoWidget類的實(shí)現(xiàn)代碼:

void QmyVideoWidget::keyPressEvent(QKeyEvent *event){//按鍵事件,ESC退出全屏狀態(tài) if((event->key() == Qt::Key_Escape) && ( isFullScreen() ) ){ setFullScreen(false); event->accept(); QVideoWidget::keyPressEvent(event); }}void QmyVideoWidget::mousePressEvent(QMouseEvent * event){//鼠標(biāo)事件,單擊控制暫停和繼續(xù)播放 if(event->button()==Qt::LeftButton){ if(thePlayer->state()==QMediaPlayer::PlayingState) thePlayer->pause(); else thePlayer->play(); } QVideoWidget::mousePressEvent(event);}void QmyVideoWidget::setMediaPlayer(QMediaPlayer *player){//設(shè)置播放器 thePlayer=player;}

————————————————

覺得有用的話請關(guān)注點(diǎn)贊,謝謝您的支持!

對于本系列文章相關(guān)示例完整代碼有需要的朋友,可關(guān)注并在評論區(qū)留言!

相關(guān)新聞

聯(lián)系我們
聯(lián)系我們
公眾號
公眾號
在線咨詢
返回頂部