SkeyeVSS中国标GB28181、流媒体源RTMP/RTSP/HTTP/ONVIF、RTMP推流等协议视频流实时播放流程详解
本文基于core/app/sev/vss/internal/logic/http/video/stream_play.go的源码从参数与设备查询到按接入协议分支、触发 MS 拉流或 GB28181 Invite再到返回StreamResp与异步处理。源码地址 点击直达一、接口入口与请求体项目说明注册internal/handler/http/routers.gorouter.POST(video.VStreamPlayLogic.Path(), ...)Path/video/stream挂在 Gin 的/api组下完整路径为POST /api/video/streamLogicStreamPlayLogic.DO(req types.VideoStreamReq)VideoStreamReqinternal/types/types.go主要字段字段含义deviceUniqueId/channelUniqueId必填用于拉取设备通道及绑定 MS。startAt/endAt毫秒时间戳均大于 0时视为回放playType playback。download是否下载场景透传给 GB Invite。speed回放倍率等透传 Invite。https影响 MS 节点选择时是否按 HTTPS 能力投票ms.New(...).WithHttps(req.Https)。流名称覆盖若 Handler 注入了*gin.Context且 Query 里存在streamName则用其覆盖stream.New().Produce(...)的默认流名称便于与已有会话对齐。二、主流程总览否是1 流媒体源2 RTMP推流3 ONVIF4 GB281815 EHOMEother是否校验 device/channelRPC DeviceChannel解析 playType 直播或回放VoteNode 选 MS Produce streamName组装 StreamResp 基础字段MS 是否默认节点 IsDef?GetMSConf 取监听端口PlayAddress 用已有节点信息PlayAddress 多协议播放地址回放时间格式化写入 StartAt/EndAtAccessProtocol设备 StreamUrl start_relay_pull不设 streamUrl 不拉流通道 StreamUrl start_relay_pull回放先 StopMultiMSStream Invite返回未支持未匹配协议streamUrl 非空?CDN 可选 relay_pushStartRelyPull MS异步 saveChannelSnapshotInvite 后直接返回 异步处理三、步骤说明3.1 参数与设备通道若deviceUniqueId或channelUniqueId为空直接返回参数错误。RpcClients.Device.DeviceChannel拉取DeviceChannel设备或通道为空则设备获取失败。3.2 直播 / 回放与 MS 超时参数默认playType play直播autoStopPullAfterNoOutMs 60000。当req.EndAt 0 req.StartAt 0playType playbackautoStopPullAfterNoOutMs 10000回放更快放弃无输出拉流避免长时间占资源。3.3 流名称与 MS 节点streamName stream.New().Produce(device, channel, playType)直播stream_{deviceUniqueId}_{channelUniqueId}_play。回放带全局递增PlaybackCount后缀保证多路回放流名称隔离见core/common/stream/main.go。ms.New(ctx, svcCtx).WithHttps(req.Https).VoteNode(device.MSIds)选择媒体节点nil则返回「未设置流媒体源」。3.4 响应体StreamResp与播放地址Addresses填充ctypes.StreamResp接入协议文案、MS 信息、设备/通道 ID、流名称、通道在线状态、StreamUrl占位等通道/设备展示名优先Label否则Name。MediaServerNode.IsDef分支是否「默认/简略」节点非默认再调GetMSConf(http://{msAddress})取HTTP/HTTPS/RTSP/RTMP等端口拼stream.PlayAddress(StreamPlayProxyPath, MSVoteNodeResp端口, streamName)。默认直接用已有msNode调PlayAddress。回放时间startAt/endAt 0 时格式化为字符串写入data.StartAt/data.EndAt供调用端展示。PlayAddress在core/common/stream/main.go中根据代理配置、MS 端口与流名称生成多协议播放 URL 集合HTTP-FLV、WebSocket、HLS 等——具体字段见ctypes.PlayAddress。3.5 按AccessProtocol分支核心❗❗❗常量来自repositories/models/devices值含义stream_play行为1流媒体源streamUrl device.StreamUrl传输层MediaProtocolMode 0时rtspMode 1UDP否则 TCP。后续StartRelyPull。2RTMP 推流不配streamUrl注释说明由设备推流触发on_pub_start不调用start_relay_pull。3ONVIFstreamUrl channel.StreamUrl同样按MediaProtocolMode决定 RTSP UDP/TCP再StartRelyPull。4GB28181回放先StopMultiMSStream停掉与当前流名称前缀相关、带playback的旧流睡眠 1s降低抢流冲突再gbs.InviteLogic.Invite(...)下发SIP Invite含起止时间、Download、Speed、流名称等。成功则go saveChannelSnapshot并直接返回Data不再走本文件末尾的StartRelyPull。default其它未匹配的协议类型。传输协议transportProtocol : res.Data.Device.TransportProtocol()用于 RTSPTCP/UDP与后续 MS 参数一致。3.6 MSstart_relay_pull当streamUrl ! 时调用POST http://{msAddress}/api/ctrl/start_relay_pull参数包括stream_name、url、auto_stop_pull_after_no_out_ms、pull_timeout_ms、rtsp_mode等见internal/pkg/ms/api.goStartRelyPull。失败则整体HTTP 错误响应。3.7 CDN 转发若通道开启 CDNCdnState 1且CdnUrl以rtmp开头在返回前go StartRelayPush向 MS 启relay_push把当前流推到 CDN错误仅打日志不阻塞主流程返回。3.8 异步通道快照saveChannelSnapshotgo saveChannelSnapshot(streamName, res.Data)GB 分支在 Invite 成功后也会调用。用ms.Snapshot(device, streamName)取一帧经临时.raw/.jpg文件ff.FFMpeg.SnapFile转码再Mv到SaveVideoSnapshotDir下由stream.Snapshot(dir, deviceId, channelId)规则命名的路径。全程defer recover与日志失败不影响播放接口成功返回。四、与gbs.Invite的关系GB28181 路径是由Invite走完整链路Catalog 在线、StreamInfo、GetStreamGroup、端口范围、防重复 Invite、SipSendVideoLiveInvite等详见video_live_invite.go。stream_play传入的InviteParams包括设备/通道业务 ID、PlayType、格式化后的起止时间字符串、Download、Speed、StreamName、以及已查好的DeviceItem/ChannelItemCaller标记为http 请求stream play invite便于日志区分来源。五、播放流程总结统一出口平台无论网页还是内部服务只要设备通道即可拿同一套StreamRespMS 节点、流名称、多协议地址客户端按能力选播。协议差异分支switch流媒体源/ONVIF 走拉流 URL MSRTMP 推流走设备主动 pubGB28181 走信令 Invite避免一种模式套所有协议。直播与回放用时间区间切换playType与流名称生成策略回放带计数后缀并差异化autoStopPullAfterNoOutMs。MS 抽象拉流统一StartRelyPullGB仍由 RTP/SIP 与 MS API 协作此接口只负责触发 Invite。快照与播放解耦快照慢或失败不影响拉流流程。六、注意点说明GB 回放 StopMultiMSStream按流名称前缀 playback模糊停流时需要注意不同流流名称是否相同。RTMP 2本请求可能只返回地址信息需要注意MSon_pub_start通知是否有达到。Invite 与重复请求Invite内部有InviteRequestState与 MS 上Pub状态判断stream_play高频重入需要注意防抖防抖可以参考core/pkg/dt。流图片快照临时文件与 FFmpeg 依赖配置FFMpeg、磁盘SaveVideoSnapshotDir未设置会导致快照失败。七、相关源码索引说明路径流播放 Logiccore/app/sev/vss/internal/logic/http/video/stream_play.goGB Invitecore/app/sev/vss/internal/logic/http/gbs/video_live_invite.goMSstart_relay_pull/start_relay_pushcore/app/sev/vss/internal/pkg/ms/api.go流名称与PlayAddresscore/common/stream/main.go响应core/common/types/stream.goStreamResp、PlayAddressHTTP 路由core/app/sev/vss/internal/handler/http/routers.go
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2449848.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!