生活随笔
收集整理的這篇文章主要介紹了
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)
#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_OBJECT
public: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
; int m_hour
; int m_munete
; int m_second
; bool m_sliderstate
; int m_slider_crtval
;
};#endif
#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
);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;connect(ui
->progress_report
,&MySlider
::mousepress
,[=](int val
){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);ui
->progress_report
->setValue(val
*1000);m_state
= QMediaPlayer
::PlayingState
;m_pMediaPlayer
->play();qint64 playtime
= m_pMediaPlayer
->position();setget_currenttime(playtime
);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
){QUrl
url(arg
);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
)
{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;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
/=1000;settimeslider(playtime
);int h
,m
,s
;h
= playtime
/3600;m
= (playtime
- h
*3600)/60;s
= playtime
-h
*3600-m
*60;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();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
);m_pMediaPlayer
->play();
}
#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
#include "myslider.h"
#include <QDebug>MySlider::MySlider(QWidget
*parent
) : QSlider(parent
)
{}
void MySlider::mousePressEvent(QMouseEvent
*ev
)
{int currentX
= ev
->pos().x();double per
= currentX
*1.0 /this->width();int value
= per
*(this->maximum() - this->minimum()) + this->minimum();this->setValue(value
);qDebug()<<value
;emit
mousepress(value
);QSlider::mousePressEvent(ev
);
}
void MySlider::mouseReleaseEvent(QMouseEvent
*ev
)
{int currentX
= ev
->pos().x();double per
= currentX
*1.0 /this->width();int value
= per
*(this->maximum() - this->minimum()) + this->minimum();this->setValue(value
);qDebug()<<value
;emit
mouserelease(value
);QSlider::mouseReleaseEvent(ev
);
}
#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)容還不錯,歡迎將生活随笔推薦給好友。