Tio Boot DocsTio Boot Docs
Home
  • java-db
  • api-table
  • Enjoy
  • Tio Boot Admin
  • ai_agent
  • translator
  • knowlege_base
  • ai-search
  • 案例
Abount
  • Github
  • Gitee
Home
  • java-db
  • api-table
  • Enjoy
  • Tio Boot Admin
  • ai_agent
  • translator
  • knowlege_base
  • ai-search
  • 案例
Abount
  • Github
  • Gitee
  • 01_tio-boot 简介

    • tio-boot:新一代高性能 Java Web 开发框架
    • tio-boot 入门示例
    • Tio-Boot 配置 : 现代化的配置方案
    • tio-boot 整合 Logback
    • tio-boot 整合 hotswap-classloader 实现热加载
    • 自行编译 tio-boot
    • 最新版本
    • 开发规范
  • 02_部署

    • 使用 Maven Profile 实现分环境打包 tio-boot 项目
    • Maven 项目配置详解:依赖与 Profiles 配置
    • tio-boot 打包成 FastJar
    • 使用 GraalVM 构建 tio-boot Native 程序
    • 使用 Docker 部署 tio-boot
    • 部署到 Fly.io
    • 部署到 AWS Lambda
    • 到阿里云云函数
    • 使用 Deploy 工具部署
    • 胖包与瘦包的打包与部署
    • 使用 Jenkins 部署 Tio-Boot 项目
    • 使用 Nginx 反向代理 Tio-Boot
    • 使用 Supervisor 管理 Java 应用
  • 03_配置

    • 配置参数
    • 服务器监听器
    • 内置缓存系统 AbsCache
    • 使用 Redis 作为内部 Cache
    • 静态文件处理器
    • 基于域名的静态资源隔离
    • DecodeExceptionHandler
  • 04_原理

    • 生命周期
    • 请求处理流程
    • 重要的类
  • 05_json

    • Json
    • 接受 JSON 和响应 JSON
    • 响应实体类
  • 06_web

    • 概述
    • 文件上传
    • 接收请求参数
    • 接收日期参数
    • 接收数组参数
    • 返回字符串
    • 返回文本数据
    • 返回网页
    • 请求和响应字节
    • 文件下载
    • 返回视频文件并支持断点续传
    • http Session
    • Cookie
    • HttpRequest
    • HttpResponse
    • Resps
    • RespBodyVo
    • /zh/06_web/19.html
    • 全局异常处理器
    • 异步
    • 动态 返回 CSS 实现
    • 返回图片
    • Transfer-Encoding: chunked 实时音频播放
    • Server-Sent Events (SSE)
    • 接口访问统计
    • 接口请求和响应数据记录
    • 自定义 Handler 转发请求
    • 使用 HttpForwardHandler 转发所有请求
    • 跨域
    • 添加 Controller
    • 常用工具类
    • HTTP Basic 认证
    • WebJars
    • JProtobuf
  • 07_validate

    • 数据紧校验规范
    • 参数校验
  • 08_websocket

    • 使用 tio-boot 搭建 WebSocket 服务
    • WebSocket 聊天室项目示例
  • 09_java-db

    • java‑db
    • 操作数据库入门示例
    • SQL 模板
    • 数据源配置与使用
    • ActiveRecord
    • Model
    • 生成器与 Model
    • Db 工具类
    • 批量操作
    • 数据库事务处理
    • Cache 缓存
    • Dialect 多数据库支持
    • 表关联操作
    • 复合主键
    • Oracle 支持
    • Enjoy SQL 模板
    • Java-DB 整合 Enjoy 模板最佳实践
    • 多数据源支持
    • 独立使用 ActiveRecord
    • 调用存储过程
    • java-db 整合 Guava 的 Striped 锁优化
    • 生成 SQL
    • 通过实体类操作数据库
    • java-db 读写分离
    • Spring Boot 整合 Java-DB
    • like 查询
    • 常用操作示例
    • Druid 监控集成指南
    • SQL 统计
  • 10_api-table

    • ApiTable 概述
    • 使用 ApiTable 连接 SQLite
    • 使用 ApiTable 连接 Mysql
    • 使用 ApiTable 连接 Postgres
    • 使用 ApiTable 连接 TDEngine
    • 使用 api-table 连接 oracle
    • 使用 api-table 连接 mysql and tdengine 多数据源
    • EasyExcel 导出
    • EasyExcel 导入
    • TQL(Table SQL)前端输入规范
    • ApiTable 实现增删改查
    • 数组类型
    • 单独使用 ApiTable
  • 11_aop

    • JFinal-aop
    • Aop 工具类
    • 配置
    • 配置
    • 独立使用 JFinal Aop
    • @AImport
    • 原理解析
  • 12_cache

    • Caffine
    • Jedis-redis
    • hutool RedisDS
    • Redisson
    • Caffeine and redis
    • CacheUtils 工具类
    • 使用 CacheUtils 整合 caffeine 和 redis 实现的两级缓存
    • 使用 java-db 整合 ehcache
    • 使用 java-db 整合 redis
    • Java DB Redis 相关 Api
    • redis 使用示例
  • 13_认证和权限

    • hutool-JWT
    • FixedTokenInterceptor
    • 使用内置 TokenManager 实现登录
    • 用户系统
    • 重置密码
    • 匿名登录
    • Google 登录
    • 权限校验注解
    • Sa-Token
    • sa-token 登录注册
    • StpUtil.isLogin() 源码解析
    • 短信登录
    • 移动端微信登录实现指南
    • 移动端重置密码
  • 14_i18n

    • i18n
  • 15_enjoy

    • tio-boot 整合 Enjoy 模版引擎文档
    • 引擎配置
    • 表达式
    • 指令
    • 注释
    • 原样输出
    • Shared Method 扩展
    • Shared Object 扩展
    • Extension Method 扩展
    • Spring boot 整合
    • 独立使用 Enjoy
    • tio-boot enjoy 自定义指令 localeDate
    • PromptEngine
    • Enjoy 入门示例-擎渲染大模型请求体
    • Enjoy 使用示例
  • 16_定时任务

    • Quartz 定时任务集成指南
    • 分布式定时任务 xxl-jb
    • cron4j 使用指南
  • 17_tests

    • TioBootTest 类
  • 18_tio

    • TioBootServer
    • tio-core
    • 内置 TCP 处理器
    • 独立启动 UDPServer
    • 使用内置 UDPServer
    • t-io 消息处理流程
    • tio-运行原理详解
    • TioConfig
    • ChannelContext
    • Tio 工具类
    • 业务数据绑定
    • 业务数据解绑
    • 发送数据
    • 关闭连接
    • Packet
    • 监控: 心跳
    • 监控: 客户端的流量数据
    • 监控: 单条 TCP 连接的流量数据
    • 监控: 端口的流量数据
    • 单条通道统计: ChannelStat
    • 所有通道统计: GroupStat
    • 资源共享
    • 成员排序
    • ssl
    • DecodeRunnable
    • 使用 AsynchronousSocketChannel 响应数据
    • 拉黑 IP
    • 深入解析 Tio 源码:构建高性能 Java 网络应用
  • 19_aio

    • ByteBuffer
    • AIO HTTP 服务器
    • 自定义和线程池和池化 ByteBuffer
    • AioHttpServer 应用示例 IP 属地查询
    • 手写 AIO Http 服务器
  • 20_netty

    • Netty TCP Server
    • Netty Web Socket Server
    • 使用 protoc 生成 Java 包文件
    • Netty WebSocket Server 二进制数据传输
    • Netty 组件详解
  • 21_netty-boot

    • Netty-Boot
    • 原理解析
    • 整合 Hot Reload
    • 整合 数据库
    • 整合 Redis
    • 整合 Elasticsearch
    • 整合 Dubbo
    • Listener
    • 文件上传
    • 拦截器
    • Spring Boot 整合 Netty-Boot
    • SSL 配置指南
    • ChannelInitializer
    • Reserve
  • 22_MQ

    • Mica-mqtt
    • EMQX
    • Disruptor
  • 23_tio-utils

    • tio-utils
    • HttpUtils
    • Notification
    • 邮箱
    • JSON
    • 读取文件
    • Base64
    • 上传和下载
    • Http
    • Telegram
    • RsaUtils
    • EnvUtils 使用文档
    • 系统监控
    • 毫秒并发 ID (MCID) 生成方案
  • 24_tio-http-server

    • 使用 Tio-Http-Server 搭建简单的 HTTP 服务
    • tio-boot 添加 HttpRequestHandler
    • 在 Android 上使用 tio-boot 运行 HTTP 服务
    • tio-http-server-native
    • handler 常用操作
  • 25_tio-websocket

    • WebSocket 服务器
    • WebSocket Client
  • 26_tio-im

    • 通讯协议文档
    • ChatPacket.proto 文档
    • java protobuf
    • 数据表设计
    • 创建工程
    • 登录
    • 历史消息
    • 发消息
  • 27_mybatis

    • Tio-Boot 整合 MyBatis
    • 使用配置类方式整合 MyBatis
    • 整合数据源
    • 使用 mybatis-plus 整合 tdengine
    • 整合 mybatis-plus
  • 28_mongodb

    • tio-boot 使用 mongo-java-driver 操作 mongodb
  • 29_elastic-search

    • Elasticsearch
    • JavaDB 整合 ElasticSearch
    • Elastic 工具类使用指南
    • Elastic-search 注意事项
    • ES 课程示例文档
  • 30_magic-script

    • tio-boot 整合 magic-script
  • 31_groovy

    • tio-boot 整合 Groovy
  • 32_firebase

    • 整合 google firebase
    • Firebase Storage
    • Firebase Authentication
    • 使用 Firebase Admin SDK 进行匿名用户管理与自定义状态标记
    • 导出用户
    • 注册回调
    • 登录注册
  • 33_文件存储

    • 文件上传数据表
    • 本地存储
    • 使用 AWS S3 存储文件并整合到 Tio-Boot 项目中
    • 存储文件到 腾讯 COS
  • 34_spider

    • jsoup
    • 爬取 z-lib.io 数据
    • 整合 WebMagic
    • WebMagic 示例:爬取学校课程数据
    • Playwright
    • Flexmark (Markdown 处理器)
    • tio-boot 整合 Playwright
    • 缓存网页数据
  • 36_integration_thirty_party

    • tio-boot 整合 okhttp
    • 整合 GrpahQL
    • 集成 Mailjet
    • 整合 ip2region
    • 整合 GeoLite 离线库
    • 整合 Lark 机器人指南
    • 集成 Lark Mail 实现邮件发送
    • Thymeleaf
    • Swagger
    • Clerk 验证
  • 37_dubbo

    • 概述
    • dubbo 2.6.0
    • dubbo 2.6.0 调用过程
    • dubbo 3.2.0
  • 38_spring

    • Spring Boot Web 整合 Tio Boot
    • spring-boot-starter-webflux 整合 tio-boot
    • Tio Boot 整合 Spring Boot Starter
    • Tio Boot 整合 Spring Boot Starter Data Redis 指南
  • 39_spring-cloud

    • tio-boot spring-cloud
  • 40_mysql

    • 使用 Docker 运行 MySQL
    • /zh/42_mysql/02.html
  • 41_postgresql

    • PostgreSQL 安装
    • PostgreSQL 主键自增
    • PostgreSQL 日期类型
    • Postgresql 金融类型
    • PostgreSQL 数组类型
    • PostgreSQL 全文检索
    • PostgreSQL 查询优化
    • 获取字段类型
    • PostgreSQL 向量
    • PostgreSQL 优化向量查询
    • PostgreSQL 其他
  • 43_oceanbase

    • 快速体验 OceanBase 社区版
    • 快速上手 OceanBase 数据库单机部署与管理
    • 诊断集群性能
    • 优化 SQL 性能指南
    • /zh/43_oceanbase/05.html
  • 50_media

    • JAVE 提取视频中的声音
    • Jave 提取视频中的图片
    • /zh/50_media/03.html
  • 51_asr

    • Whisper-JNI
  • 54_native-media

    • java-native-media
    • JNI 入门示例
    • mp3 拆分
    • mp4 转 mp3
    • 使用 libmp3lame 实现高质量 MP3 编码
    • Linux 编译
    • macOS 编译
    • 从 JAR 包中加载本地库文件
    • 支持的音频和视频格式
    • 任意格式转为 mp3
    • 通用格式转换
    • 通用格式拆分
    • 视频合并
    • VideoToHLS
    • split_video_to_hls 支持其他语言
    • 持久化 HLS 会话
  • 55_telegram4j

    • 数据库设计
    • /zh/55_telegram4j/02.html
    • 基于 MTProto 协议开发 Telegram 翻译机器人
    • 过滤旧消息
    • 保存机器人消息
    • 定时推送
    • 增加命令菜单
    • 使用 telegram-Client
    • 使用自定义 StoreLayout
    • 延迟测试
    • Reactor 错误处理
    • Telegram4J 常见错误处理指南
  • 56_telegram-bots

    • TelegramBots 入门指南
    • 使用工具库 telegram-bot-base 开发翻译机器人
  • 60_LLM

    • 简介
    • AI 问答
    • /zh/60_LLM/03.html
    • /zh/60_LLM/04.html
    • 增强检索(RAG)
    • 结构化数据检索
    • 搜索+AI
    • 集成第三方 API
    • 后置处理
    • 推荐问题生成
    • 连接代码执行器
    • 避免 GPT 混乱
    • /zh/60_LLM/13.html
  • 61_ai_agent

    • 数据库设计
    • 示例问题管理
    • 会话管理
    • 历史记录
    • 对接 Perplexity API
    • 意图识别与生成提示词
    • 智能问答模块设计与实现
    • 文件上传与解析文档
    • 翻译
    • 名人搜索功能实现
    • Ai studio gemini youbue 问答使用说明
    • 自建 YouTube 字幕问答系统
    • 自建 获取 youtube 字幕服务
    • 通用搜索
    • /zh/61_ai_agent/15.html
    • 16
    • 17
    • 18
    • 在 tio-boot 应用中整合 ai-agent
    • 16
  • 62_translator

    • 简介
  • 63_knowlege_base

    • 数据库设计
    • 用户登录实现
    • 模型管理
    • 知识库管理
    • 文档拆分
    • 片段向量
    • 命中测试
    • 文档管理
    • 片段管理
    • 问题管理
    • 应用管理
    • 向量检索
    • 推理问答
    • 问答模块
    • 统计分析
    • 用户管理
    • api 管理
    • 存储文件到 S3
    • 文档解析优化
    • 片段汇总
    • 段落分块与检索
    • 多文档解析
    • 对话日志
    • 检索性能优化
    • Milvus
    • 文档解析方案和费用对比
    • 离线运行向量模型
  • 64_ai-search

    • ai-search 项目简介
    • ai-search 数据库文档
    • ai-search SearxNG 搜索引擎
    • ai-search Jina Reader API
    • ai-search Jina Search API
    • ai-search 搜索、重排与读取内容
    • ai-search PDF 文件处理
    • ai-search 推理问答
    • Google Custom Search JSON API
    • ai-search 意图识别
    • ai-search 问题重写
    • ai-search 系统 API 接口 WebSocket 版本
    • ai-search 搜索代码实现 WebSocket 版本
    • ai-search 生成建议问
    • ai-search 生成问题标题
    • ai-search 历史记录
    • Discover API
    • 翻译
    • Tavily Search API 文档
    • 对接 Tavily Search
    • 火山引擎 DeepSeek
    • 对接 火山引擎 DeepSeek
    • ai-search 搜索代码实现 SSE 版本
    • jar 包部署
    • Docker 部署
    • 爬取一个静态网站的所有数据
    • 网页数据预处理
    • 网页数据检索与问答流程整合
  • 65_java-linux

    • Java 执行 python 代码
    • 通过大模型执行 Python 代码
    • MCP 协议
    • Cline 提示词
    • Cline 提示词-中文版本
  • 66_manim

    • 简介
    • Manim 开发环境搭建
    • 生成场景提示词
    • 生成代码
    • 完整脚本示例
    • 语音合成系统
    • Fish.audio TTS 接口说明文档与 Java 客户端封装
    • 整合 fishaudio 到 java-uni-ai-server 项目
    • 执行 Python (Manim) 代码
    • 使用 SSE 流式传输生成进度的实现文档
    • 整合全流程完整文档
    • HLS 动态推流技术文档
    • manim 分场景生成代码
    • 分场景运行代码及流式播放支持
    • 分场景业务端完整实现流程
    • Maiim布局管理器
    • 仅仅生成场景代码
    • 使用 modal 运行 manim 代码
    • Python 使用 Modal GPU 加速渲染
    • Modal 平台 GPU 环境下运行 Manim
    • Modal Manim OpenGL 安装与使用
    • 优化 GPU 加速
    • 生成视频封面流程
    • Java 调用 manim 命令 执行代码 生成封面
    • Manim 图像生成服务客户端文档
    • manim render help
    • 显示 中文公式
    • manimgl
    • EGL
    • /zh/66_manim/30.html
    • /zh/66_manim/31.html
    • 成本核算
    • /zh/66_manim/33.html
  • 70_tio-boot-admin

    • 入门指南
    • 初始化数据
    • token 存储
    • 与前端集成
    • 文件上传
    • 网络请求
    • 图片管理
    • /zh/70_tio-boot-admin/08.html
    • Word 管理
    • PDF 管理
    • 文章管理
    • 富文本编辑器
  • 71_tio-boot

    • /zh/71_tio-boot/01.html
    • Swagger 整合到 Tio-Boot 中的指南
    • HTTP/1.1 Pipelining 性能测试报告
  • 80_性能测试

    • 压力测试 - tio-http-serer
    • 压力测试 - tio-boot
    • 压力测试 - tio-boot-native
    • 压力测试 - netty-boot
    • 性能测试对比
    • TechEmpower FrameworkBenchmarks
    • 压力测试 - tio-boot 12 C 32G
  • 99_案例

    • 封装 IP 查询服务
    • tio-boot 案例 - 全局异常捕获与企业微信群通知
    • tio-boot 案例 - 文件上传和下载
    • tio-boot 案例 - 整合 ant design pro 增删改查
    • tio-boot 案例 - 流失响应
    • tio-boot 案例 - 增强检索
    • tio-boot 案例 - 整合 function call
    • tio-boot 案例 - 定时任务 监控 PostgreSQL、Redis 和 Elasticsearch
    • Tio-Boot 案例:使用 SQLite 整合到登录注册系统
    • tio-boot 案例 - 执行 shell 命令

