【项目实战】C++视频共享点播体系

[复制链接]
发表于 2026-2-9 11:17:22 | 显示全部楼层 |阅读模式
目次
一、项目先容
1.1 对视频共享点播体系的认识
1.2服务端步伐负责功能
1.3 服务端功能模块分别
1.4 项目界面演示
1.5准备知识
二.情况搭建
2.1 安装 Jsoncpp 库
2.1.1 利用jsoncpp
2.2 引入httplib库
2.2.1 安装Git(如果你的体系尚未安装Git)
2.2.2 克隆堆栈
2.2.3 利用httplib
2.3 Mysql 数据库及开辟包安装
2.3.1 安装MySQL服务器
2.3.2 安装MySQL客户端
2.3.3 安全设置(安装后发起实验)
2.3.4 启动、克制、重启 登录 MySQL服务
三.项⽬实现
3.1服务端⼯具类实现
3.1.1⽂件实⽤⼯具类操持
3.1.2 Json 实⽤⼯具类操持
3.2 服务端数据管理模块
3.2.1 视频数据表的操持
3.2.2 数据管理类操持
3.3 服务端业务处理惩罚模块
3.3.1 ⽹络通讯接⼝操持
3.3.2 业务处理惩罚模块类的操持
3.3.2 终极归并调试
3.4 前端界⾯模块实现
3.4.1 前端视频展示⻚⾯
3.4.2 前端视频观看页面的实现
四.项⽬总结


一、项目先容

1.1 对视频共享点播体系的认识

   
       
  • 搭建视频共享点播服务器,可以让全部人通过欣赏器访问服务器,实现视频的上传观看,以及管理并播放的功能   
  • 告急是完成服务器端的步伐业务功能的实现以及前端访问界面 html 的编写,可以大概支持客户端欣赏器针对服务器上的全部视频举行操纵。  
  1.2服务端步伐负责功能

   
       
  • 针对客⼾端上传的视频⽂件以及封⾯图⽚进⾏备份存储。   
  • 针对客⼾端上传的视频完成增编削查功能   
  • ⽀持客⼾端欣赏器进⾏视频的观看功能  
  1.3 服务端功能模块分别

   该视频点播体系根本上包罗四个模块:数据管理、网络通讯、业务处理惩罚、前端界面
   
       
  • 数据管理模块:负责针对客户端上传的视频信息举行管理。   
  • 网络通讯模块:搭建网络通讯服务器,实现与客户端通讯。   
  • 业务处理惩罚模块:针对客户端的各个哀求举行对应业务处理惩罚并相应效果。   
  • 前端界面模块:前端欣赏器上视频共享点播的各个 html 页面,在页面中支持增编削查以及观看功能。  
  1.4 项目界面演示

   项目团体有俩个页面,分别为主界面和观看界面
  主界面告急    用于 视频展示、视频上传、视频搜索
  观看界面告急用于 视频观看、视频信息修改、视频删除
  以下为项目页面功能展示
  







1.5准备知识

   认识 JsonCpp
  http://t.csdnimg.cn/lsz2o
http://t.csdnimg.cn/lsz2o
   认识 MySQL数据库API
  http://t.csdnimg.cn/hpxg1
http://t.csdnimg.cn/hpxg1
   认识 httplib
  http://t.csdnimg.cn/SvQJz
http://t.csdnimg.cn/SvQJz
二.情况搭建

   我的服务器Ubuntu22.04
  2.1 安装 Jsoncpp 库

  1. sudo apt update
  2. sudo apt -y install libjsoncpp25
复制代码
2.1.1 利用jsoncpp

  1. #include <jsoncpp/json/json.h>
复制代码
2.2 引入httplib库

2.2.1 安装Git(如果你的体系尚未安装Git)

  1. sudo apt update
  2. sudo apt install git
复制代码
2.2.2 克隆堆栈

   打开终端,利用cd下令切换到你想要存放cpp-httplib库的目次,然后运行以下下令来克隆堆栈:
  1. git clone https://github.com/yhirose/cpp-httplib.git
复制代码
2.2.3 利用httplib

   直接在你的C++代码中包罗httplib.h头文件。你可以将其复制到你的项目中符合的位置,然后在源文件中包罗它
  1. #include "httplib.h"
复制代码
2.3 Mysql 数据库及开辟包安装

