{"id":28564553,"url":"https://github.com/smallchi/jt1078","last_synced_at":"2025-06-10T13:36:33.102Z","repository":{"id":38291114,"uuid":"194670924","full_name":"SmallChi/JT1078","owner":"SmallChi","description":"JT1078协议、GB1078协议、道路运输车辆卫星定位系统-视频通讯协议","archived":false,"fork":false,"pushed_at":"2022-12-31T09:49:01.000Z","size":91110,"stargazers_count":216,"open_issues_count":1,"forks_count":142,"subscribers_count":14,"default_branch":"master","last_synced_at":"2025-05-15T20:53:23.140Z","etag":null,"topics":["1078","808","809","csharp","dotnetcore","gb1078","gb808","gb809","h264toflv","jt1078","jt808","jt809","jtt1078","jtt808","jtt809","net5"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SmallChi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-07-01T12:44:23.000Z","updated_at":"2025-04-24T20:38:29.000Z","dependencies_parsed_at":"2023-01-31T18:46:22.836Z","dependency_job_id":null,"html_url":"https://github.com/SmallChi/JT1078","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SmallChi%2FJT1078","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SmallChi%2FJT1078/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SmallChi%2FJT1078/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SmallChi%2FJT1078/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SmallChi","download_url":"https://codeload.github.com/SmallChi/JT1078/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SmallChi%2FJT1078/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259085496,"owners_count":22803210,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["1078","808","809","csharp","dotnetcore","gb1078","gb808","gb809","h264toflv","jt1078","jt808","jt809","jtt1078","jtt808","jtt809","net5"],"created_at":"2025-06-10T13:36:32.514Z","updated_at":"2025-06-10T13:36:33.085Z","avatar_url":"https://github.com/SmallChi.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"﻿# JT1078\n\n道路运输车辆卫星定位系统-视频通讯协议主要分为三大部分。\n\n1. [设备终端到平台的通信也就是JT808]\n2. [企业平台到政府监管的通信也就是JT809](#809Ext)\n3. [设备终端上传的实时音视频流数据也就是视频服务器](#1078)  \n3.1  [将1078的数据(h264)编码成FLV](#1078flv)  \n3.2  [将1078的数据(h264)编码成HLS](#1078hls)  \n3.3  [将1078的数据(h264)编码成FMp4](#1078fmp4)  \n4. ***====音频部分暂未实现====***\n\n[![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)]()\n\n## NuGet安装\n\n| Package Name| Version|Pre Version| Downloads|\n| --- |---| --- | --- |\n| Install-Package JT1078 | ![JT1078](https://img.shields.io/nuget/v/JT1078.svg) | ![JT1078](https://img.shields.io/nuget/vpre/JT1078.svg) |![JT1078](https://img.shields.io/nuget/dt/JT1078.svg) |\n| Install-Package JT1078.Flv | ![JT1078.Flv](https://img.shields.io/nuget/v/JT1078.Flv.svg) |  ![JT1078.Flv](https://img.shields.io/nuget/vpre/JT1078.Flv.svg) |![JT1078.Flv](https://img.shields.io/nuget/dt/JT1078.Flv.svg) |\n| Install-Package JT1078.Hls | ![JT1078.Hls](https://img.shields.io/nuget/v/JT1078.Hls.svg) | ![JT1078.Hls](https://img.shields.io/nuget/vpre/JT1078.Hls.svg) |![JT1078.Hls](https://img.shields.io/nuget/dt/JT1078.Hls.svg) |\n| Install-Package JT1078.FMp4 | ![JT1078.FMp4](https://img.shields.io/nuget/v/JT1078.FMp4.svg) | ![JT1078.FMp4](https://img.shields.io/nuget/vpre/JT1078.FMp4.svg) |![JT1078.FMp4](https://img.shields.io/nuget/dt/JT1078.FMp4.svg) |\n\n## \u003cspan id=\"1078\"\u003e基于JT1078音视频流数据的RTP协议\u003c/span\u003e\n\n### 前提条件\n\n1. 掌握进制转换：二进制转十六进制；\n2. 掌握BCD编码、Hex编码；\n3. 掌握各种位移、异或；\n4. 掌握快速ctrl+c、ctrl+v；\n5. 掌握Span\\\u003cT\\\u003e的基本用法\n6. 掌握以上装逼技能，就可以开始搬砖了。\n\n### 数据结构解析\n\n| 帧头标识 | 标注1| 标注1| 包序号|SIM 卡号 |逻辑通道号| 标注3 | 时间戳 |Last I Frame Interval|Last Frame Interval|数据体长度|数据体\n| :----: | :----:  | :----:  | :----:  | :----: | :----:  |:----:|:----:|:----: |:----: |:----: |:----: |\n| FH_Flag  | Label1 | Label2 | SN | SIM |LogicChannelNumber|Label3|Timestamp|LastIFrameInterval|LastFrameInterval|DataBodyLength|Bodies\n\n#### 标注1（Label1）\n\n|RTP协议的版本号|填充标志|扩展标志|CSRC计数器|\n| :----: | :----:  | :----:  | :----:  |\n| V  | P | X | CC |\n\n#### 标注2（Label2）\n\n|标志位，确定是否完整数据帧的边界|负载类型|\n| :----: | :----:  |\n|  M  | PT |\n\n#### 标注3（Label3）\n\n|数据类型|分包处理标记|\n| :----: | :----:  |\n|  DataType  | SubpackageType |\n\n\u003e 1.参考JTT1078文档\n\u003e 2.参考RTP协议\n\n### 举个栗子1\n\n#### 1.组包\n\n``` package\n\nJT1078Package jT1078Package = new JT1078Package();\njT1078Package.Label1 = new JT1078Label1(0x81);\njT1078Package.Label2 = new JT1078Label2(0xE2);\njT1078Package.SN = 0x1088;\njT1078Package.SIM = \"11234567810\";\njT1078Package.LogicChannelNumber = 0x01;\njT1078Package.Label3 = new JT1078Label3(0x10);\njT1078Package.Timestamp = 1562085870204;\njT1078Package.LastIFrameInterval = 0x0280;\njT1078Package.LastFrameInterval = 0x0028;\njT1078Package.Bodies = \"00 00 00 01 61 E1 A2 BF 00 98 CF C0 EE 1E 17 28 34 07 78 8E 39 A4 03 FD DB D1 D5 46 BF B0 63 01 3F 59 AC 34 C9 7A 02 1A B9 6A 28 A4 2C 08\".ToHexBytes();\nvar hex = JT1078Serializer.Serialize(jT1078Package).ToHexString();\n// 输出结果Hex：\n//30 31 63 64 81 E2 10 88 01 12 34 56 78 10 01 10 00 00 01 6B B3 92 CA 7C 02 80 00 28 00 2E 00 00 00 01 61 E1 A2 BF 00 98 CF C0 EE 1E 17 28 34 07 78 8E 39 A4 03 FD DB D1 D5 46 BF B0 63 01 3F 59 AC 34 C9 7A 02 1A B9 6A 28 A4 2C 08\n```\n\n#### 2.手动解包\n\n``` unpackage\n1.原包：\n30 31 63 64 81 E2 10 88 01 12 34 56 78 10 01 10 00 00 01 6B B3 92 CA 7C 02 80 00 28 00 2E 00 00 00 01 61 E1 A2 BF 00 98 CF C0 EE 1E 17 28 34 07 78 8E 39 A4 03 FD DB D1 D5 46 BF B0 63 01 3F 59 AC 34 C9 7A 02 1A B9 6A 28 A4 2C 08\n\n2.拆解：\n30 31 63 64              --帧头表示\n81                       --Label1 =\u003e10000001 V P X CC\nE2                       --Label2 =\u003e11100010 M PT\n10 88                    --SN 包序号\n01 12 34 56 78 10        --SIM卡号\n01                       --逻辑通道号\n10                       --Label3 =\u003e数据类型 分包处理标记\n00 00 01 6B B3 92 CA 7C  --时间戳\n02 80                    --Last I Frame Interval\n00 28                    --Last Frame Interval\n00 2E                    --数据体长度\n00 00 00 01 61 E1 A2 BF  --数据体\n00 98 CF C0 EE 1E 17 28\n34 07 78 8E 39 A4 03 FD\nDB D1 D5 46 BF B0 63 01\n3F 59 AC 34 C9 7A 02 1A\nB9 6A 28 A4 2C 08\n```\n\n#### 3.程序解包\n\n``` unpackage2\nvar bytes = \"30 31 63 64 81 E2 10 88 01 12 34 56 78 10 01 10 00 00 01 6B B3 92 CA 7C 02 80 00 28 00 2E 00 00 00 01 61 E1 A2 BF 00 98 CF C0 EE 1E 17 28 34 07 78 8E 39 A4 03 FD DB D1 D5 46 BF B0 63 01 3F 59 AC 34 C9 7A 02 1A B9 6A 28 A4 2C 08\".ToHexBytes();\nJT1078Package package = JT1078Serializer.Deserialize(bytes);\nAssert.Equal(0x81, package.Label1.ToByte());\nAssert.Equal(0xE2, package.Label2.ToByte());\nAssert.Equal(0x1088, package.SN);\nAssert.Equal(\"011234567810\", package.SIM);\nAssert.Equal(0x01, package.LogicChannelNumber);\nAssert.Equal(0x10, package.Label3.ToByte());\nAssert.Equal((ulong)1562085870204, package.Timestamp);\nAssert.Equal(0x0280, package.LastIFrameInterval);\nAssert.Equal(0x0028, package.LastFrameInterval);\nAssert.Equal(0x002E, package.DataBodyLength);\nAssert.Equal(\"00 00 00 01 61 E1 A2 BF 00 98 CF C0 EE 1E 17 28 34 07 78 8E 39 A4 03 FD DB D1 D5 46 BF B0 63 01 3F 59 AC 34 C9 7A 02 1A B9 6A 28 A4 2C 08\".ToHexBytes(), package.Bodies);\n```\n\n### 使用BenchmarkDotNet性能测试报告（只是玩玩，不能当真）\n\n``` ini\n\nBenchmarkDotNet=v0.12.0, OS=Windows 10.0.18363\nIntel Core i7-8700K CPU 3.70GHz (Coffee Lake), 1 CPU, 12 logical and 6 physical cores\n.NET Core SDK=3.1.100\n  [Host]     : .NET Core 3.1.0 (CoreCLR 4.700.19.56402, CoreFX 4.700.19.56404), X64 RyuJIT\n  Job-SIQGUC : .NET Core 3.1.0 (CoreCLR 4.700.19.56402, CoreFX 4.700.19.56404), X64 RyuJIT\n\nPlatform=AnyCpu  Server=False  Toolchain=.NET Core 3.1  \n\n```\n|            Method |      N |          Mean |        Error |       StdDev |      Gen 0 |  Gen 1 | Gen 2 |    Allocated |\n|------------------ |------- |--------------:|-------------:|-------------:|-----------:|-------:|------:|-------------:|\n|  **JT1078Serializer** |    **100** |     **183.51 us** |     **2.207 us** |     **2.064 us** |    **37.8418** |      **-** |     **-** |    **232.81 KB** |\n| JT1078Deserialize |    100 |      35.88 us |     0.503 us |     0.420 us |    23.8037 |      - |     - |    146.09 KB |\n|  **JT1078Serializer** |  **10000** |  **23,107.15 us** |   **196.882 us** |   **184.164 us** |  **3781.2500** |      **-** |     **-** |  **23281.25 KB** |\n| JT1078Deserialize |  10000 |   3,620.54 us |    45.558 us |    40.386 us |  2382.8125 | 3.9063 |     - |  14609.38 KB |\n|  **JT1078Serializer** | **100000** | **236,213.13 us** | **5,465.042 us** | **6,074.380 us** | **38000.0000** |      **-** |     **-** |  **232812.5 KB** |\n| JT1078Deserialize | 100000 |  37,065.84 us |   665.875 us |   590.281 us | 23785.7143 |      - |     - | 146093.75 KB |\n\n## \u003cspan id=\"1078flv\"\u003e基于JT1078的Flv视频编码器\u003c/span\u003e\n\n### 前提条件\n\n1. 掌握JT078解码；\n2. 了解H264解码；\n3. 掌握FLV编码；\n\n由于网上资料比较多，自己也不擅长写文章，这边只是着重写一些在实际开发中需要注意的问题。\n\n\u003e 注意：目前仅支持H264编码的视频播放，主次码流的切换。由于多数设备厂商只支持一路通道只能存在主码流或者子码流，所以不考虑同时上传主次码流。\n\n### 关注点\n\n1. 在组包FLV的时候需要注意将解析的NALU值放入VideoTagsData中，格式:[NALU.Length 长度]+[NALU 值]...[NALU.Length 长度]+[NALU 值]可以存放多个NALU。\n\n2. JT1078的属性大有用处。\n\n| JT1078属性  | FLV属性 |\n| :--- | :----|\n|Timestamp|JT1078的Timestamp为FLv的Timestamp|\n|DataType|JT1078的DataType为FLv的FrameType的值（判断是否为关键帧）|\n|LastFrameInterval|JT1078的LastFrameInterval为FLv（B/P帧）的CompositionTime值|\n\n## \u003cspan id=\"1078hls\"\u003e基于JT1078的Hls视频编码器\u003c/span\u003e\n\n### 前提条件\n\n1. 掌握JT078解码；\n2. 了解H264解码；\n3. 掌握TS编码；\n4. 掌握Hls编码；\n\n## \u003cspan id=\"1078fmp4\"\u003e基于JT1078的FMp4视频编码器\u003c/span\u003e\n\n### 前提条件\n\n1. 掌握JT078解码；\n2. 了解H264解码；\n3. 掌握FMp4编码；\n\n### 使用BenchmarkDotNet性能测试报告（只是玩玩，不能当真）\n\n``` ini\n\nBenchmarkDotNet=v0.12.0, OS=Windows 10.0.18363\nIntel Core i7-8700K CPU 3.70GHz (Coffee Lake), 1 CPU, 12 logical and 6 physical cores\n.NET Core SDK=3.1.100\n  [Host]     : .NET Core 3.1.0 (CoreCLR 4.700.19.56402, CoreFX 4.700.19.56404), X64 RyuJIT\n  Job-GMXLRW : .NET Core 3.1.0 (CoreCLR 4.700.19.56402, CoreFX 4.700.19.56404), X64 RyuJIT\n\nPlatform=AnyCpu  Server=False  Toolchain=.NET Core 3.1  \n\n```\n|          Method |      N |            Mean |        Error |       StdDev |       Gen 0 |     Gen 1 | Gen 2 |     Allocated |\n|---------------- |------- |----------------:|-------------:|-------------:|------------:|----------:|------:|--------------:|\n| **EXPGolombReader** |    **100** |        **11.23 us** |     **0.032 us** |     **0.025 us** |      **1.5259** |         **-** |     **-** |       **9.38 KB** |\n|     H264Decoder |    100 |     1,218.74 us |    23.313 us |    27.752 us |    126.9531 |    1.9531 |     - |     786.72 KB |\n|      FlvEncoder |    100 |       215.40 us |     3.245 us |     2.533 us |    249.0234 |    3.4180 |     - |    1528.91 KB |\n| **EXPGolombReader** |  **10000** |     **1,170.19 us** |    **22.642 us** |    **25.167 us** |    **152.3438** |         **-** |     **-** |      **937.5 KB** |\n|     H264Decoder |  10000 |   119,152.25 us |   955.118 us |   893.418 us |  12800.0000 |  200.0000 |     - |   78672.14 KB |\n|      FlvEncoder |  10000 |    21,582.41 us |   587.627 us |   549.667 us |  24937.5000 |         - |     - |  152890.63 KB |\n| **EXPGolombReader** | **100000** |    **11,687.72 us** |   **162.828 us** |   **152.309 us** |   **1515.6250** |         **-** |     **-** |       **9375 KB** |\n|     H264Decoder | 100000 | 1,192,549.87 us | 7,656.632 us | 7,162.018 us | 128000.0000 | 3000.0000 |     - |  786718.75 KB |\n|      FlvEncoder | 100000 |   216,951.31 us | 3,513.653 us | 2,934.059 us | 249333.3333 |         - |     - | 1528906.66 KB |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmallchi%2Fjt1078","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsmallchi%2Fjt1078","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmallchi%2Fjt1078/lists"}