HLS 动态推流技术文档

  • 1. 概述
  • 2. 系统架构
  • 3. 客户端交互流程
    • 3.1 接口调用顺序与整体流程
  • 4. 服务端接口设计与参数
    • 4.1 开始接口 /hls/start
    • 4.2 上传接口 /hls/upload
    • 4.3 获取播放列表接口 /stream
    • 4.4 查询处理状态接口 /status
    • 4.5 结束接口 /finish
    • 4.6 上传接口 /hls/upload/video
    • 4.2 上传接口 /hls/upload/audio
  • 5. 服务端内部逻辑
    • 5.1 文件接收与归档
    • 5.2 转换与分段处理
    • 5.3 播放列表动态更新
    • 5.4 与 native‑media 集成
    • 5.5 异常处理与日志记录
  • 6. native‑media 项目说明
    • 6.1 项目概述
    • 6.2 API 调用示例
  • 7. 总结与扩展
    • 播放结束判定说明
    • 未来扩展
  • C 端代码实现

本系统旨在实现客户端上传由 Manim 生成的多个 MP4 场景文件,服务端利用内部的 native‑media 项目(替代 ffmpeg)对这些文件进行转换、分段处理,并动态更新 HLS 播放列表(m3u8 文件)。客户端只需获取持续更新的 m3u8 地址,即可实现无缝、低延迟播放整个场景视频流。


