diff --git a/presentation.md b/presentation.md index 5e947d4..4616966 100644 --- a/presentation.md +++ b/presentation.md @@ -4,7 +4,7 @@ theme: default size: 16:9 paginate: true header: "Hightube 开源跨平台个人直播平台最终汇报" -footer: "Highground-Soft | 最终汇报 (v1.0.0-Release) | 2026.06.27" +footer: "Highground-Soft | 验收汇报 (v1.0.1-Release) | 2026.06.29" style: | :root { --ink: #0f172a; @@ -129,14 +129,14 @@ style: |
Final Project Presentation
-# Hightube 最终汇报 +# Hightube 项目验收汇报 ## 成果与展望:构建私有化直播生态

已实现从高并发流引擎、后端性能优化多端自适应拉流与公网部署的完整闭环。

Highground-Soft 团队:程景愉、舒钰权、李俊友、张钊源
- 当前版本:v1.0.0-Release | 项目状态:已完成公网发布与性能验证 + 当前版本:v1.0.1-Release | 项目状态:已完成公网发布与性能验证
--- @@ -233,19 +233,26 @@ style: | --- + + + # 系统架构总览 -
-

- OBS / 移动端推流 → RTMP ServerFFmpeg 转码管线Go 业务后端Flutter / Web 播放端 -

+
+ OBS 推流 → RTMP ServerFFmpeg 转码管线Go 业务后端Web / 移动端播放
-

流媒体分发层

- - +

流媒体分发层

+
推流监听RTMP 协议 (端口 1935)
+ @@ -253,9 +260,9 @@ style: |
推流监听RTMP 协议 (端口 1935)
流鉴权URL 路径 stream_key 数据库实时匹配
转码引擎FFmpeg 子进程异步管线 (原始/720p/480p)
Web 分发HTTP-FLV (低延迟 chunked 长连接)
-

应用业务层 (Go)

- - +

应用业务层 (Go)

+
Web 框架Gin — 路由控制、CORS 过滤、健康监测
+ @@ -264,13 +271,13 @@ style: | -

部署核心:客户端(Flutter)与服务端(Go)完全分离,结合 Docker 容器化一键部署。

+

部署核心:客户端(Flutter)与服务端(Go)完全分离,结合 Docker 容器化一键部署。

--- -# 后端性能优化:三驾马车 (重点) +# 后端性能优化:三驾马车 为了解决直播系统高并发读写下 SQLite 数据库锁死、Socket 写入开销高的问题,设计了三大底层优化: @@ -306,31 +313,46 @@ style: | --- + -# 后端性能优化:定量测试成果 (重点) - -通过并发压测与物理测量,后端调优取得了极其显著的性能定量数据: +

通过并发压测与物理测量,后端调优取得了极其显著的性能定量数据:

-
-

SQLite 并发写吞吐量对比 (TPS)

-
Web 框架Gin — 路由控制、CORS 过滤、健康监测
ORM / 数据库GORM + SQLite (嵌入式轻量级持久化)
安全体系JWT 访问令牌 + Bcrypt 密码单向哈希
互动接口Gorilla WebSocket Hub 模式弹幕服务器
+
+

SQLite 并发写吞吐量对比 (TPS)

+
+ + + + + + - +
并发客户端数普通模式WAL 调优模式提升幅度
1 客户端85 tps125 tps+ 47.1%
5 并发18 tps240 tps+ 1,233.3%
10 并发9 tps (大量超时)380 tps+ 4,122.2%
10 并发9 tps (超时)380 tps+ 4,122.2%
-

* WAL 配合同步 NORMAL 与内存 temp_store,彻底消除了写锁定错误。

+

* WAL 配合同步 NORMAL 与内存 temp_store,彻底消除锁表冲突。

- -
-

流媒体播放延迟定量测试 (Latency)

- + +
+

流媒体播放延迟定量测试 (Latency)

+
+ + + + + + - - - - + + + +
测试链路追帧关闭追帧开启分析结论
同网直连 RTMP800 ms800 ms局域网直连物理延迟极低
公网 FRP RTMP1250 ms1250 ms穿透引入约 450ms 网络延迟
Web HTTP-FLV2600 ms1650 ms追帧开启后降低 1 秒延迟
网络抖动积压6200 ms1700 ms15秒内快速收敛至正常水平
同网直连 RTMP800 ms800 ms局域网物理延迟极低
公网 FRP RTMP1250 ms1250 ms中转引入约 450ms 开销
Web HTTP-FLV2600 ms1650 ms算法介入后降低约 1 秒
网络抖动积压6200 ms1700 ms15秒内快速平滑收敛
@@ -338,18 +360,22 @@ style: | --- + -# 公网部署方案:网络拓扑结构 (重点) +# 公网部署方案:网络拓扑结构 -
- +
+
-

利用 FRP 内网穿透Caddy 反向代理,实现零公网 IP 本地服务器的公网安全暴露。

+

利用 FRP 内网穿透Caddy 反向代理,实现零公网 IP 本地服务器的公网安全暴露。

--- -# 公网部署方案:隧道穿透与反向代理 (重点) +# 公网部署方案:隧道穿透与反向代理
@@ -381,61 +407,31 @@ style: | --- -# 关键技术突破:Web 端播放器适配 - -
-
-

1. 平台视图 iframe 混合渲染

-
    -
  • 在 Flutter Web 侧通过 HtmlElementView 动态注册 iframe 播放页面 flv_player.html
  • -
  • flv.min.js 本地化部署到项目内,摆脱对外部 CDN 网络连通性的依赖。
  • -
  • 采用 HTML5 postMessage 通道,实现 Flutter 主框架到 iframe 播放页面的跨域音量/状态控制。
  • -
-
-
-

2. 前端自适应速率追帧算法

-
    -
  • 通过监听 HTML5 video 元素的 timeupdate 事件,实时计算当前缓冲区延迟。
  • -
  • 延迟 > 5 秒:强制跳帧到 video.currentTime = end - 1.0
  • -
  • 延迟 1.5 ~ 5 秒:触发 1.15 倍播放速率微调追帧,实测在 15 秒内即可无感知地将累积延迟收敛到正常线,保证用户体验。
  • -
-
-
- ---- - -# 界面展示 + + + +# 界面展示:Web 端平台与播放效果
+
- - 图1:Web 浏览器平台主页(活跃房间列表) +

Web 平台主页

+

展示活跃直播间列表与 12s 定期封面图轮询

+
- - 图2:OBS 直播推送与 Web 端低延迟拉流及实时弹幕互动 -
-
-
- ---- - -# 界面展示 (客户端) - -
-
-
- - 图3:自研后端管理控制台及系统健康指标 -
-
-
-
- - 图4:Android 手机客户端直播与聊天室界面 +

网页端直播与弹幕互动

+

flv.js 自适应追帧播放与 WebSocket 弹幕互动

@@ -443,26 +439,86 @@ style: | --- + + +# 界面展示:管理后台与手机端 + +
+
+ +
+

自研后端管理控制台

+

实时监控系统健康指标、当前并发数与 SSE 异步日志流

+
+
+
+ +
+

Android 手机客户端

+

Flutter 自绘引擎渲染与低延迟硬解拉流

+
+
+
+ +--- + + + # 开发规范与团队协作

工程化协作规范

-
    -
  • 契约先行:前后端联调前先规定好 RESTful JSON 接口及 API Schema,降低联调摩擦。
  • -
  • Git 分支工作流:采用功能分支开发,代码合并需通过 Merge Request 与同行评审(Code Review),保证 main 分支稳定可用。
  • -
  • 自动规范化格式:Go 后端强制开启 gofmt;Flutter 引入 analysis_options.yaml 开启严苛的静态类型检查与垃圾变量扫描。
  • +
      +
    • 契约先行:前后端联调前先落定 RESTful JSON 接口,极大降低双方联调摩擦。
    • +
    • Git 分支工作流:采用特性分支开发,合并须经过 MR 与 Code Review,保持主分支始终可用。
    • +
    • 格式与静态规范:后端强制执行 gofmt 格式化;前端配置严格 analysis_options.yaml 检查。
-

成员分工表

- - - - - - +

成员分工与交付成果

+
成员职责与主要交付成果
程景愉后端框架搭建、流媒体解封装、FFmpeg 实时转码通道
舒钰权RESTful 业务逻辑编写、JWT Token 中间件与用户系统
李俊友Flutter 原生播放器对接、WebSocket 实时聊天室、弹幕渲染
张钊源\n(本人)流媒体底座与推流鉴权、Web 端嵌入式 flv.js 播放器与自适应追帧、公网 FRP + Caddy 反向隧道部署
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
成员核心职责与主要交付成果
程景愉
(本人)
项目总体管理,前后端核心基础版本设计开发,系统公网隧道穿透与Caddy反向代理分布式部署。
舒钰权用户登录与个人设置界面开发, 基于 WebSocket 的直播聊天室与弹幕引擎开发,前端弹幕浮层与裁剪区域优化。
张钊源后端管理面板、服务器运行状态监控(Metrics)、日志收集与历史审计功能等功能开发。
李俊友后端核心流媒体与业务API架构设计及实现、前端音视频播放与Web适配, 项目介绍网站设计部署。
@@ -470,17 +526,68 @@ style: | --- + -# 遇到的挑战与解决方案 (最终版) +# 遇到的挑战与解决方案 -| 挑战 | 问题描述 | 最终解决方案 | 结果 | -| :--- | :--- | :--- | :---: | -| **推流安全** | RTMP 默认无校验,极易被恶意盗播 | 路径剥离 `stream_key` 并引入数据库实时鉴权拦截 | ✅ | -| **僵尸转码进程** | 直播中断后后台 FFmpeg 挂载无法回收 | 树状 `context.Context` 传导 + 资源 `defer cancel()` | ✅ | -| **Web 直连失败** | 浏览器沙箱环境不支持 RTMP 协议 | 引入 HTTP-FLV 分块传输流,Web 侧调用 `flv.js` 解码 | ✅ | -| **缓存延迟累积** | 浏览器播放器积压缓冲,延迟越来越高 | 编写基于 `timeupdate` 的 1.15x 倍速追帧及强跳帧算法 | ✅ | -| **轻量数据库锁死** | 大量弹幕持久化写入引发 SQLite 独占锁 | 开启 `WAL` 日志模式,调优 synchronous、temp_store | ✅ | -| **公网资源发布** | 本地测试机处于内网且无公网 IP | 建立 **FRP** 穿透,配合公网 **Caddy** 证书自动化路由 | ✅ | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
挑战问题描述最终解决方案结果
推流安全RTMP 默认无校验,极易被恶意盗播路径剥离 stream_key 并引入数据库实时鉴权拦截
僵尸转码进程直播中断后后台 FFmpeg 挂载无法回收树状 context.Context 传导 + 资源 defer cancel()
Web 直连失败浏览器沙箱环境不支持 RTMP 协议引入 HTTP-FLV 分块传输流,Web 侧调用 flv.js 解码
缓存延迟累积浏览器播放器积压缓冲,延迟越来越高编写基于 timeupdate 的 1.15x 倍速追帧及强跳帧算法
轻量数据库锁死大量弹幕持久化写入引发 SQLite 独占锁开启 WAL 日志模式,调优 synchronous、temp_store
公网资源发布本地测试机处于内网且无公网 IP建立 FRP 穿透,配合公网 Caddy 证书自动化路由
--- @@ -509,7 +616,7 @@ style: | -# 演示流程预览 (最终汇报) +# 演示流程预览
@@ -542,7 +649,8 @@ style: |

感谢聆听

Hightube — 开源跨平台个人直播系统项目最终汇报

欢迎老师指正,Q & A

+

项目介绍地址:https://hightube.nudt.space

公网体验地址:https://stream.nudt.space

-

开源地址:https://github.com/Highground-Soft/Hightube

+

开源仓库地址:https://github.com/Highground-Soft/Hightube

diff --git a/presentation.pdf b/presentation.pdf new file mode 100644 index 0000000..940ddcf Binary files /dev/null and b/presentation.pdf differ diff --git a/presentation.pptx b/presentation.pptx index 002d589..10d7204 100644 Binary files a/presentation.pptx and b/presentation.pptx differ