日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt实现音视频播放器

發(fā)布時間:2023/12/10 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt实现音视频播放器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

聲明:這是基于Qt的QMediaPlayer實現(xiàn)的音視頻播放器,實現(xiàn)了播放器的常用功能,例如根據(jù)播放列表選擇播放的音視頻,拖動滑塊控制音視頻播放

第一步

新建一個Qt widgets Application,在Details中選擇繼承QWidget

第二步 UI布局

tips:那些圖片都是我自己放上去的哦,你可以根據(jù)自己的喜愛放圖片做按鈕的背景

第三步功能實現(xiàn)

1.首先如果你不想自己編寫解碼的話,還是建議自行安裝一下Qt的音視頻解碼軟件哦

2. pro里面的需要添加的代碼

QT += core gui multimedia multimediawidgets

3.詳細實現(xiàn)

  • widget.h
#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMediaPlayer> //播放器 #include <QVideoWidget> //播放窗口 #include <QMediaPlaylist>//播放列表 #include <QString> #include <QFileDialog>//文件窗口 #include <QDebug> #include <QResizeEvent> #include <QMouseEvent> #include <QKeyEvent> #include <QListWidgetItem>namespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);void setget_Alltime(qint64 playtime);//獲取視頻時長并設置到標簽void setget_currenttime(qint64 playtime);//獲取當時播放位置并設置void settimeslider(qint64 playtime);//設置進度條~Widget();private slots:void on_btn_open_clicked();//打開音視頻void on_btn_start_clicked();//播放void on_btn_stop_clicked();//暫停void on_voice_control_valueChanged(int value);//控制聲音void on_btn_fullshow_clicked();//全屏顯示void getduration(qint64 playtime); //獲取時間改變信號void getposition(qint64 playtime); //獲取當前播放位置void on_btn_ht_clicked();//上一個音視頻void on_Btn_qj_clicked();//下一個音視頻void on_listWidget_doubleClicked(const QModelIndex &index);protected:void resizeEvent(QResizeEvent *event);void keyPressEvent(QKeyEvent* e);void mousePressEvent(QMouseEvent* e);void mouseDoubleClickEvent(QMouseEvent *e); private:Ui::Widget *ui;QStringList m_strlist; //文件名列表QMediaPlayer* m_pMediaPlayer; //播放器QVideoWidget* m_pVideoWidget; //播放窗口QMediaPlaylist* m_MediaPlaylist; //播放列表QMediaPlayer::State m_state; //播放狀態(tài)int m_hour; //視頻總時長int m_munete; //分鐘int m_second; //秒bool m_sliderstate; //滑塊是否被選中的狀態(tài)int m_slider_crtval; //滑塊當前值 };#endif // WIDGET_H
  • widget.cpp
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);setWindowTitle("簡易播放器");move(400,60);m_pMediaPlayer = new QMediaPlayer;//播放器m_pVideoWidget = new QVideoWidget(ui->label);//創(chuàng)建播放窗口m_MediaPlaylist = new QMediaPlaylist;//播放列表//給播放器指定播放隊列m_pMediaPlayer->setPlaylist(m_MediaPlaylist);//給播放器指定播放窗口m_pMediaPlayer->setVideoOutput(m_pVideoWidget);//設置焦點 為了讓鍵盤事件能生效 你也可設置播放窗口一直獲得焦點ui->btn_open->setFocusPolicy(Qt::NoFocus);ui->btn_fullshow->setFocusPolicy(Qt::NoFocus);ui->btn_ht->setFocusPolicy(Qt::NoFocus);ui->Btn_qj->setFocusPolicy(Qt::NoFocus);ui->btn_stop->setFocusPolicy(Qt::NoFocus);ui->btn_start->setFocusPolicy(Qt::NoFocus);ui->label->setFocusPolicy(Qt::NoFocus);ui->label_2->setFocusPolicy(Qt::NoFocus);ui->label_all_time->setFocusPolicy(Qt::NoFocus);ui->label_ct->setFocusPolicy(Qt::NoFocus);ui->progress_report->setFocusPolicy(Qt::NoFocus);ui->voice_control->setFocusPolicy(Qt::NoFocus);//滑塊連接m_sliderstate = false;//初始化滑塊狀態(tài)connect(ui->progress_report,&MySlider::mousepress,[=](int val){//當鼠標被按下時 先暫停音視頻 設置滑塊的狀態(tài)m_sliderstate = true;m_state = QMediaPlayer::PausedState;m_pMediaPlayer->pause();qDebug()<<"鼠標在滑塊上按下"<<val;});connect(ui->progress_report,&MySlider::mouserelease,[=](int val){m_sliderstate = false;m_pMediaPlayer->setPosition(val*1000);//當鼠標松開時 調(diào)整播放位置 *1000是為了把秒轉(zhuǎn)為毫秒ui->progress_report->setValue(val*1000);//進度條也得跟著調(diào)整m_state = QMediaPlayer::PlayingState;m_pMediaPlayer->play();qint64 playtime = m_pMediaPlayer->position();setget_currenttime(playtime);//顯示的時長也得跟著調(diào)整qDebug()<<"鼠標在滑塊上松開"<<val;}); }Widget::~Widget() {delete ui; }void Widget::on_btn_open_clicked() {m_MediaPlaylist->clear();//清空播放列表m_strlist.clear();m_strlist = QFileDialog::getOpenFileNames(this,"打開","C:\"","allfiles(*.*);;""MP3(*.mp3);;""MP4(*.mp4);;""AVI(*.avi)");ui->listWidget->clear();//每次打開文件清空列表ui->listWidget->insertItems(0,m_strlist);//把歌曲或者視頻添加到播放列表foreach(QString const& arg,m_strlist){//遍歷m_strlist中所有的 stringQUrl url(arg);//類型轉(zhuǎn)換m_MediaPlaylist->addMedia(url);//添加到播放列表中}m_pVideoWidget->resize(ui->label->size());//設置播放窗口大小m_state = QMediaPlayer::PlayingState;m_pMediaPlayer->play();//播放connect(m_pMediaPlayer,SIGNAL(durationChanged(qint64)),this,SLOT(getduration(qint64)));//總時長connect(m_pMediaPlayer,SIGNAL(positionChanged(qint64)),this,SLOT(getposition(qint64)));//當前時長 }void Widget::on_btn_start_clicked() //播放 {m_state = QMediaPlayer::PlayingState;m_pMediaPlayer->play(); }void Widget::on_btn_stop_clicked()//暫停 {m_state = QMediaPlayer::PausedState;m_pMediaPlayer->pause(); }void Widget::on_voice_control_valueChanged(int value)//設置聲音 {m_pMediaPlayer->setVolume(value); }void Widget::resizeEvent(QResizeEvent *event) {m_pVideoWidget->resize(ui->label->size());//設置播放窗口大小 }void Widget::on_btn_fullshow_clicked()//全屏 {showMaximized(); }void Widget::keyPressEvent(QKeyEvent* e)//鍵盤控制暫停和窗口還原 {if(Qt::Key_Escape == e->key()){resize(930,710);move(400,60);}if(Qt::Key_Space == e->key()){if(m_state == QMediaPlayer::PlayingState){m_state = QMediaPlayer::PausedState;m_pMediaPlayer->pause();}else if(m_state == QMediaPlayer::PausedState){m_state = QMediaPlayer::PlayingState;m_pMediaPlayer->play();}} } void Widget::mouseDoubleClickEvent(QMouseEvent *e)//鼠標雙擊事件 {showMaximized();//最大化 }void Widget::mousePressEvent(QMouseEvent* e)//鼠標控制播放狀態(tài) {if(Qt::LeftButton == e->button()){if(m_state == QMediaPlayer::PausedState){m_state = QMediaPlayer::PlayingState;m_pMediaPlayer->play();}else if(m_state == QMediaPlayer::PlayingState){m_state = QMediaPlayer::PausedState;m_pMediaPlayer->pause();}}}void Widget::getduration(qint64 playtime)//總時長槽 {if(!m_sliderstate){playtime = m_pMediaPlayer->duration();setget_Alltime(playtime);} }void Widget::setget_Alltime(qint64 playtime)//獲取視頻總時長并設置到標簽,滑條 {playtime/=1000;ui->progress_report->setMinimum(0);//設置進度條的最大值最小值ui->progress_report->setMaximum(playtime);m_hour = playtime/3600;m_munete = (playtime - m_hour*3600)/60;m_second = playtime-m_hour*3600-m_munete*60;//qDebug()<<m_hour<<m_munete<<m_second;QString str = QString("%1:%2:%3").arg(m_hour).arg(m_munete).arg(m_second);ui->label_all_time->setText(str); }void Widget::setget_currenttime(qint64 playtime)//獲取當時播放位置并設置 {//playtime時間的毫秒 一下操作是將毫秒轉(zhuǎn)為為h-m-splaytime/=1000;settimeslider(playtime);int h,m,s;h = playtime/3600;m = (playtime - h*3600)/60;s = playtime-h*3600-m*60;//qDebug()<<h<<m<<s;QString str = QString("%1:%2:%3").arg(h).arg(m).arg(s);ui->label_ct->setText(str); }void Widget::getposition(qint64 playtime) //獲取當前播放位置槽 {if(!m_sliderstate){playtime = m_pMediaPlayer->position();//獲取當前播放位置setget_currenttime(playtime);} }void Widget::settimeslider(qint64 playtime)//設置進度條 {if(!m_sliderstate)ui->progress_report->setValue(playtime); }void Widget::on_btn_ht_clicked()//上一個 {m_pMediaPlayer->stop();//先暫停int count = m_MediaPlaylist->mediaCount();if (0 == count)return;m_MediaPlaylist->previous();m_pMediaPlayer->play(); }void Widget::on_Btn_qj_clicked()//下一個 {m_pMediaPlayer->stop();//先暫停int count = m_MediaPlaylist->mediaCount();//獲取播放列表中的行總數(shù)if (0 == count)return;m_MediaPlaylist->next();//下一個m_pMediaPlayer->play(); }//獲取雙擊的哪一行 并設置播放 void Widget::on_listWidget_doubleClicked(const QModelIndex &index) {int i = index.row();//獲取選中行m_MediaPlaylist->setCurrentIndex(i);//將播放列表中的當前行換為list中選中的行m_pMediaPlayer->play(); }
  • myslider.h
