From 7e3cc43f2726aa64d9f35cc4cb9dc49c7855eb47 Mon Sep 17 00:00:00 2001 From: "SmallChi(Koike)" <564952747@qq.com> Date: Sat, 22 Aug 2020 23:34:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=93=E5=8C=85hls=E5=8F=8A=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 18 +- src/JT1078.Hls/JT1078.Hls.csproj | 8 + src/JT1078.Hls/JT1078.Hls.xml | 727 +++++++++++++++++++++++++++++++ 3 files changed, 750 insertions(+), 3 deletions(-) create mode 100644 src/JT1078.Hls/JT1078.Hls.xml 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) [![MIT Licence](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/SmallChi/JT1078/blob/master/LICENSE)[![Github Build status](https://github.com/SmallChi/JT1078/workflows/.NET%20Core/badge.svg)]() @@ -16,6 +16,7 @@ | --------------------- | -------------------------------------------------- | --------------------------------------------------- | | Install-Package JT1078 | ![JT1078](https://img.shields.io/nuget/v/JT1078.svg) | ![JT1078](https://img.shields.io/nuget/dt/JT1078.svg) | | Install-Package JT1078.Flv | ![JT1078.Flv](https://img.shields.io/nuget/v/JT1078.Flv.svg) | ![JT1078.Flv](https://img.shields.io/nuget/dt/JT1078.Flv.svg) | +| Install-Package JT1078.Hls | ![JT1078.Hls](https://img.shields.io/nuget/v/JT1078.Hls.svg) | ![JT1078.Hls](https://img.shields.io/nuget/dt/JT1078.Hls.svg) | | Install-Package JT808.Protocol.Extensions.JT1078 | ![JT808.Protocol.Extensions.JT1078](https://img.shields.io/nuget/v/JT808.Protocol.Extensions.JT1078.svg) | ![JT808](https://img.shields.io/nuget/dt/JT808.Protocol.Extensions.JT1078.svg) | | Install-Package JT809.Protocol.Extensions.JT1078 | ![JT809.Protocol.Extensions.JT1078](https://img.shields.io/nuget/v/JT809.Protocol.Extensions.JT1078.svg) | ![JT809](https://img.shields.io/nuget/dt/JT809.Protocol.Extensions.JT1078.svg) | @@ -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 + + + +