Qt视频直播软件--项目实战(Day7)

Qt视频直播软件--项目实战(Day7)

第七天项目日记

1、今日总结

完成有关弹幕的相关内容的开发 用户发送弹幕之后,开播的人显示弹幕,观看直播的人也显示弹幕 自己发的弹幕用绿色的框框起来 别人发的弹幕直接显示

2、设计思路

参考连接. 对于弹幕的实现,这里使用了定时器,弹幕的队列用vector显示,然后vector中存入Qlabel类,发送或者接收到弹幕之后就给vector中添加对应的label 对于弹幕的移动用QTimer 每20ms移动一次移动到边界之后自动消失 弹幕的长度根据字符串来自适应,弹幕移动到边界之后自动消失并且清除缓存

弹幕的发送流程,对于加入直播间的客户端,服务器端进行记录加入的房间号,对于开播的直播间来说,记录开播的房间号。

发送弹幕之后,客户端发送消息给服务器,服务器转发弹幕消息,转发给对于房间号开播的客户端以及正在观看该直播间的用户。 客户端收到消息之后,随机现在弹幕的位置在视频界面。 (后面有时间会整理一个流程图出来)

3、代码说明

服务器

服务器主要是对消息的接收和发送的修改

首先是加入直播间和离开直播间 离开直播间只需要清空自定义tcpsocket的类的加入直播间的房间名称即可 然后是弹幕消息的格式

主要修改以上四个文件

message.h

增加了三种消息

myjson.h

消息的打包和解析

#ifndef MYJSON_H

#define MYJSON_H

#include

#include

#include

#include

#include

#include

class MyJson

{

public:

MyJson();

//解析用户名和密码

QString name_pswd_info(QString message,QString &pswd,QString &name);

//打包直播刷新消息

QString pack_live_flush(QString action,QStringList name_list);

//解析加入直播json

QString join_info(QString message,QString &room_name);

//解析弹幕消息

QString barrage_info(QString message,QString &from, QString &room_name, QString &desc);

//打包返回的弹幕消息

QString pack_ret_barrage_info(QString from, QString desc);

};

#endif // MYJSON_H

myjson.cpp

#include "myjson.h"

MyJson::MyJson()

{

}

QString MyJson::name_pswd_info(QString message, QString &pswd, QString &name)

{

QByteArray bytes = message.toUtf8();

QJsonParseError jsonError;

QJsonDocument doucment = QJsonDocument::fromJson(bytes, &jsonError);

if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)) {

// 解析未发生错误

if (doucment.isObject()){

QJsonObject object = doucment.object(); // 转化为对象

if (object.contains("Name")) {

QJsonValue value = object.value("Name");

if (value.isString()) {

name = value.toString();

qDebug() << "Name : " << name;

}

}else{

return "json_error_no_name";

}

if (object.contains("password")) {

QJsonValue value = object.value("password");

if (value.isString()) {

pswd = value.toString();

qDebug() << "pswd : " << pswd;

}

}else{

return "json_error_no_pswd";

}

}else{

return "json is no object";

}

}else{

return "json error";

}

return "success";

}

QString MyJson::pack_live_flush(QString action, QStringList name_list)

{

QJsonObject json;

json.insert("action",action);

QJsonArray json_array;

for (int i = 0; i < name_list.size(); ++i){

json_array.insert(i,name_list.at(i));

}

json.insert("name",json_array);

QJsonDocument document;

document.setObject(json);

QByteArray byteArray = document.toJson(QJsonDocument::Compact);

QString strJson(byteArray);

return strJson;

}

QString MyJson::join_info(QString message, QString &room_name)

{

QByteArray bytes = message.toUtf8();

QJsonParseError jsonError;

QJsonDocument doucment = QJsonDocument::fromJson(bytes, &jsonError);

if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)) {

// 解析未发生错误

if (doucment.isObject()){

QJsonObject object = doucment.object(); // 转化为对象

if (object.contains("join")) {

QJsonValue value = object.value("join");

if (value.isString()) {

room_name = value.toString();

qDebug() << "join : " << room_name;

}

}else{

return "json_error_no_join";

}

}else{

return "json is no object";

}

}else{

return "json error";

}

return "success";

}

QString MyJson::barrage_info(QString message, QString &from, QString &room_name, QString &desc)

{

QByteArray bytes = message.toUtf8();

QJsonParseError jsonError;

QJsonDocument doucment = QJsonDocument::fromJson(bytes, &jsonError);

if (!doucment.isNull(

相关推荐