首页 > 编程知识 正文

QT播放器(qt视频播放为什么卡)

时间:2023-05-06 04:15:18 阅读:71974 作者:69

此博客提供如何使用qMediaPlayer和qvideowidget播放视频文件(avi,mp4 )以及显示进度。 也可以通过拖动进度条来改变播放位置。 相关代码可以从我的资源下载“基于qt的视频播放器”

pro文件:

---------------------## projectcreatedbyqtcreation-------------------Qt=coreguimultimediamultimation4) 3360 Qt=Wii

# include ' video player.h ' # includeqapplicationintmain (int argv,char *argv[] () qapplicationa ) argc,argv ); 视频播放器w; w.show (; return a.exec (; }视频播放器是我定义的播放器表单类。 包括QMediaplayer、QVideoWidget、播放按钮、停止按钮、加载按钮和进度条播放器滑块。 视频播放器ui文件的外观如下所示。

其中的PlayerSlider从QSlider继承,行动定义如下。

# ifndefplayerslider _ h # defineplayerslider _ h # includeqslider # includeqmouseeventclassplayerslider 3360 publicqslider { signals :语音进度(qint 64 ); 私有: bool m _ bpressed; protected : voidmousepressevent (qmouseevent *; 语音事件(qmouseevent *; 语音会话事件(qmouseevent *; (; # endif//player slider _ h # include ' player slider.h ' player slider 33603360 player slider (q构件* parent ) 3360 q滑动器q slider :3360 mousepressevent (e; //一定要有这个短语。 否则无法手动移动滑块。 (语音播放器3360:移动事件(qmouseevent * e ) q滑动器:移动事件(e ) ); //一定要有这个短语。 否则无法手动移动滑块。 (voidplayerslider 33603360 mousereleaseevent (qmouseevent * e ) { m_bPressed=false; qint64 i64Pos=value (; emitsigprogress (I 64销售点; q slider : mousereleaseevent (e; //一定要有这个短语。 否则无法手动移动滑块。 (语音播放器33603360 set progress (qint 64 I 64 progress ) if (! m_bpressed(setvalue ) I64progress; }这个班有三个角色。 1 )接收来自QMediaPlaer的进度信息,更新进度条; 2 )用户操作进度条时,进度条不再响应来自QMediaPlaer的进度信息3 )用户完成拖动进度条后,向QMediaPlaer发送播放位置更新信息。

另一个类是视频播放器,其行为定义如下:

# ifndefvideoplayer _ h # definevideoplayer _ h # includeqwidget # includeqtmultimedia # includeqvideowid

get>namespace Ui {class VideoPlayer;}class VideoPlayer : public QWidget{ Q_OBJECTpublic: explicit VideoPlayer(QWidget *parent = 0); ~VideoPlayer(); bool m_bReLoad;public slots: void OnSetMediaFile(void); void OnSlider(qint64); void OnDurationChanged(qint64); void OnStateChanged(QMediaPlayer::State);private: QVideoWidget * m_pPlayerWidget; QMediaPlayer * m_pPlayer; Ui::VideoPlayer *ui;};#endif // VIDEOPLAYER_H #include "videoplayer.h"#include "ui_videoplayer.h"#include <QFileDialog>VideoPlayer::VideoPlayer(QWidget *parent) : QWidget(parent), ui(new Ui::VideoPlayer){ ui->setupUi(this); m_pPlayer = new QMediaPlayer; m_pPlayerWidget = new QVideoWidget; m_pPlayer->setVideoOutput(m_pPlayerWidget); ui->verticalLayout->addWidget(m_pPlayerWidget); m_pPlayerWidget->setAutoFillBackground(true); QPalette qplte; qplte.setColor(QPalette::Window, QColor(0,0,0)); m_pPlayerWidget->setPalette(qplte); //载入 connect(ui->BtnLoad, SIGNAL(clicked()), this, SLOT(OnSetMediaFile())); //播放 connect(ui->BtnPlay, SIGNAL(clicked()), m_pPlayer, SLOT(play())); //停止 connect(ui->BtnStop, SIGNAL(clicked()), m_pPlayer, SLOT(stop())); connect(m_pPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(OnStateChanged(QMediaPlayer::State))); ui->BtnStop->setEnabled(false); //设置滑块行为 m_bReLoad = true; ui->slider->setEnabled(false); connect(m_pPlayer, SIGNAL(positionChanged(qint64)), this, SLOT(OnSlider(qint64))); connect(m_pPlayer, SIGNAL(durationChanged(qint64)), this, SLOT(OnDurationChanged(qint64))); connect(ui->slider, SIGNAL(sigProgress(qint64)), m_pPlayer, SLOT(setPosition(qint64)));}VideoPlayer::~VideoPlayer(){ delete m_pPlayer; delete m_pPlayerWidget; delete ui;}void VideoPlayer::OnSetMediaFile(void){ QFileDialog dialog(this); dialog.setFileMode(QFileDialog::AnyFile); QStringList fileNames; if (dialog.exec()) fileNames = dialog.selectedFiles(); if(!fileNames.empty()) { m_pPlayer->setMedia(QUrl::fromLocalFile(fileNames[0])); m_bReLoad = true; ui->slider->setValue(0); }}void VideoPlayer::OnSlider(qint64 i64Pos){ ui->slider->setProgress(i64Pos);}void VideoPlayer::OnDurationChanged(qint64 i64Duration){ if(i64Duration > 0 && m_bReLoad) { ui->slider->setRange(0, i64Duration); m_bReLoad = false; }}void VideoPlayer::OnStateChanged(QMediaPlayer::State enumState){ if(QMediaPlayer::StoppedState == enumState) { ui->BtnPlay->setEnabled(true); ui->BtnStop->setEnabled(false); ui->slider->setEnabled(false); } else if(QMediaPlayer::PlayingState == enumState) { ui->BtnPlay->setEnabled(false); ui->BtnStop->setEnabled(true); ui->slider->setEnabled(true); }}

之所以在他的构造函数里设置QPalette,是因为假如不这样,在程序启动时,m_pPlayer不是黑色,而是与背景同样的颜色,显得不好看。

显示效果:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。