--- marp: true theme: default size: 16:9 paginate: true header: "Hightube 开源跨平台个人直播平台最终汇报" footer: "Highground-Soft | 验收汇报 (v1.0.1-Release) | 2026.06.29" style: | :root { --ink: #0f172a; --muted: #475569; --soft: #64748b; --line: rgba(15, 23, 42, 0.10); --blue: #2563eb; --cyan: #0891b2; --gold: #d97706; --paper: #fffdf8; --paper-blue: #f4f8ff; } section { position: relative; padding: 56px 68px 48px; font-family: 'Noto Sans CJK SC', 'Microsoft YaHei', sans-serif; font-size: 28px; line-height: 1.35; color: var(--ink); background: radial-gradient(circle at top right, rgba(37, 99, 235, 0.16), transparent 28%), radial-gradient(circle at bottom left, rgba(8, 145, 178, 0.12), transparent 24%), linear-gradient(135deg, var(--paper) 0%, #f9fbff 45%, var(--paper-blue) 100%); } section::before { content: ""; position: absolute; inset: 22px; border: 1px solid var(--line); border-radius: 26px; pointer-events: none; } header, footer { color: #64748b; font-size: 13px; letter-spacing: 0.04em; } h1 { margin: 0 0 14px; font-family: 'Noto Serif CJK SC', 'STSong', serif; font-size: 52px; color: var(--ink); } h2 { margin: 0 0 14px; font-size: 30px; color: var(--blue); font-weight: 700; } h3 { margin: 0 0 8px; font-size: 22px; color: var(--ink); font-weight: 700; } p, ul, ol { margin-top: 0; } ul, ol { padding-left: 1.15em; } li { margin: 0 0 6px; } table { border-collapse: collapse; table-layout: fixed; } th, td { padding: 5px 8px; vertical-align: top; word-break: break-word; } strong { color: var(--blue); font-weight: 800; } .accent { color: var(--blue); font-weight: 800; } .gold { color: var(--gold); font-weight: 700; } section.cover { color: #e8eefc; background: linear-gradient(135deg, #07111f 0%, #0f1f3d 42%, #1d4ed8 100%); } section.cover h1, section.cover h2, section.cover strong { color: #ffffff; } section.cover .eyebrow { color: rgba(232, 238, 252, 0.78); font-size: 15px; font-weight: 700; letter-spacing: 0.16em; margin-bottom: 16px; } .grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; } .grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; } .grid-5 { display: grid; grid-template-columns: repeat(5, 1fr); gap: 12px; } .card { background: rgba(255, 255, 255, 0.72); border: 1px solid rgba(148, 163, 184, 0.18); border-radius: 20px; padding: 20px 22px; box-shadow: 0 16px 38px rgba(15, 23, 42, 0.06); } .card.dark { background: rgba(15, 23, 42, 0.05); } .metric-box { text-align: center; padding: 15px; border-radius: 15px; background: rgba(37, 99, 235, 0.05); } .metric-value { font-size: 36px; font-weight: 800; color: var(--blue); display: block; } .metric-label { font-size: 14px; color: var(--soft); } .tag { display: inline-block; padding: 4px 10px; border-radius: 8px; font-size: 14px; font-weight: 700; background: rgba(37, 99, 235, 0.1); color: var(--blue); margin-right: 5px; } .eyebrow { color: var(--soft); font-size: 15px; font-weight: 700; letter-spacing: 0.16em; margin-bottom: 8px; } .closing { display: grid; place-items: center; height: 80%; text-align: center; } .closing h1 { font-size: 72px; font-weight: 900; margin-bottom: 8px; color: var(--blue); } .toc-item { display: flex; align-items: baseline; padding: 10px 0; border-bottom: 1px solid var(--line); } .toc-num { font-size: 32px; font-weight: 900; color: var(--blue); min-width: 56px; } .toc-text { font-size: 22px; } .toc-sub { font-size: 15px; color: var(--soft); } section.compact { padding: 46px 58px 40px; font-size: 24px; line-height: 1.25; } section.compact h1 { font-size: 42px; margin-bottom: 10px; } section.compact h3 { font-size: 19px; margin-bottom: 6px; } section.compact .card { padding: 14px 16px; border-radius: 16px; } section.compact .grid-2 { gap: 14px; } section.compact .grid-3 { gap: 12px; } section.compact li { margin-bottom: 4px; } section.compact .tag { font-size: 12px; padding: 3px 8px; } section.compact p[style], section.compact ul[style], section.compact ol[style], section.compact table[style] { font-size: 14px !important; } section.toc-slide h1 { font-size: 46px; margin-bottom: 10px; } section.toc-slide .toc-item { padding: 7px 0; } section.toc-slide .toc-num { font-size: 27px; min-width: 48px; } section.toc-slide .toc-text { font-size: 19px; } section.toc-slide .toc-sub { font-size: 13px; } section.arch-slide table { font-size: 14px !important; } section.arch-slide th, section.arch-slide td { padding: 4px 6px; } section.challenge-slide table { font-size: 16px; line-height: 1.26; } section.challenge-slide th, section.challenge-slide td { padding: 7px 9px; } section.challenge-slide h1 { margin-bottom: 8px; } section.plan-slide table { font-size: 14px !important; } section.plan-slide .card ul { margin-bottom: 0; } section.showcase-slide .card h3 { color: var(--blue); } ---
Final Project Presentation
# Hightube 项目验收汇报 ## 成果与展望:构建私有化直播生态

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

Highground-Soft 团队:程景愉、舒钰权、李俊友、张钊源
当前版本:v1.0.1-Release | 项目状态:已完成公网发布与性能验证
--- # 目录
01
项目背景与最终目标
为什么做 Hightube?解决了什么问题?
02
系统架构与技术选型
Go 语言后端与 Flutter 客户端
03
后端性能优化
SQLite 调优、内存缓存与 bufio 缓冲
04
网络与公网部署
FRP 内网穿透反向隧道与 Caddy 路由
05
系统界面展示与效果
公网平台、Web 端追帧及移动客户端
06
开发规范与协作
敏捷工程化、许可证合规与分工
07
挑战与未来规划
踩坑对策、性能定量分析与下一步
--- # 项目背景与目标

行业痛点

Hightube 的答案

目标:打造一个开箱即用、极速轻量、安全可控的跨平台私有化直播基座。

--- # 系统架构总览
OBS 推流 → RTMP ServerFFmpeg 转码管线Go 业务后端Web / 移动端播放

流媒体分发层

推流监听RTMP 协议 (端口 1935)
流鉴权URL 路径 stream_key 数据库实时匹配
转码引擎FFmpeg 子进程异步管线 (原始/720p/480p)
Web 分发HTTP-FLV (低延迟 chunked 长连接)
封面捕获定时抓取脚本,每 12s 生成一张房间缩略图

应用业务层 (Go)

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

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

--- # 后端性能优化:三驾马车 为了解决直播系统高并发读写下 SQLite 数据库锁死、Socket 写入开销高的问题,设计了三大底层优化:

1. SQLite 并发调优

2. 内存线程安全缓存

3. I/O 缓冲与分组 Flush

三项调优相辅相成,使单机并发能力在轻量化环境下呈指数级提升

--- # 项目总体架构
--- # 性能测试结果

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

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

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

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

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

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

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

--- # 公网部署方案:隧道穿透与反向代理

FRP 反向隧道穿透

网络开销:隧道网络穿透增加约 20-50ms RTT 延迟,对流媒体无感知影响。

Caddy 智能路由与证书管理

--- # 界面展示:Web 端平台与播放效果

项目主页

介绍项目背景、功能与技术栈并提供二进制文件下载

网页端直播与弹幕互动

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

--- # 界面展示:管理后台与手机端

自研后端管理控制台

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

Android 手机客户端

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

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

工程化协作规范

成员分工与交付成果

成员 核心职责与主要交付成果
程景愉 项目总体管理,前后端核心基础版本设计开发,系统公网隧道穿透与Caddy反向代理分布式部署。
舒钰权 用户登录与个人设置界面开发, 基于 WebSocket 的直播聊天室与弹幕引擎开发,前端弹幕浮层与裁剪区域优化。
张钊源 后端管理面板、服务器运行状态监控(Metrics)、日志收集与历史审计功能等功能开发。
李俊友 后端核心流媒体与业务API架构设计及实现、前端音视频播放与Web适配, 项目介绍网站设计部署。
--- # 遇到的挑战与解决方案
挑战 问题描述 最终解决方案 结果
推流安全 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 证书自动化路由
--- # 总结与展望

项目总结

未来展望

--- # 演示流程预览

演示主线 (约 3 分钟)

  1. 零配置一键启动:命令行执行 `go run main.go`,服务瞬间部署完毕。
  2. 客户端注册登录:在手机/网页端注册,后台自动创建并开通专属直播间。
  3. OBS 推流开播:拷贝专属 Stream Key,OBS 一键向公网启动直播推送。
  4. 多端拉流对比:使用手机 App、VLC、网页浏览器同时拉流,展示追帧算法下的同步延迟。
  5. 弹幕实时发送:观众互动发言,弹幕在各端屏幕上半区平滑滑过。
  6. 管理面板展示:打开后台监控,查看实时流量负载与 SSE 系统日志滚动。

核心演示亮点

---

Thank You

感谢聆听

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

欢迎老师指正,Q & A

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

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

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