1. 概述

系统核心模块包括:

  • 客户端上传模块:负责将带有唯一编号的 MP4 文件上传到服务器;
  • 服务端处理模块:利用 native‑media 替代 ffmpeg 对 MP4 文件进行转换和分段处理,并管理播放列表;
  • 动态播放列表模块:实时维护 m3u8 文件(包括 EXT‑X‑MEDIA‑SEQUENCE、EXTINF、EXT‑X‑TARGETDURATION 等标签),对外提供可播放的 HLS 流。

此外,为保证整个视频流的完整性,还设计了开始和结束接口,确保在会话初始化、文件上传、播放及结束过程中接口调用顺序严格且编号明确。


2. 系统架构

整体架构示意如下:

        ┌────────────┐
        │  客户端    │
        │(上传、播放HLS)│
        └─────┬──────┘
              │ HTTP
        ┌─────▼──────┐
        │ Java服务端 │
        │ ───────── │
        │ • 文件接收   │
        │ • 转换调度   │
        │ • 播放列表管理│
        │ • API接口   │
        └─────┬──────┘
              │ 内部调用native‑media API
        ┌─────▼──────┐
        │ native‑media │
        │ (音视频处理库)│
        └────────────┘

3. 客户端交互流程

3.1 接口调用顺序与整体流程

  1. 会话初始化(开始接口 /hls/start)
    客户端在上传第一个场景文件前,调用 /start 接口通知服务器创建新会话,并返回对应的播放列表 URL。

  2. 上传 MP4 场景文件(上传接口 /hls/upload)
    客户端依次将由 Manim 生成的每个场景的 MP4 文件上传至服务器,上传时需附带唯一会话编号(session_id)和(可选)场景序号。

  3. 获取播放地址(查询接口 /hls/stream)
    在上传第一个场景文件后,客户端调用 /stream 接口获取最新的 m3u8 播放列表地址,播放器开始拉取并定时刷新列表。

  4. 实时更新播放列表
    服务端在每次完成转换和分段后,将生成的 TS 分段信息追加到内存中的播放列表,并写入磁盘供 HTTP 服务器访问。客户端播放器通过刷新 m3u8 文件获取新内容,实现无缝播放。

  5. 会话结束(结束接口 /hls/finish)
    当所有场景文件上传并处理完毕后,客户端调用 /finish 接口通知服务器结束会话。服务器在最后一次更新播放列表时追加 EXT‑X‑ENDLIST 标签,标识播放流已结束。

  6. 上传 MP4(/hls/upload/video)
    客户端依次将由 Manim 生成的每个片段的 MP4 文件上传至服务器,上传时需附带唯一会话编号(session_id)和序号。注意,片段需要需要时有序的

  7. 上传 MP3(/hls/upload/audio)
    客户端依次将由 Manim 生成的每个片段的 MP3 文件上传至服务器,上传时需附带唯一会话编号(session_id)和序号。注意,片段需要需要时有序的


