# JT1078.VideoProxy **Repository Path**: spinach720/jt1078.-video-proxy ## Basic Information - **Project Name**: JT1078.VideoProxy - **Description**: JT1078 Video Proxy - 基于ASP.NET Core开发的车载视频代理服务。 支持通过HTTP协议代理JT1078协议设备视频流,使用FFmpeg转封装为FLV/fMP4格式, 实现多客户端低延迟实时观看。适用于部标1078/808平台扩展视频播放功能。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-07 - **Last Updated**: 2026-05-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # JT1078.VideoProxy 基于 ASP.NET Core 的 JT1078 视频流代理服务,支持 HTTP-FLV / fMP4 流式输出,通过 FFmpeg 转封装实现多客户端同时观看车载终端实时视频。 ## 功能特性 - **JT1078 协议解析** — 从字节流中解析 JT1078 RTP 数据包,支持同步头定位、分包重组 - **H.264 帧重组** — 将分包的 JT1078 数据包(原子包/首包/中间包/尾包)重组为完整帧,支持超时清理 - **FFmpeg 转封装** — H.264 裸流实时转封装为 FLV 或 fMP4(fragmented MP4)格式输出 - **多客户端复用** — 同一源流 + 同一格式的多个客户端共享一个 FFmpeg 进程,节省资源 - **会话自动管理** — 引用计数管理生命周期,最后一个客户端断开时自动释放源流和 FFmpeg 进程 - **新客户端头部缓存** — 后加入的客户端自动补发 FLV Header / fMP4 init segment,实现中途接入 - **CORS 跨域支持** — 允许浏览器跨域访问,支持 `file://` 协议打开的页面直接播放 - **状态监控接口** — 提供 `/status` 端点查看活跃会话数和客户端数 ## 技术架构 ``` JT1078 设备源流 │ ▼ JT1078StreamParser ──→ FrameReassembler ──→ FFmpeg (H264→FLV/fMP4) │ │ │ 解析RTP包 重组完整帧 转封装输出 │ ┌───────────┴───────────┐ ▼ ▼ Client 1 Client N ``` ### 核心模块 | 模块 | 文件 | 说明 | |------|------|------| | JT1078 包模型 | `JT1078Packet.cs` | RTP 数据包结构定义,含帧类型、分包类型、SIM、通道等 | | 流解析器 | `JT1078StreamParser.cs` | 从字节流中按同步头 `0x30316364` 定位并解析 JT1078 包 | | 帧重组器 | `FrameReassembler.cs` | 将分包包重组为完整 H.264 帧,含超时清理机制 | | FFmpeg 管理 | `FFmpegProcessManager.cs` | 管理 FFmpeg 进程生命周期,stdin/stdout 管道读写 | | 流会话 | `StreamSession.cs` | 封装源流拉取 → 解析 → FFmpeg 转封装 → 多客户端广播的完整流程 | | 会话管理器 | `StreamSessionManager.cs` | 按 (URL, Format) 管理会话,并发安全,自动清理 | ## 快速开始 ### 环境要求 - .NET 10.0 SDK - FFmpeg(项目内已包含 `ffmpeg.exe`,Linux 需自行安装) ### 配置说明 编辑 `appsettings.json`: ```json { "StreamProxy": { "ListenPort": 12781, "FFmpegPath": "ffmpeg.exe", "FrameRate": 25 } } ``` | 配置项 | 默认值 | 说明 | |--------|--------|------| | ListenPort | 12781 | HTTP 监听端口 | | FFmpegPath | ffmpeg.exe | FFmpeg 可执行文件路径,支持相对/绝对路径 | | FrameRate | 25 | 输入帧率,FFmpeg 用 `-r` 参数指定 | ### 启动服务 ```bash dotnet run ``` 服务启动后监听 `http://0.0.0.0:12781`。 ## API 接口 ### FLV 代理 ``` GET /proxy.flv?url= ``` 返回 `video/x-flv` 实时流,可用 flv.js / mpegts.js 播放。 ### fMP4 代理 ``` GET /proxy.mp4?url= ``` 返回 `video/mp4`(fragmented MP4)实时流,可用 MSE(Media Source Extensions)播放。 ### 状态监控 ``` GET /status ``` 返回当前活跃会话信息: ```json { "activeSessions": 2, "sessions": [ { "url": "http://...", "format": "Flv", "clients": 3 }, { "url": "http://...", "format": "Fmp4", "clients": 1 } ] } ``` ### 使用示例 ``` /proxy.flv?url=http%3A%2F%2F183.131.85.2%3A9986%2F%25E6%25B5%2599F57201 /proxy.mp4?url=http%3A%2F%2F183.131.85.2%3A9986%2F%25E6%25B5%2599F57201 ``` ## 播放测试 项目包含 `test/1.htm` 测试页面,基于 mpegts.js 实现: - 支持配置下游地址、车牌号、逻辑通道等参数 - 自动构建 JT1078 标准格式 URL(`车牌号.车牌颜色.逻辑通道号.音视频标志.时效口令`) - 支持 FLV / fMP4 格式切换 - 网络断开自动重连 - 零缓存实时流优化配置 ## 工作原理 1. 客户端请求 `/proxy.flv?url=xxx` 或 `/proxy.mp4?url=xxx` 2. 服务端拉取 JT1078 源流,解析 RTP 包,重组 H.264 帧 3. 从首个 I 帧开始写入 FFmpeg stdin 4. FFmpeg 将 H.264 裸流转封装为 FLV / fMP4 输出到 stdout 5. 服务端读取 FFmpeg 输出并广播到所有客户端 6. 后加入的客户端自动补发缓存的头部数据 7. 所有客户端断开后自动释放源流和 FFmpeg 进程 ## 仓库 - Gitee: https://gitee.com/spinach720/jt1078.-video-proxy ## License MIT