ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

go2rtc MPEG 模块实战:MPEG-TS / ADTS 流媒体输出与推流接入的 HTTP API 指南

go2rtc MPEG 模块实战:MPEG-TS / ADTS 流媒体输出与推流接入的 HTTP API 指南 go2rtc MPEG 模块实战MPEG-TS / ADTS 流媒体输出与推流接入的 HTTP API 指南【免费下载链接】go2rtcUltimate camera streaming application项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc本指南以 go2rtc 仓库的 internal/mpeg/README.md 为骨架系统讲解该模块通过 HTTP API 提供的三大能力以mpegts格式输出视频流、以adts格式输出 AAC 音频流、以及以mpegts格式向 go2rtc 推流接入。读完本文你将掌握api/stream.ts与api/stream.aac两个端点的完整用法包括 GET 拉流与 POST 推流的参数语义、Content-Type 约定、底层封装/解封装原理并能将 go2rtc 无缝接入 ffmpeg、ffplay 等标准工具链。模块定位与三大能力MPEG 模块位于 internal/mpeg/mpeg.go它本身不做编解码而是把 go2rtc 内部的实时流媒体管道pkg/core的 Producer/Consumer 体系与标准 HTTP 协议桥接起来。模块入口Init()注册了两个 HTTP 端点func Init() { api.HandleFunc(api/stream.ts, apiHandle) api.HandleFunc(api/stream.aac, apiStreamAAC) }对应 internal/api/README.md 中描述的 HTTP API 体系默认监听http://localhost:1984/。两个端点共提供三种能力能力端点与方法方向传输格式MPEG-TS 流输出GET /api/stream.ts?srcNAME服务端 → 客户端mpegtsvideo/mp2tADTS 流输出GET /api/stream.aac?srcNAME服务端 → 客户端adtsaudio/aacMPEG-TS 推流接入POST /api/stream.ts?dstNAME客户端 → 服务端mpegts解封装为内部 RTP 管道其中api/stream.ts是双向端点同一 URL 通过 HTTP 方法区分读写——GET 表示把已有流媒体源src封装成 MPEG-TS 推送给调用方POST 表示把请求体中的 MPEG-TS 数据解封装后注入目标流dst源码见apiHandle中对r.Method ! POST的分支判断。快速上手三个标准命令关联文档给出了三条可直接运行的核心命令这是本模块最实用的操作入口。前提是 go2rtc 已启动且配置了名为camera1的流例如在配置文件中定义streams: camera1: rtsp://...。1. 用 ffplay 播放 MPEG-TS 流ffplay http://localhost:1984/api/stream.ts?srccamera1ffplay直接请求流地址即可播放。MPEG-TSMPEG Transport Stream是广播级标准的容器格式几乎所有播放器、流媒体服务器都原生支持适合做跨系统、跨平台的实时预览或二次转发。2. 用 ffplay 播放 ADTS 音频流ffplay http://localhost:1984/api/stream.aac?srccamera1当只需要音频且源流包含 AAC 音频轨道时可以直接拉取 ADTS 封装的 AAC 裸流。ADTSAudio Data Transport Stream是在 AAC 裸数据前附加 7 字节帧头的格式广泛被浏览器、播放器和音频处理工具接受。3. 用 ffmpeg 向 go2rtc 推流流式接入ffmpeg -re -i BigBuckBunny.mp4 -c copy -f mpegts http://localhost:1984/api/stream.ts?dstcamera1这是推流方向ffmpeg 以真实播放速率-re读取本地视频文件不做转码-c copy直接以mpegts封装后 POST 到api/stream.ts?dstcamera1。此时camera1会成为 go2rtc 内部的一个实时流其他客户端可再通过?srccamera1拉取从而实现推流 → 中转 → 分发的一体化流程。MPEG-TS 输出GET /api/stream.ts?srcNAME请求语义与响应查询参数src指定要输出的流名称对应 go2rtc 配置文件中streams下的某个流或运行期动态创建的流。响应头Content-Type: video/mp2t。响应体从请求时刻开始的 MPEG-TS 实时流先输出 PAT/PMT 表头再持续输出 PES 负载。源码实现解析输出逻辑对应 internal/mpeg/mpeg.go 的outputMpegTS函数调用链如下src : r.URL.Query().Get(src) stream : streams.Get(src) // 1. 按名字取内部流 cons : mpegts.NewConsumer() // 2. 创建 MPEG-TS 封装消费端 cons.WithRequest(r) stream.AddConsumer(cons) // 3. 挂载到流上开始接收音视频包 w.Header().Add(Content-Type, video/mp2t) _, _ cons.WriteTo(w) // 4. 先把 PAT/PMT 表头发给客户端 stream.RemoveConsumer(cons) // 5. 连接断开后卸载核心封装逻辑在 pkg/mpegts/consumer.go 的Consumer支持的编码视频H264、H265音频AAC见NewConsumer中声明的 Medias。视频轨道如果源是 RTP 管道如 RTSP 拉流走h264.RTPDepay/h265.RTPDepay先做 RTP 解包如果源是裸 AVCC 数据走h264.RepairAVCC补全 AVCC 头随后统一转成 Annex-B 送入 muxer对应 pkg/mpegts/muxer.go 中GetPayload里的annexb.DecodeAVCCWithAUD。音频轨道AAC 数据先被转为 ADTSRTP 源走aac.RTPToADTS裸数据走aac.EncodeToADTS同时把音频时间戳从编码器自身的时钟率换算到 MPEG-TS 固定的 90000 Hz见代码中dt : 90000 / float64(track.Codec.ClockRate)的注释说明。MPEG-TS 封装细节封装器 pkg/mpegts/muxer.go 严格按 MPEG-TS 标准生成 188 字节传输包PID 规划PAT 固定为 PID0PMT 固定为 PID0x10004096节目流 PES 从 PID0x100256起按轨道递增。StreamIDH264/H265 视频使用0xE0video streamAAC/PCMA 音频使用0xC0audio stream。表结构GetHeader()先写 PATProgram Association Table登记 PMT 的 PID再写 PMTProgram Map Table登记每个节目的流类型与 PID随后GetPayload将每个 PES 打散成多个 188 字节的 TS 包并在每个包的头部写入连续性计数器continuity counter与 PUSI 标志位。时间戳PTS 以 90000 Hz 固定时钟写入见WriteTime与常量ClockRate 90000。这些实现与 pkg/mpegts/README.md 中记录的 FFmpeg 生成参数一一对应PMTID4096、H264 PESID256、StreamType27、StreamID224 等说明该模块生成的 TS 流与 FFmpeg 生态完全兼容可被 ffplay、VLC、ffmpeg 等直接消费。ADTS 输出GET /api/stream.aac?srcNAME请求语义与响应查询参数src指定源流名称。响应头Content-Type: audio/aac。响应体AAC 裸流带 ADTS 帧头的字节流。该端点只服务于音频场景。若源流没有 AAC 音频轨道AddConsumer阶段将因找不到匹配轨道而返回错误HTTP 响应为500。源码实现解析apiStreamAAC见 internal/mpeg/mpeg.go与 MPEG-TS 输出结构几乎相同只是消费端换成了 pkg/aac/consumer.go 的ConsumerFormatName为adts仅支持 AACNewConsumer只声明一个KindAudio/CodecAAC的媒体轨道。ADTS 封装RTP 源的 AAC 经aac.RTPToADTS拆解 AUAccess Unit并逐帧补上 ADTS 头裸数据则经aac.EncodeToADTS直接加头。ADTS 帧头由 pkg/aac/adts.go 实现标准 7 字节头包含 12 bit syncword、MPEG-4 Audio Object Type、采样率索引、声道数以及 13 bit 的帧长度字段WriteADTSSize/ReadADTSSize。adts.go 同时提供CodecToADTS可从 codec 的FmtpLine如config1408还原出 ADTS 头保证配置信息 → 帧头的自洽。MPEG-TS 推流接入POST /api/stream.ts?dstNAME请求语义查询参数dst指定注入的目标流名称。与src不同dst指示的是数据流向哪里——目标流必须已存在同样返回stream not found的 404 响应见api.StreamNotFound常量。请求体MPEG-TS 字节流ffmpeg-f mpegts输出即为该格式。持续连接连接保持期间持续向流中注入数据断开后自动卸载生产者。源码实现解析inputMpegTSinternal/mpeg/mpeg.go的调用链dst : r.URL.Query().Get(dst) stream : streams.Get(dst) // 1. 按名字取目标流 client, err : mpegts.Open(r.Body) // 2. 用请求体创建解封装生产者含 probe stream.AddProducer(client) // 3. 注入目标流 defer stream.RemoveProducer(client) // 4. 断开后卸载 if err client.Start(); err ! nil { ... }解封装由 pkg/mpegts/producer.go 与 pkg/mpegts/demuxer.go 协作完成probe 探测阶段probe()先等待携带元数据的 PAT/PMT 包解析出流类型清单H2640x1B、H2650x24、AAC0x0F、以及私有扩展的 OPUS0xEB、Tapo 设备的 PCMA0x90再等待各轨道首个数据包从而动态构建Medias列表探测受core.ProbeTimeout超时保护。解封装循环Start()通过Demuxer.ReadPacket逐包读取将 188 字节 TS 包重组为 PES再按流类型还原为内部 RTP 包视频走annexb.EncodeToAVCC转回 AVCC 格式音频走aac.ADTStoRTP拆掉 ADTS 头还原 AU 列表。时间戳换算TS 的 PTS/DTS 固定为 90000 Hz进入内部管道前经TimestampToRTP按目标编码器的时钟率换算见 pkg/mpegts/producer.go 的TimestampToRTPAAC 一般为 44100/48000 Hz。PTS/DTS 与各容器时间戳体系的对应关系可参考 pkg/mpegts/README.md 顶部的 PTS/DTS/CTS 说明。推流兼容性demuxer 对私有流类型做了宽容处理PMT 中StreamType0x06Private且 ES 描述以opusInfo开头的流会被识别为 OPUS见readPMTTapo 摄像头使用的0x90/0x91PCMA/PCMU也能解析。因此该端点不仅能接收 ffmpeg 推流也能作为 Tapo 等厂商摄像头的 MPEG-TS 接入入口Tapo 的参数差异记录在 pkg/mpegts/README.md如 PMTID18、H264 PESID68、AAC StreamType144。结合 API 配置落地到生产环境本模块的端点都注册在 go2rtc 的 HTTP API 之上因此受 internal/api/api.go 与 internal/api/README.md 中api配置段约束api: listen: :1984 # 默认 :1984HTTP API 监听地址 表示禁用 username: admin # 默认 WebUI 的 Basic auth password: pass # 默认 WebUI 的 Basic auth base_path: /rtc # 默认 API 前缀如 /api 变为 /rtc/api static_dir: www # 默认 自定义静态界面目录 unix_listen: /tmp/go2rtc.sock # 默认 Unix socket 监听几个与本模块直接相关的要点base_path设置后端点路径会整体前移api/stream.ts→/rtc/api/stream.ts适合把 go2rtc 挂到主站 Web 服务的子路径下。注册逻辑见api.HandleFunc中pattern basePath / pattern。鉴权与安全go2rtc 默认对 localhost/Unix socket 请求跳过 Basic authlocal_auth: true可强制本机也校验。若将1984端口暴露到公网必须自行配置鉴权否则摄像头流可能被未授权访问。网络地址默认:1984监听所有网卡仅本机使用时建议改为127.0.0.1:1984。Unix socket可通过unix_listen提供本地 API适合与同机进程通过 socket 交互例如 ffmpeg 走/tmp/go2rtc.sock推流。与其他模块的协同与典型使用场景从源码结构看本模块的 Consumer/Producer 与 internal/streams 模块streams.Get、AddConsumer、AddProducer深度协作因此 MPEG-TS/ADTS 端点可与任意流源RTSP、WebRTC、HLS、文件等自由组合常见场景包括统一输出网关把 RTSP/WebRTC 等流统一以 MPEG-TS 形式对外提供供老旧播放器或第三方平台拉流。音频单独抽取需要纯音频如语音对讲、音频分析时用stream.aac直接取 AAC/ADTS 流。推流中转ffmpeg 把摄像头或文件推入?dstgo2rtc 再按需向多个?src客户端分发实现单路接入、多路复用。对接 ffmpeg 生态TS 输出的 PID/StreamType 与 FFmpeg 完全对齐见 pkg/mpegts/README.md可无缝衔接 ffmpeg 的后续转封装、录制或再转推。总结go2rtc 的 MPEG 模块以两个 HTTP 端点为载体用最少的命令完成了MPEG-TS 输出、ADTS 音频输出、MPEG-TS 推流接入三种实用的流媒体桥接能力。其实现既忠实于 MPEG-TS/ADTS 标准188 字节 TS 包、PAT/PMT、PES、90000 Hz 时间戳、7 字节 ADTS 头又对 Tapo、OPUS 等私有/扩展流类型做了兼容处理。无论是快速预览ffplay 一条命令、纯音频抽取还是用 ffmpeg 构建推流链路本文给出的命令与源码级原理解析均可直接落地使用。【免费下载链接】go2rtcUltimate camera streaming application项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表