4. 服务端接口设计与参数

服务端采用 RESTful API 设计,以下为主要接口及其参数示例:

4.1 开始接口 /hls/start

  • 接口目的

    • 会话初始化:客户端在上传第一个场景前调用该接口,提交唯一的 session_id,雪花格式,服务器据此创建新的播放会话,包括初始化一个空的播放列表文件。
    • 返回播放地址:返回对应的 HLS 播放列表 URL。
  • 接口 URL

    POST /hls/start
    
  • 请求参数

    • session_id(必填):字符串,客户端生成的唯一标识.雪花 id 格式
    • timestamp(可选):UTC 毫秒时间戳(System.currentTimeMillis())。

    请求示例(JSON 格式):

    {
      "session_id": "1743829002012",
      "timestamp": "1743829002012"
    }
    
  • 返回值

    {
      "data": {
        "stream_url": "/hls/498090097324138496/playlist.m3u8"
      },
      "msg": null,
      "ok": true,
      "error": null,
      "code": 1
    }
    
  • 服务端内部逻辑

    • 根据 session_id 在预定义目录下创建会话文件夹(例如 ./data/hls/{session_id}/)。
    • 初始化新的 m3u8 播放列表,写入必要的 HLS 头信息(如 EXT‑X-VERSION、EXT‑X-TARGETDURATION、初始 EXT‑X‑MEDIA‑SEQUENCE 设为 0)。
    • 记录会话状态,后续用于管理上传的场景、转换任务和播放列表更新。