#ifndef MYSLIDER_H #define MYSLIDER_H#include <QMouseEvent> #include <QSlider>class MySlider : public QSlider {Q_OBJECT public:explicit MySlider(QWidget *parent = nullptr); protected:void mousePressEvent(QMouseEvent *ev);void mouseReleaseEvent(QMouseEvent *ev); signals:void mousepress(int value);void mouserelease(int value); public slots: };#endif // MYSLIDER_H
  • myslider.cpp
#include "myslider.h" #include <QDebug>MySlider::MySlider(QWidget *parent) : QSlider(parent) {} void MySlider::mousePressEvent(QMouseEvent *ev) {//獲取當前點擊位置,得到的這個鼠標坐標是相對于當前QSlider的坐標int currentX = ev->pos().x();//獲取當前點擊的位置占整個Slider的百分比double per = currentX *1.0 /this->width();//利用算得的百分比得到具體數(shù)字int value = per*(this->maximum() - this->minimum()) + this->minimum();//設定滑動條位置this->setValue(value);//滑動條移動事件等事件也用到了mousePressEvent,加這句話是為了不對其產(chǎn)生影響,使得Slider能正常相應其他鼠標事件qDebug()<<value;emit mousepress(value);QSlider::mousePressEvent(ev); } void MySlider::mouseReleaseEvent(QMouseEvent *ev) {//獲取當前點擊位置,得到的這個鼠標坐標是相對于當前QSlider的坐標int currentX = ev->pos().x();//獲取當前點擊的位置占整個Slider的百分比double per = currentX *1.0 /this->width();//利用算得的百分比得到具體數(shù)字int value = per*(this->maximum() - this->minimum()) + this->minimum();//設定滑動條位置this->setValue(value);//滑動條移動事件等事件也用到了mousePressEvent,加這句話是為了不對其產(chǎn)生影響,使得Slider能正常相應其他鼠標事件qDebug()<<value;emit mouserelease(value);QSlider::mouseReleaseEvent(ev); }
  • main.cpp
#include "widget.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }

至此一個簡易的音視頻播放器便已經(jīng)開發(fā)完成,至于快進,后退,倍速播放等功能就看著需求自己完善吧~



最后貼上成品展示圖

由于本人犯懶了,所以界面看起來很簡陋,但是你可根據(jù)自己的需求寫一個漂亮的界面出來,希望到時候你能和我分享一下你的界面

總結(jié)

以上是生活随笔為你收集整理的Qt实现音视频播放器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。