2.3.1 安装MySQL服务器

  1. sudo apt update //更新本地包数据库
  2. sudo apt install mysql-server//安装最新版本的MySQL
复制代码
2.3.2 安装MySQL客户端

  1. sudo apt install mysql-client
复制代码
2.3.3 安全设置(安装后发起实验)

  1. sudo mysql_secure_installation//按照提示设置root用户的密码,移除匿名用户,禁止root用户远程登录等
  2. sudo systemctl status mysql //确认MySQL服务状态
复制代码
2.3.4 启动、克制、重启 登录 MySQL服务

  1. sudo systemctl start mysql //启动服务
  2. sudo systemctl stop mysql  //停止服务
  3. sudo systemctl restart mysql//重启服务
  4. mysql -u root -p 使用root用户登录
复制代码
三.项⽬实现

3.1服务端⼯具类实现

3.1.1⽂件实⽤⼯具类操持

   
     在视频点播体系中由于涉及到⽂件上传,必要对上传的⽂件进⾏备份存储,因此⾸先操持封装⽂件操纵类,这个类封装完毕之后,则在恣意模块中对⽂件进⾏操纵时都将变的简朴化      功能:
  
       
  • 构造函数 FileUtil(const std::string name):
           
    • 吸取一个字符串参数 name,体现文件的路径和名称,并将这个值赋给私有成员变量 _name。   
       
  • Exists - 查抄文件是否存在:
           
    • 利用 access 函数和 F_OK 标志来查抄文件是否存在。     
    • 如果 access 函数返回非0值,体现文件不存在,函数输堕落误信息并返回 false。     
    • 如果文件存在,返回 true。   
       
  • Size - 获取文件巨细:
           
    • 起首查抄文件是否存在,如果不存在则返回0。     
    • 利用 stat 函数获取文件的属性,并将文件巨细存储在 st.st_size 中。     
    • 如果 stat 函数返回非0值,体现获取文件属性失败,函数输堕落误信息并返回0。     
    • 乐成获取属性后,返回文件巨细。   
       
  • GetContent - 读取文件内容:
           
    • 打开文件以二进制模式读取。     
    • 如果文件无法打开,输堕落误信息并返回 false。     
    • 利用 Size 函数获取文件巨细,并根据巨细调解 body 字符串的容量。     
    • 读取文件内容到 body 字符串中。     
    • 如果读取失败,输堕落误信息,关闭文件,并返回 false。     
    • 乐成读取后,关闭文件并返回 true。   
       
  • SetContent - 向文件写入数据
           
    • 打开文件以二进制模式写入。     
    • 如果文件无法打开,输堕落误信息并返回 false。     
    • 利用 write 函数将 body 字符串的内容写入文件。     
    • 如果写入失败,输堕落误信息,关闭文件,并返回 false。     
    • 乐成写入后,关闭文件并返回 true。   
       
  • CreateDirectory - 创建目次:
           
    • 起首查抄目次是否存在,如果存在则直接返回 true。     
    • 利用 mkdir 函数创建目次,如果创建乐成则返回 true。   
       
  • 注意,这个类利用了C++标准库中的文件操纵函数,如 access、stat、ifstream、ofstream 和 mkdir。这些函数必要包罗相应的头文件,比方 <fstream>、<sys/stat.h> 和 <unistd.h>。  
  1. class FileUtil{
  2.                 private:
  3.                         std::string _name;//文件路径名称
  4.                 public:
  5.                         FileUtil(const std::string name):_name(name){}
  6.                         // 判断当前文件是否存在
  7.                         bool Exists(){
  8.                                 //access的F_OK专门用于检测文件是否存在--- 存在则返回0
  9.                                 int ret = access(_name.c_str(), F_OK);
  10.                                 if (ret != 0) {
  11.                                         std::cout << "文件不存在\n";
  12.                                         return false;
  13.                                 }
  14.                                 return true;
  15.                         }
  16.                         // 获取文件大小
  17.                         size_t Size() {
  18.                                 if (this->Exists() == false) {
  19.                                         return 0;
  20.                                 }
  21.                                 struct stat st;
  22.                                 //stat接口用于获取文件属性,其中 st_size就是文件大小成员
  23.                                 int ret = stat(_name.c_str(), &st);
  24.                                 if (ret != 0) {
  25.                                         std::cout << "获取文件属性失败\n";
  26.                                         return 0;
  27.                                 }
  28.                                 return st.st_size;
  29.                         }
  30.                         // 读取文件数据到body中
  31.                         bool GetContent(std::string *body) {
  32.                                 std::ifstream ifs;
  33.                                 ifs.open(_name, std::ios::binary);
  34.                                 if (ifs.is_open() == false) {
  35.                                         std::cout << "文件打开失败\n";
  36.                                         return false;
  37.                                 }
  38.                                 size_t flen = this->Size();
  39.                                 body->resize(flen);
  40.                                 ifs.read(&(*body)[0], flen);
  41.                                 if (ifs.good() == false) {
  42.                                         std::cout << "读取文件内容失败\n";
  43.                                         ifs.close();
  44.                                         return false;
  45.                                 }
  46.                                 ifs.close();
  47.                                 return true;
  48.                         }
  49.                         // 像文件写入数据
  50.                         bool SetContent(const std::string &body) {
  51.                                 std::ofstream ofs;
  52.                                 ofs.open(_name, std::ios::binary);
  53.                                 if (ofs.is_open() == false) {
  54.                                         std::cout << "文件打开失败\n";
  55.                                         return false;
  56.                                 }
  57.                                 ofs.write(body.c_str(), body.size());
  58.                                 if (ofs.good() == false) {
  59.                                         std::cout << "写入文件内容失败\n";
  60.                                         ofs.close();
  61.                                         return false;
  62.                                 }
  63.                                 ofs.close();
  64.                                 return true;
  65.                         }
  66.                         //针对目录时创建目录
  67.                         bool CreateDirectory() {
  68.                                 if (this->Exists()) {
  69.                                         return true;
  70.                                 }
  71.                                 mkdir(_name.c_str(), 0777);
  72.                                 return true;
  73.                         }
  74.         };