4.2 上传接口 /hls/upload

  • 接口 URL scene_index

    POST /hls/upload
    
  • 请求参数

    • session_id(必填):客户端生成的唯一编号,用于标识会话/流。
    • scene_index(可选):当前场景的序号,便于服务器按顺序处理(若不传,服务器可根据上传时间排序)。
    • 文件数据:Content-Type 为 multipart/form-data,包含 MP4 文件。

    请求示例:

    POST /upload?session_id={uniqueId}
    Content-Type: multipart/form-data
    Body: [场景文件]
    
  • 返回值

    {
      "data": {
        "session_id": "",
        "scene_index": 1
      },
      "msg": null,
      "ok": true,
      "error": null,
      "code": 1
    }
    

4.3 获取播放列表接口 /stream

  • 接口 URL

    GET /hls/stream
    
  • 请求参数

    • session_id(必填):对应的会话编号。
  • 返回值

    {
      "data": {
        "stream_url": "/hls/498090097324138496/playlist.m3u8"
      },
      "msg": null,
      "ok": true,
      "error": null,
      "code": 1
    }
    

4.4 查询处理状态接口 /status

  • 接口 URL

    GET /hls/status
    
  • 请求参数

    • session_id(必填)
  • 返回值

    {
      "data": {
        "stream_url": "/hls/498090097324138496/playlist.m3u8"
      },
      "msg": null,
      "ok": true,
      "error": null,
      "code": 1
    }
    

