视频直播客户端

05 11月
作者:cinjep|分类:代码开源

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

开发环境:windows10 Qt5.15.2 C++

sdk : QtVLC

运行环境:x86 win7-11

直播客户端-0.PNG


直播客户端-1.PNG


直播客户端-2.PNG


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


浏览144
返回
目录
返回
首页
网卡MAC采集器 批量图片合并生成PDF文档