复制代码
3.1.2 Json 实⽤⼯具类操持

   
  功能:
  
       
  • Serialize - 序列化函数:
           
    • 这个函数担当一个Json::Value范例的参数value和一个指向std::string的指针body。     
    • 利用Json::StreamWriterBuilder创建一个Json::StreamWriter对象,用于将Json::Value对象写入到字符串流中。     
    • 通过write方法将value序列化到std::stringstream对象ss中。     
    • 如果序列化失败(write方法返回非0值),则输堕落误信息并返回false。     
    • 乐成序列化后,将字符串流的内容赋值给*body,并返回true。   
       
  • UnSerialize - 反序列化函数:
           
    • 这个函数担当一个std::string范例的参数body和一个指向Json::Value的指针value。     
    • 利用Json::CharReaderBuilder创建一个Json::CharReader对象,用于从字符串中分析JSON数据。     
    • 利用parse方法实验分析body中的JSON数据,并将效果存储在value指向的对象中。     
    • 如果分析失败(parse方法返回false),则输堕落误信息并返回false。     
    • 乐身分析后,返回true。   
      
  1. class JsonUtil{
  2.                 public:
  3.                         // 序列化
  4.                         static bool Serialize(const Json::Value &value, std::string *body) {
  5.                                 Json::StreamWriterBuilder swb;
  6.                                 std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());
  7.                                 std::stringstream ss;
  8.                                 int ret = sw->write(value, &ss);
  9.                                 if (ret != 0) {
  10.                                         std::cout << "序列化失败\n";
  11.                                         return false;
  12.                                 }   
  13.                                 *body = ss.str();
  14.                                 return true;
  15.                         }
  16.                         // 反序列化
  17.                         static bool UnSerialize(const std::string &body, Json::Value *value) {
  18.                                 Json::CharReaderBuilder crb;
  19.                                 std::unique_ptr<Json::CharReader> cr(crb.newCharReader());
  20.                                 std::string err;
  21.                                 bool ret = cr->parse(body.c_str(), body.c_str() + body.size(), value, &err);
  22.                                 if (ret == false) {
  23.                                         std::cout << "反序列化失败\n";
  24.                                         return false;
  25.                                 }
  26.                                 return true;
  27.                         }
  28.         };
复制代码
3.2 服务端数据管理模块

3.2.1 视频数据表的操持

      在视频共享点播体系中,视频数据和图⽚数据都存储在⽂件中,⽽我们必要在数据库中管理⽤⼾上传 的每个视频信息。只是完成⼀个简朴的视频信息表    [code][/code]
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表