4.5 结束接口 /finish

  • 接口目的
    当客户端确定所有场景文件上传完毕,不再有新内容追加时,调用该接口通知服务器结束会话。服务器收到后,在最新更新的播放列表中追加 EXT‑X‑ENDLIST 标签,明确标识播放流已结束。

  • 接口 URL

    POST /hls/finish
    
  • 请求参数

    • session_id(必填):当前播放流的唯一标识,与上传接口中一致。
    • finish_time(可选):事件事件戳。

    请求示例(JSON 格式):

    {
      "session_id": "abc123-xxxx",
      "finish_time": ""
    }
    
  • 返回值

    {
      "data":null
      "msg": null,
      "ok": true,
      "error": null,
      "code": 1
    }
    
  • 服务端内部逻辑

    1. 接收结束通知,根据 session_id 定位到对应会话的播放列表管理模块。
    2. 检查当前播放列表中是否已有 EXT‑X‑ENDLIST 标签;若没有,则追加该标签,并更新会话状态为 FINISHED。
    3. 记录结束操作日志,通知相关监控模块或推送给客户端。
    4. 播放器在刷新播放列表时读取到 EXT‑X‑ENDLIST 标签,从而判断流已结束。

4.6 上传接口 /hls/upload/video

  • 接口 URL scene_index

    POST /hls/upload/video
    
  • 请求参数

    • session_id(必填):客户端生成的唯一编号,用于标识会话/流。
    • scene_index(可选):当前场景的序号,便于服务器按顺序处理(若不传,服务器可根据上传时间排序)。
    • 文件数据:Content-Type 为 multipart/form-data,包含 MP4 文件。

    请求示例:

    POST /upload?session_id={uniqueId}
    Content-Type: multipart/form-data
    Body: video
    
  • 返回值

    {
      "data": {
        "session_id": "",
        "scene_index": 1
      },
      "msg": null,
      "ok": true,
      "error": null,
      "code": 1
    }
    

