diff --git a/README.md b/README.md
index 5406365..1374aeb 100644
--- a/README.md
+++ b/README.md
@@ -4,9 +4,9 @@
1. [设备终端到平台的通信也就是JT808](#808Ext)
2. [企业平台到政府监管的通信也就是JT809](#809Ext)
-3. [设备终端上传的实时音视频流数据也就是视频服务器](#1078)
-3.1 [将1078的数据(h264)编码成FLV](#1078flv)
-3.2 [将1078的数据(h264)编码成HLS(尚未实现)](#1078HLS)
+3. [设备终端上传的实时音视频流数据也就是视频服务器](#1078)
+3.1 [将1078的数据(h264)编码成FLV](#1078flv)
+3.2 [将1078的数据(h264)编码成HLS](#1078hls)
[](https://github.com/SmallChi/JT1078/blob/master/LICENSE)[]()
@@ -16,6 +16,7 @@
| --------------------- | -------------------------------------------------- | --------------------------------------------------- |
| Install-Package JT1078 |  |  |
| Install-Package JT1078.Flv |  |  |
+| Install-Package JT1078.Hls |  |  |
| Install-Package JT808.Protocol.Extensions.JT1078 |  |  |
| Install-Package JT809.Protocol.Extensions.JT1078 |  |  |
@@ -169,6 +170,17 @@ Platform=AnyCpu Server=False Toolchain=.NET Core 3.1
|DataType|JT1078的DataType为FLv的FrameType的值(判断是否为关键帧)|
|LastFrameInterval|JT1078的LastFrameInterval为FLv(B/P帧)的CompositionTime值|
+## 基于JT1078的Hls视频编码器
+
+### 前提条件
+
+1. 掌握JT078解码;
+2. 了解H264解码;
+3. 掌握TS编码;
+4. 掌握Hls编码;
+
+> 音频暂未实现
+
### 使用BenchmarkDotNet性能测试报告(只是玩玩,不能当真)
``` ini
diff --git a/src/JT1078.Hls/JT1078.Hls.csproj b/src/JT1078.Hls/JT1078.Hls.csproj
index 1928b64..baf5585 100644
--- a/src/JT1078.Hls/JT1078.Hls.csproj
+++ b/src/JT1078.Hls/JT1078.Hls.csproj
@@ -20,6 +20,14 @@
LICENSE
+
+ JT1078.Hls.xml
+
+
+
+ JT1078.Hls.xml
+
+
diff --git a/src/JT1078.Hls/JT1078.Hls.xml b/src/JT1078.Hls/JT1078.Hls.xml
new file mode 100644
index 0000000..ce1d838
--- /dev/null
+++ b/src/JT1078.Hls/JT1078.Hls.xml
@@ -0,0 +1,727 @@
+
+
+
+ JT1078.Hls
+
+
+
+
+
+
+
+
+
+ 2.6.18 ISO 639 language descripto
+
+
+
+
+ 24bit
+
+
+
+
+ 8bit
+
+
+
+
+ 业务描述服务描述
+
+
+
+
+ 业务描述符
+ 8bit
+
+
+
+
+ 8bit
+
+
+
+
+
+ 8bit
+
+
+
+
+
+ 8bit
+
+
+
+
+
+ ServiceProviderLength
+
+
+
+
+
+ 8bit
+
+
+
+
+
+ ServiceNameLenth
+
+
+
+
+ 取0x50表示包含PCR或0x40表示不包含PCR
+ 注意:关键帧需要加pcr
+
+
+
+
+
+
+
+
+
+ 服务描述类型
+
+
+
+
+ 运行状态
+
+
+
+
+ m3u8文件管理
+
+
+
+
+ 生成ts和m3u8文件
+
+
+
+
+
+ 维护TS文件信息队列
+
+
+
+
+
+
+
+ 创建M3U8文件
+
+
+
+
+
+ 创建TS文件信息
+
+
+
+
+
+
+ 创建TS文件
+
+ ts文件路径
+ 文件内容
+
+
+
+ 停止观看直播时清零数据
+
+
+
+
+
+
+ TS文件信息
+
+
+
+
+ ts文件名
+
+
+
+
+ 持续时间
+
+
+
+
+ 当前ts文件序号
+
+
+
+
+ 是否创建ts文件
+
+
+
+
+ ts文件第一个jt1078包的时间戳
+
+
+
+
+ m3u8配置文件
+
+
+
+
+ m3u8文件中默认包含的ts文件数
+
+
+
+
+ 每个ts文件的最大时长
+
+
+
+
+ m3u8文件
+
+
+
+
+ hls文件路径(包括m3u8路径,ts路径)
+
+
+
+
+ 开始码,固定为0x000001
+
+
+
+
+ 音频取值(0xc0-0xdf),通常为0xc0
+ 视频取值(0xe0-0xef),通常为0xe0
+
+
+
+
+ 后面pes数据的长度,0表示长度不限制,只有视频数据长度会超过0xffff
+
+
+
+
+ 通常取值0x80,表示数据不加密、无优先级、备份的数据
+ ISOIEC13818-1 120页 Table E-1 -- PES packet header example
+
+
+
+
+ 取值0x80表示只含有pts,取值0xc0表示含有pts和dts
+ ISOIEC13818-1 120页 Table E-1 -- PES packet header example
+
+
+
+
+ 根据PTS_DTS_Flag来判断后续长度
+ 后面数据的长度,取值5或10
+
+
+
+
+ 5B
+ 33bit值
+
+
+
+
+ 5B
+ 33bit值
+
+
+
+
+ 音视频数据
+
+
+
+
+ 固定包长度
+
+
+
+
+ 固定ES包头的长度
+
+
+
+
+ 1.SDT
+ 2.PAT
+ 3.PMT
+ 4.PES
+
+
+
+
+ 取0x50表示包含PCR或0x40表示不包含PCR
+ 1B
+
+
+
+
+ JT1078时间戳
+ 第一包的数据、关键帧
+ Program Clock Reference,节目时钟参考,用于恢复出与编码端一致的系统时序时钟STC(System Time Clock)
+ 5B
+
+
+
+
+ 填充字节大小
+
+
+
+
+ 同步字节,固定为0x47
+
+
+
+
+ 传输错误指示符,表明在ts头的adapt域后由一个无用字节,通常都为0,这个字节算在adapt域长度内
+ 1bit
+
+
+
+
+ 负载单元起始标示符,一个完整的数据包开始时标记为1
+ 1bit
+
+
+
+
+ 传输优先级,0为低优先级,1为高优先级,通常取0
+ 1bit
+
+
+
+
+ pid值
+ 13bit
+
+
+
+
+ 传输加扰控制
+ 2bit
+
+
+
+
+ 是否包含自适应区,‘00’保留;‘01’为无自适应域,仅含有效负载;‘10’为仅含自适应域,无有效负载;‘11’为同时带有自适应域和有效负载。
+ 2bit
+
+
+
+
+ 递增计数器,从0-f,起始值不一定取0,但必须是连续的
+ 4bit
+
+
+
+
+ 自适应域长度,后面的字节数
+ 调整字段长度标示,标示此字节后面调整字段的长度,占位8bit;
+ 值为0时,表示在TS分组中插入一个调整字节,后面没有调整字段,紧跟着的是有效负载;
+ adaptation_field_control == ‘11’时,此值在0 ~182之间,
+ adaptation_field_control == ‘10’时,此值为183,若字段没这么长则填充0xFF字段;
+
+
+
+
+ 附加字段
+
+
+
+
+ 格式节目关联表
+
+
+
+
+ PAT表固定为0x00
+ 8bit
+
+
+
+
+ 固定为二进制1
+ 1bit
+
+
+
+
+ 固定为二进制0
+ 1bit
+
+
+
+
+ 固定为二进制3
+ 2bit
+
+
+
+
+ 后面数据的长度
+ 12bit
+
+
+
+
+ 传输流ID
+ 16bit
+
+
+
+
+ 固定为二进制3
+ 2bit
+
+
+
+
+ 版本号,固定为二进制00000,如果PAT有变化则版本号加1
+ 5bit
+
+
+
+
+ 固定为二进制1,表示这个PAT表可以用,如果为0则要等待下一个PAT表
+ 1bit
+
+
+
+
+ 固定为0x00
+ bit8
+
+
+
+
+ 固定为0x00
+ bit8
+
+
+
+
+ 前面数据的CRC32校验码
+
+
+
+
+ 节目号为0x0000时表示这是NIT,节目号为0x0001时,表示这是PMT
+ 16bit
+
+
+
+
+ 固定为二进制111(7)
+ 0b_1110_0000_0000_0000
+ 3bit
+
+
+
+
+ 节目号对应内容的PID值
+ 13bit
+
+
+
+
+ 流类型,标志是Video还是Audio还是其他数据,h.264编码对应0x1b,aac编码对应0x0f,mp3编码对应0x03
+ 8bit
+
+
+
+
+ 固定为二进制111(7)
+ 0b_1110_0000_0000_0000
+ 3bit
+
+
+
+
+ 与StreamType对应的PID
+ 13bit
+
+
+
+
+ 固定为二进制1111(15)
+ 0b_1111_0000_0000_0000
+ 4bit
+
+
+
+
+ 描述信息,指定为0x000表示没有
+ 12bit
+
+
+
+
+ 格式节目映射表
+
+
+
+
+ PMT表取值随意
+ 8bit
+
+
+
+
+ 固定为二进制1
+ 1bit
+
+
+
+
+ 固定为二进制0
+ 1bit
+
+
+
+
+ 固定为二进制3
+ 2bit
+
+
+
+
+ 后面数据的长度
+ 12bit
+
+
+
+
+ 频道号码,表示当前的PMT关联到的频道,取值0x0001
+ 16bit
+
+
+
+
+ 固定为二进制3
+ 2bit
+
+
+
+
+ 版本号,固定为二进制00000,如果PAT有变化则版本号加1
+ 5bit
+
+
+
+
+ 固定为二进制1,表示这个PAT表可以用,如果为0则要等待下一个PAT表
+ 1bit
+
+
+
+
+ 固定为0x00
+ bit8
+
+
+
+
+ 固定为0x00
+ bit8
+
+
+
+
+ 固定为二进制111(7)
+ 2bit
+
+
+
+
+ PCR(节目参考时钟)所在TS分组的PID,指定为视频PID
+ 13bit
+
+
+
+
+ 固定为二进制1111(F)
+ 4bit
+
+
+
+
+ 节目描述信息,指定为0x000表示没有
+ 12bit
+
+
+
+
+ 前面数据的CRC32校验码
+
+
+
+
+ 业务描述表
+
+
+
+
+ 表标识符
+ 可以是0x42,表示描述的是当前流的信息,也可以是0x46,表示是其他流的信息
+ 8bit
+
+
+
+
+ 段语法指示符
+ 1bit
+
+
+
+
+ 保留未来使用
+ 1bit
+
+
+
+
+ 保留位,防止控制字冲突,一般是''0'',也有可能是''1''
+ 2bit
+
+
+
+
+ 段长度 从transport_stream_id开始,到CRC_32结束(包含)
+ 12bit
+
+
+
+
+ 传输流标识符
+ 同 PAT表中的 TransportStreamId 和PMT表中 ProgramNumber
+ 16bit
+
+
+
+
+ 保留位
+ 2bit
+
+
+
+
+ 版本号
+ 标识子表的版本号。当子表包含的信息发生变化时, version_number 加 1。当值增至 31 时,复位为 0。
+ 当 current_next_indicator 置“1”时,则 version_number 为当前使用的子表的版本号。
+ 当 current_next_indicator 置“0”时,则 version_number 为下一个使用的子表的版本号。
+ 5bit
+
+
+
+
+ 当前后续指示符
+ 当被置“1”时,表示当前子表 正被使用。
+ 当其置“0”时,表示所传子表尚未被使用,它是下一个将被使用的子表。
+ 1bit
+
+
+
+
+ 段号
+ 子表中的第一个段的 section_number 标 为 “ 0x00 ”。
+ 每增加一个具有相同的 table_id 、 transport_stream_id 和original_network_id 的段,section_number 就加 1。
+ bit8
+
+
+
+
+ 最后段号
+ 表示所属的子表的最后一个段(即段号最大的段)的段号。
+ bit8
+
+
+
+
+ 原始网络标识符
+ 原始传输系统的 network_id
+ bit16
+
+
+
+
+ 保留未来使用位
+ bit8
+
+
+
+
+ 前面数据的CRC32校验码
+
+
+
+
+ 业务描述服务
+
+
+
+
+ 业务标识符
+ 用于在 TS 流中识别不同的业务。service_id 与program_map_section 中的 program_number 取同一值
+ 16bit
+
+
+
+
+ 保留将来使用
+ 6bit
+
+
+
+
+ EIT 时间表标志
+ 置“1”时,表示业务的 EIT 时间表信息存在于当前 TS 中(一个 EIT 时间表子表两次出现的最大时间间隔信息见 ETR 211)。
+ 置“0”时,表示业务的 EIT 时间表信息不在当前 TS 中
+ 1bit
+
+
+
+
+ EIT 当前后续标志
+ 置“1”时,表示业务的 EIT 当前后续信息存在于当前 TS 中(一个 EIT 当前后续子表两次出现的最大时间间隔信息见ETR 211)
+ 置“0”时,表示业务的 EIT 当前后续信息不在当前 TS 中。
+ 1bit
+
+
+
+
+ 运行状态
+ 对于一个 NVOD 业务,running_status 的值都置“0”
+ 3bit
+
+
+
+
+ 自由条件接收模式
+ 置“0”时,表示业务的所有组件都未被加扰
+ 置“1”时,表示一路或多路码流的接收由 CA 系统控制。
+ 1bit
+
+
+
+
+ 描述符循环长度
+ 指出从本字段的下一个字节开始的描述符的总字节长度。
+ 12bit
+
+
+
+