视频直播客户端
为方便观看直播而开发的直播客户端,包含了常用的功能和按钮,以简洁、方便使用为目的开发,在同级目录中更改或添加“videoList.json”文件中视频链接,即可用于不同场景,支持mp4,flv等常见格式。
开发环境:windows10 Qt5.15.2 C++
sdk : QtVLC
运行环境:x86 win7-11



player.cpp
#include "player.h"
#include "ui_player.h"
#include <QNetworkInterface>
#include <QTimer>
#include <QDebug>
#include <QFile>
#include <QListView>
#include <QDir>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
bool isStart = false;
bool isPause = false;
bool isStop = false;
bool isVlumn = false;
int mediaStatus = 0;
bool maximized = false;
Player::Player(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::Player)
{
ui->setupUi(this);
this->init();
vlcInstance = new VlcInstance(VlcCommon::args(), this);
vlcPlayer = new VlcMediaPlayer(vlcInstance);
vlcPlayer->setVideoWidget(ui->VlcWidget);
ui->vlumnSlider->setMinimum(0);
ui->vlumnSlider->setMaximum(100);
connect(timer,&QTimer::timeout,this,&Player::timeoutSlot);
time.setHMS(0, 0, 0); //设置时间为00:00:00:000
ui->timerLabel->setText("00:00:00"); //显示到ui界面
connect(ui->startBtn,&QPushButton::clicked,this,&Player::vlcStart);
connect(ui->pauseBtn,&QPushButton::clicked,this,&Player::vlcPause);
connect(ui->stopBtn,&QPushButton::clicked,this,&Player::vlcStop);
connect(ui->vlumnSlider,&QSlider::valueChanged,this,&Player::setPlayerVlumn);
connect(ui->vlumnBtn,&QPushButton::clicked,this,&Player::isMusic);
vlcPlayer->audio()->setVolume(ui->vlumnSlider->value());
connect(ui->minBtn,&QPushButton::clicked,this,&Player::showMinimized);
connect(ui->closeBtn,&QPushButton::clicked,this,&Player::close);
connect(ui->toggleBtn, &QPushButton::clicked, [&]() {
if (maximized) {
setWindowState(Qt::WindowNoState);
ui->toggleBtn->setStyleSheet("#toggleBtn{border-image: url(:/res/max.png);} #toggleBtn:hover{border-image: url(:/res/max-1.png);}");
ui->toggleBtn->setToolTip("最大化");
} else {
setWindowState(Qt::WindowMaximized);
ui->toggleBtn->setStyleSheet("#toggleBtn{border-image: url(:/res/normal.png);} #toggleBtn:hover{border-image: url(:/res/normal-1.png);}");
ui->toggleBtn->setToolTip("恢复");
}
maximized = !maximized;
});
}
Player::~Player()
{
delete vlcInstance;
delete vlcMedia;
delete vlcPlayer;
delete timer;
delete ui;
}
void Player::init()
{
this->setWindowFlags(Qt::FramelessWindowHint); //隐藏窗体边框和标题栏
ui->minBtn->setToolTip("最小化");
ui->closeBtn->setToolTip("关闭");
ui->startBtn->setStyleSheet("border-image: url(:/res/start-1.png)");
ui->pauseBtn->setStyleSheet("border-image: url(:/res/pause.png)");
ui->stopBtn->setStyleSheet("border-image: url(:/res/stop.png)");
ui->vlumnBtn->setStyleSheet("border-image: url(:/res/vlumn_0.png)");
ui->minBtn->setStyleSheet("#minBtn{border-image: url(:/res/min.png);} #minBtn:hover{border-image: url(:/res/min-1.png);}");
ui->toggleBtn->setStyleSheet("#toggleBtn{border-image: url(:/res/max.png);} #toggleBtn:hover{border-image: url(:/res/max-1.png);}");
ui->closeBtn->setStyleSheet("#closeBtn{border-image: url(:/res/close.png);} #closeBtn:hover{border-image: url(:/res/close-1.png);}");
ui->widgetCtl->installEventFilter(this);
this->setStyleSheet(this->loadStyleSheet(":/res/style.qss"));
ui->videoListCmb->setView(new QListView());
this->videoList();
ui->stopBtn->setEnabled(false);
ui->pauseBtn->setEnabled(false);
}
QString Player::loadStyleSheet(const QString path)
{
QFile qssFile(":/res/style.qss");
QString qssStr;
if (qssFile.open(QIODevice::ReadOnly | QIODevice::Text))
{
QTextStream qssInput(&qssFile);
while(!qssInput.atEnd())
{
qssStr += qssInput.readLine();
}
qssFile.close();
}
return qssStr;
}
void Player:: vlcStart()
{
QString url = ui->videoListCmb->currentData().toString();
if (!url.isEmpty()){
vlcMedia = new VlcMedia(url, vlcInstance);
vlcPlayer->open(vlcMedia);
ui->startBtn->setStyleSheet("border-image: url(:/res/start.png)");
ui->pauseBtn->setStyleSheet("border-image: url(:/res/pause-1.png)");
ui->stopBtn->setStyleSheet("border-image: url(:/res/stop-1.png)");
ui->videoListCmb->setEnabled(false);
timer->start(1000);
ui->stopBtn->setEnabled(true);
ui->pauseBtn->setEnabled(true);
ui->startBtn->setEnabled(false);
}
}
void Player::vlcPause()
{
ui->pauseBtn->setStyleSheet("border-image: url(:/res/pause.png)");
ui->startBtn->setStyleSheet("border-image: url(:/res/start-1.png)");
vlcPlayer->pause();
timer->stop();
ui->startBtn->setEnabled(true);
}
void Player::vlcStop()
{
vlcPlayer->stop();
ui->stopBtn->setStyleSheet("border-image: url(:/res/stop.png)");
ui->pauseBtn->setStyleSheet("border-image: url(:/res/pause.png)");
ui->startBtn->setStyleSheet("border-image: url(:/res/start-1.png)");
ui->videoListCmb->setEnabled(true);
timer->stop(); //关闭定时器
time.setHMS(0, 0, 0); //设置时间为00:00:00:000
ui->timerLabel->setText("00:00:00"); //显示到ui界面
ui->startBtn->setEnabled(true);
}
void Player::timeoutSlot()
{
time = time.addSecs(1);
ui->timerLabel->setText(time.toString("hh:mm:ss")); //显示到ui界面
}
void Player::videoList()
{
QString fullFileName= QDir::currentPath()+"/videoList.json";
QFile file(fullFileName);
if(!file.open(QIODevice::ReadOnly)) {
return;
}
QJsonParseError *error=new QJsonParseError;
QJsonDocument jsonDoc=QJsonDocument::fromJson(file.readAll(),error);
if(error->error!=QJsonParseError::NoError)
{
return;
}
QJsonObject jsonObj = jsonDoc.object();
if(jsonObj.contains(QStringLiteral("videoList"))){
QJsonValue arrayValue = jsonObj.value(QStringLiteral("videoList"));
if (arrayValue.isArray()) {
QJsonArray array = arrayValue.toArray();
for (int i = 0; i < array.size(); i++) {
QJsonValue nameArray = array.at(i);
QJsonObject key = nameArray.toObject();
QString name = key["name"].toString();
QString source = key["source"].toString();
ui->videoListCmb->addItem(name,source);
}
}
}
}
void Player::setPlayerVlumn(int data)
{
data = ui->vlumnSlider->value();
vlcPlayer->audio()->setVolume(data);
if(data==0){
ui->vlumnBtn->setStyleSheet("border-image: url(:/res/vlumn_0.png)");
}
if(data<=50 && data>0){
ui->vlumnBtn->setStyleSheet("border-image: url(:/res/vlumn_1.png)");
}
if(data>50 ){
ui->vlumnBtn->setStyleSheet("border-image: url(:/res/vlumn_2.png)");
}
}
void Player::isMusic()
{
int data = vlcPlayer->audio()->volume();
if(data == 0){
vlcPlayer->audio()->setVolume(50);
ui->vlumnSlider->setValue(50);
}
else{
vlcPlayer->audio()->setVolume(0);
ui->vlumnSlider->setValue(0);
}
}
void Player::mousePressEvent(QMouseEvent *event)
{
if(event->button()==Qt::LeftButton)
{
//记录鼠标左键状态
m_leftButtonPressed = true;
//记录鼠标在屏幕中的位置
m_start = event->globalPos();
}
}
void Player::mouseMoveEvent(QMouseEvent *event)
{
if(m_leftButtonPressed && !this->window()->isMaximized())
{
this->window()->move(this->window()->geometry().topLeft()+event->globalPos()-m_start);
m_start = event->globalPos();
}
}
void Player::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button()==Qt::LeftButton){
m_leftButtonPressed = false;
}
}
bool Player::eventFilter(QObject *watched, QEvent * event)
{
if(event->type()==QEvent::MouseButtonDblClick)
{
QMouseEvent * e = static_cast<QMouseEvent *>(event);
if(e->button() == Qt::LeftButton)
{
if(watched==ui->widgetCtl)
ui->toggleBtn->click();
return true;
}
}
return QWidget::eventFilter(watched, event);
}player.h
#ifndef PLAYER_H
#define PLAYER_H
#include <QMainWindow>
#include <VLCQtCore/Common.h>
#include <VLCQtCore/Instance.h>
#include <VLCQtCore/Media.h>
#include <VLCQtCore/MediaPlayer.h>
#include <VLCQtCore/Audio.h>
#include <QTimer>
#include <QTime>
#include <QMouseEvent>
QT_BEGIN_NAMESPACE
namespace Ui {
class Player;
}
QT_END_NAMESPACE
class Player : public QMainWindow
{
Q_OBJECT
public:
Player(QWidget *parent = nullptr);
~Player();
void init();
QString loadStyleSheet(const QString path);
void videoList();
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
bool eventFilter(QObject *watched, QEvent *event);
private slots:
void vlcStart();
void vlcPause();
void vlcStop();
void timeoutSlot();
void setPlayerVlumn(int data);
void isMusic();
private:
Ui::Player *ui;
VlcInstance *vlcInstance;
VlcMedia *vlcMedia;
VlcMediaPlayer *vlcPlayer;
QTimer *timer = new QTimer;
QTime time;
QPoint m_start; //起始点
QPoint m_end; //结束点
bool m_leftButtonPressed;
};
#endif // PLAYER_H项目配置文件中加入:
LIBS += -L$$PWD/sdk/lib/ -llibVLCQtCore.dll -llibVLCQtWidgets.dll INCLUDEPATH += $$PWD/sdk/include DEPENDPATH += $$PWD/sdk/include
目录 返回
首页