4.2 上传接口 /hls/upload/audio

  • 接口 URL scene_index

    POST /hls/upload/audio
    
  • 请求参数

    • session_id(必填):客户端生成的唯一编号,用于标识会话/流。
    • scene_index(可选):当前场景的序号,便于服务器按顺序处理(若不传,服务器可根据上传时间排序)。
    • 文件数据:Content-Type 为 multipart/form-data,包含 MP4 文件。

    请求示例:

    POST /upload?session_id={uniqueId}
    Content-Type: multipart/form-data
    Body: audio
    
  • 返回值

    {
      "data": {
        "session_id": "",
        "scene_index": 1
      },
      "msg": null,
      "ok": true,
      "error": null,
      "code": 1
    }
    

5. 服务端内部逻辑

5.1 文件接收与归档

  • 唯一标识管理
    根据上传请求中的 session_id,将同一会话的 MP4 文件存放到特定目录或队列中,例如:
    ./data/hls/{session_id}/scene_{scene_index}.mp4

  • 队列管理
    将上传成功的文件记录在内部任务队列中,等待后续转换处理。


5.2 转换与分段处理

  • 调用 native‑media API
    接收到 MP4 文件后,服务端调用 native‑media 的转换接口,将 MP4 文件转换为 HLS 分段(TS 或 fMP4)。转换参数包括:

    • 固定的分段时长(例如 10 秒,相当于 -hls_time 10 的效果);
    • 指定输出的起始编号(第一场景起始编号为 0,后续场景根据前一会话最大分段编号设置 -start_number 参数)。

    示例调用(伪代码):

    // nativeMedia.convertToHLS(inputFile, outputDir, startNumber, hlsTime);
    NativeMedia.convertToHLS("./data/uploads/abc123/scene_1.mp4","./data/hls/abc123/",0, 10);
    
  • 分段连续性
    每个转换任务生成的 TS 文件名称格式为 "segment_%03d.ts",同时生成一个 m3u8 播放列表片段。服务端解析该 m3u8 文件中的分段信息和 EXTINF 值,将新条目追加到全局播放列表中。


5.3 播放列表动态更新

  • 内部播放列表管理
    服务器维护一个内存中的播放列表对象,每次转换完成后,将新生成的 TS 分段条目追加到该列表中,并动态更新以下标签:

    • EXT-X-MEDIA-SEQUENCE:设为当前播放列表中第一个分段的编号;
    • EXT-X-TARGETDURATION:设置为所有分段中最大时长;
    • 每个分段的 EXTINF 标签根据实际分段时长更新。
  • 列表文件更新
    定时或实时将内存中的播放列表写入磁盘(例如 ./data/hls/{session_id}/playlist.m3u8),供外部 HTTP 服务器访问,或通过 API 将最新列表返回给客户端。


