--- marp: true theme: default size: 16:9 paginate: true header: "Hightube 开源跨平台个人直播平台" footer: "Highground-Soft | 中期汇报 (v1.0.0-Beta4.7) | 2026.05.05" 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); } ---
Mid-term Progress Report
# Hightube 中期汇报 ## 成果与展望:构建私有化直播生态

已实现从推流鉴权、多码率转码多端互动观看的全链路闭环。

Highground-Soft 团队:程景愉、舒钰权、李俊友、张钊源
当前版本:v1.0.0-Beta4.7 | 项目状态:核心功能 100% 完成
--- # 目录
01
项目背景与目标
为什么做 Hightube?解决什么问题?
02
中期成果概览
五大功能域 + 研发数据统计
03
系统架构总览
整体拓扑与核心数据流
04
关键技术突破
流媒体转码、推流鉴权、弹幕系统
05
界面展示
跨平台客户端与响应式布局
06
团队协作与工程化
协作流程、成员贡献、代码规范
07
挑战、计划与演示
踩坑记录、后续规划、现场演示流程
--- # 项目背景与目标

行业痛点

Hightube 的答案

目标:打造一个开箱即用、性能优异、生态开放的私有化个人直播基座。

--- # 中期成果概览:五大功能域
01

用户系统

RBAC 权限控制
Bcrypt 密码哈希
JWT 令牌鉴权
会话管理

02

直播核心

RTMP 推拉流
FFmpeg 多码率转码
定时缩略图抓取
流状态监控

03

实时互动

WebSocket Hub
弹幕遮罩渲染
消息历史持久化
心跳断线重连

04

管理后台

系统监控指标
SSE 实时日志流
用户 CRUD 管理
直播间状态面板

05

前端客户端

Flutter 3.x 跨平台
Windows / Android / iOS / Web
多清晰度无缝切换

累计交付 23 个功能模块,覆盖从注册到直播观看的完整业务生命周期

--- # 研发数据统计

代码资产分布

模块语言源文件行数
后端业务逻辑Go121,128
流媒体服务Go6613
Flutter 跨平台Dart152,761
管理后台 WebHTML/JS5789
总计-385,291
18 Go 后端源文件
15 Dart 前端源文件
12s 缩略图抓取间隔
2 转码清晰度档位
4 RESTful API 模块
30+ Git 贡献
4 支持平台数
60fps 弹幕渲染帧率
--- # 系统架构总览

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

流媒体层

推流协议RTMP (端口 1935)
转码引擎FFmpeg 子进程管线
输出档位1080p 源码 + 720p 转码
Web 分发HTTP-FLV (flv.js 播放)
缩略图每 12s 自动截取一帧

业务层 (Go)

HTTP 框架Gin — 路由、中间件、CORS
数据库SQLite + GORM ORM 抽象
认证体系JWT 签发 + Bcrypt 哈希
实时通信Gorilla WebSocket Hub 模式
日志推送SSE 单向流至管理后台

部署方式:Go 编译为单一静态二进制,内嵌 RTMP 模块与前端静态资源,单文件、零依赖即可启动完整服务。

--- # 关键技术突破:流媒体与多端适配

1. 动态转码管线 (FFmpeg)

2. 多端播放兼容

--- # 关键技术突破:推流鉴权与弹幕系统

3. 推流鉴权机制

Bcrypt
JWT
路径级鉴权

4. 高性能弹幕引擎

WS Hub
心跳检测
60fps

管理工具:自研嵌入式 Web 控制台,通过 SSE 实时推送系统日志与运行指标,无需额外依赖。

--- # 界面展示:跨平台体验亮点

响应式网格

直播间列表采用自适应网格布局,不同屏幕尺寸自动调整列数,保持视觉一致性。

动态缩略图

后端每 12s 自动截取一帧封面,前端定时轮询,用户无需进入即可看到实时画面。

实时状态徽标

"直播中" 角标实时同步房间活跃状态,观众一目了然。

Flutter 跨平台一致性

基于 Flutter 3.x 自绘引擎,Windows / Android / iOS / Web 四端共用一套 UI 代码,平台间视觉偏差 < 5%。

播放器细节

支持横竖屏自动切换、双击暂停、进度条拖拽、亮度/音量手势调节(移动端),清晰度菜单一键切换。

--- # 团队协作与工程化实践

标准协作流程

成员与分工

程景愉后端核心开发、流媒体架构设计与 FFmpeg 转码管线
舒钰权RESTful API 开发、数据库建模、管理后台
李俊友Flutter 播放器核心、WebSocket 实时互动模块
张钊源跨平台 UI 适配、Android 端推流联调、项目文档

经过 30+ 次审查与合并,形成稳定的迭代节奏。

--- # 遇到的挑战与解决方案 | 挑战 | 问题描述 | 解决方案 | 结果 | | :--- | :--- | :--- | :---: | | **RTMP 鉴权** | 默认 RTMP 无认证,任何人可推流 | 路径解析 `stream_key` + 数据库实时验证 | ✅ | | **FFmpeg 僵尸进程** | 推流断开后子进程未回收,内存泄漏 | `context.Context` 树状管理 + `defer cancel()` | ✅ | | **Web 端无法播放** | 浏览器不支持 RTMP 直连 | 增加 HTTP-FLV 封装层,前端接入 `flv.js` | ✅ | | **弹幕拦截触控** | 弹幕层遮挡视频控制栏 | `IgnorePointer` 穿透弹幕层,保留交互 | ✅ | | **跨平台 UI 偏差** | 不同平台渲染效果不一致 | 统一 Material Design 3 规范 + 响应式断点 | ✅ | | **SSE 连接泄漏** | 管理后台长时间挂机导致连接堆积 | 引入心跳超时机制 + 客户端自动重连 | ✅ | --- # 后续计划:迈向 AI 时代
核心创新

AI VTuber 互动引擎

体验优化

国际化与鲁棒性

里程碑时间交付物
Beta 4.72026.05 ✅核心功能 100%,中期汇报
AI 模块初版2026.05 底LLM 接口联调 + TTS 集成
v2.0 正式版2026.06 初i18n、Docker、AI VTuber、单元测试
--- # 演示流程预览

演示主线(约 3 分钟)

  1. 零配置启动:一条命令启动,服务立即就绪。
  2. Flutter 端注册:创建账号,自动开通专属直播间。
  3. OBS 推流:配置 RTMP 地址 + StreamKey,开启 1080p 推流。
  4. 多端观看:PC / 手机 / 浏览器同时拉流,对比延迟。
  5. 弹幕互动:移动端发送弹幕,各端实时同步显示。
  6. 管理后台:SSE 实时日志滚动,指标面板刷新。

演示重点

---

Thank You

感谢聆听

Hightube — 私有化直播基座建设阶段性完成

欢迎老师指正,Q & A

开源地址:https://git.nudt.space/Highground-Soft/Hightube