5.4 与 native‑media 集成

  • 替代 ffmpeg 的关键点
    native‑media 项目作为内部音视频处理库,其 API 应支持:

    • MP4 到 HLS(TS 或 fMP4)转换;
    • 分段参数设置(起始编号、分段时长等);
    • 生成播放列表信息(包含分段文件名、EXTINF 等)。
  • 定制改造
    可根据需求在 native‑media 中扩展接口,如支持动态追加分段、获取转换进度等,以便与服务端播放列表管理逻辑配合工作。


5.5 异常处理与日志记录

  • 转换错误
    若转换失败或时间戳不连续,服务端应进行重试,或记录错误信息并通知上层监控模块。

  • 并发处理
    对于同一会话中多个场景文件并发上传和转换,需设计并发控制机制(例如基于队列或线程池)确保转换顺序和播放列表的连续性。

  • 日志记录
    对每个转换任务和播放列表更新记录详细日志,便于后续调试和性能监控。


6. native‑media 项目说明

6.1 项目概述

native‑media 是内部开发的音视频处理库,用以替代 ffmpeg。主要特点包括:

  • 支持常用格式转换(MP4、TS、fMP4、HLS);
  • 可配置转换参数(如分段时长、起始编号);
  • 提供 API 接口供 Java 服务端调用,支持批量处理和动态追加。

6.2 API 调用示例

示例接口(伪代码):

// 将 MP4 文件转换为 HLS 分段
HLSConversionResult result = nativeMedia.convertToHLS(
    inputFilePath,     // MP4 文件路径
    outputDirectory,   // 输出目录
    startSegmentNumber,// 分段起始编号
    segmentDuration    // 分段时长(秒)
);

if (result.isSuccess()) {
    // 返回 TS 文件列表及生成的播放列表片段
    List<TSSegment> segments = result.getSegments();
    String partialM3U8 = result.getM3U8Content();
    // 将这些数据交给播放列表管理模块追加更新
}

扩展点包括:

  • 支持回调通知转换进度;
  • 支持直接输出 fMP4 分段;
  • 提供错误码和详细日志输出接口。

7. 总结与扩展

本文档描述了一个基于 Java 服务器和内部 native‑media 库实现的 HLS 动态推流系统设计方案。系统流程涵盖:

  • 客户端通过调用 /start 接口初始化会话并获取播放列表 URL;
  • 客户端依次上传带有唯一标识的 MP4 场景文件(调用 /upload 接口),服务端利用 native‑media 进行转换分段,并动态更新 m3u8 播放列表(通过 /stream 接口供播放器获取);
  • 当所有场景文件上传完毕后,客户端调用 /finish 接口,服务器在播放列表末尾追加 EXT‑X‑ENDLIST 标签,标识流播放结束;
  • (可选)通过 /status 接口查询当前处理状态。

播放结束判定说明

在 HLS 规范中,播放结束通常由服务器端通过播放列表来控制,而非客户端主动发送结束标识,具体包括:

  1. EXT‑X‑ENDLIST 标签
    服务器确定整个流结束时,在 m3u8 播放列表末尾添加 EXT‑X‑ENDLIST 标签。播放器读取该标签后,会认为流已结束,从而停止请求新分段。

  2. 客户端判断

    • 客户端无需主动发送“结束”信号,可根据播放列表中是否包含 EXT‑X‑ENDLIST 标签判断流结束;
    • 或者根据播放列表在一定时间内不再更新(连续多次刷新无新分段)的情况判断播放结束。
  3. 方案建议

    • 主动结束:设计结束接口(如 /finish),当全部场景上传完毕后,客户端主动通知服务器。
    • 被动检测:若无主动结束信号,服务器在预设超时周期内无新场景数据时自动追加 EXT‑X‑ENDLIST 标签。

未来扩展

  • 支持 fMP4(CMAF)输出以降低延迟;
  • 增加转换进度回调和监控接口;
  • 进一步优化并发处理和错误恢复策略。

通过上述完整接口体系和内部逻辑设计,整个系统能够实现从会话初始化、文件上传、转换分段到播放结束的全流程管理,确保客户端播放体验无缝且实时。希望本技术文档能为工程师开发提供充分的技术依据,并根据项目实际情况进一步细化接口和参数设置。

C 端代码实现

参考我的 native-media 章节

Edit this page
Last Updated:
Contributors: Tong Li
Prev
整合全流程完整文档
Next
manim 分场景生成代码