1 Star 0 Fork 2

likangGit/VRVehicle

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
流媒体协议草稿.txt 7.03 KB
一键复制 编辑 原始数据 按行查看 历史
likangGit 提交于 2023-03-13 13:49 . update readme
流媒体协议复用 websocket 信道,会话使用 Text 数据帧, rtp 包使用 Binary 数据帧。
用户:viewer 设备:device 用户/设备:client 服务器:server
device login 成功后,立刻进行与 rtsp 协议类似的推流准备工作 announce, setup, 但 record 后(可以)不立即开始发送音视频流,而是(可以)等接收到 server 的发来 resume 指令后再开始。
device 收到 server 发来的 sdp 指令后,向 server 发起 setup, play 请求拉取 viewer 发出的音频流。
viewer connect device 成功后,向 server 发起请求获取对应 device 的 sdp,然后发起 setup*n, play 请求拉取 device 发出的音视频流。
接着(可选)与 device 类似, viewer 向 server 发起 announce, setup, record 请求准备音频流的推流工作,等待 server 的 resume 指令(由 viewer 选择是否进行此步骤,使 device 端播放 viewer 端采集的声音)。
server 在回复 device/viewer 一方的 play 请求后,立即向对方发送 resume 指令,通知其开始推流。 server 在收到 viewer 的 record 后,向 device 发送 viewer 的 sdp 。
一个设备会话 string_sesid_d 允许有多个音视频观看者和一个设备运动控制者。一个观看会话 string_sesid_v 只允许对应的设备进行拉流。
device - server
announce
请求:
device -> server
{
"type": "announce",
"session": string_sesid_d, // register 返回的会话 id
"cseq": 1, // 请求编号 递增
"sdp": string_sdp
}
应答:
server -> viewer
{
"type": "announce",
"status": 200, // 状态码 跟rtsp一样
"cseq": 1
}
setup
请求:
device -> server
{
"type": "setup_record",
"session": string_sesid_d,
"cseq": 2,
"control": "trackID=1", // 与sdp一致
"transport": "RTP/AVP/TCP;unicast;interleaved=0-1" // 只用tcp
}
应答:
server -> device
{
"type": "setup_record",
"session": string_sesid_d,
"status": 200,
"cseq": 2,
"transport": "RTP/AVP/TCP;unicast;interleaved=0-1"
}
请求:
device -> server
{
"type": "setup_record",
"session": string_sesid_d,
"cseq": 3,
"control": "trackID=2",
"transport": "RTP/AVP/TCP;unicast;interleaved=2-3" // 只用tcp
}
应答:
server -> device
{
"type": "setup_record",
"session": string_sesid_d,
"status": 200,
"cseq" 3,
"transport": "RTP/AVP/TCP;unicast;interleaved=2-3"
}
record
请求:
device -> server
{
"type": "record",
"session": string_sesid_d,
"cseq": 4
}
应答:
server -> device
{
"type": "record",
"session": string_sesid_d,
"status": 200,
"start": "delayed", // delayed/immediate 可选
"cseq": 4
}
----------------------------------------
viewer - server
describe
请求:
viewer -> server
{
"type": "describe",
"url": string_sesid_d, // 要观看的vehicle的session,相当于rtsp的url
"cseq": 1, // 请求编号 递增
}
应答:
server -> viewer
{
"type": "describe",
"status": 200, // 状态码 跟rtsp一样
"cseq": 1, // 该响应对应的请求编号
"sdp": string_sdp // sdp信息
}
setup
请求:
viewer -> server
{
"type": "setup",
"url": string_sesid_d,
"cseq": 2,
"control": "trackID=1"
"transport": "RTP/AVP/TCP;unicast;interleaved=0-1" // 只用tcp
}
应答:
server -> viewer
{
"type": "setup",
"status": 200,
"cseq": 2,
"session": "06720925;timeout=60", // 流媒体seesion,需要与string_sesid_d进行区分,因为允许多用户观看
"transport": "RTP/AVP/TCP;unicast;interleaved=0-1"
}
setup2
请求:
viewer -> server
{
"type": "setup",
"url": string_sesid_d, // 要观看的vehicle的session,相当于rtsp的url
"cseq": 3,
"control": "trackID=2",
"transport": "RTP/AVP/TCP;unicast;interleaved=2-3", // 现阶段只用tcp,后期可能考虑打洞
"session": "06720925" // 用字符串
}
应答:
server -> viewer
{
"type": "setup",
"status": 200,
"cseq": 3,
"session": "06720925;timeout=60",
"transport": "RTP/AVP/TCP;unicast;interleaved=2-3"
}
play
请求:
viewer -> server
{
"type": "play",
"url": string_sesid_d, // 要观看的vehicle的session,相当于rtsp的url
"cseq": 4,
"session": "06720925",
"range": "npt=0.000-"
}
应答:
server -> viewer
{
"type": "play",
"status": 200,
"cseq": 4,
"session": "06720925;timeout=60"
}
announce
请求:
viewer -> server
{
"type": "announce",
"cseq": 5, // 请求编号 递增
"sdp": string_sdp
}
应答:
server -> viewer
{
"type": "announce",
"status": 200, // 状态码 跟rtsp一样
"session": string_sesid_v,
"cseq": 5
}
setup
请求:
viewer -> server
{
"type": "setup_record",
"session": string_sesid_v,
"cseq": 6,
"control": "trackID=1", // 与sdp一致
"transport": "RTP/AVP/TCP;unicast;interleaved=0-1" // 只用tcp
}
应答:
server -> viewer
{
"type": "setup_record",
"session": string_sesid_v,
"status": 200,
"cseq": 6,
"transport": "RTP/AVP/TCP;unicast;interleaved=0-1"
}
record
请求:
{
"type": "record",
"session": string_sesid_v,
"cseq": 7
}
应答:
{
"type": "record",
"session": string_sesid_v,
"status": 200,
"start": "delayed", // delayed/immediate 可选
"cseq" 7
}
------------------------
resume
通知:
server -> client
{
"type": "resume",
"session": string_sesid_c,
}
报告:
client -> server
{
"type": "resume",
"status": "playing", // 报告当前状态之后开始发rtp流
"session": string_sesid_c,
}
pause
通知:
server -> client
{
"type": "pause",
"session": string_sesid_c,
}
报告:
client -> server
{
"type": "pause",
"status": "paused", // 报告当前状态之后停止发rtp流
"session": string_sesid_c,
}
stop
viewer 要求 device 停止播放音频时, server 向 device 发出此通知, device 收到通知后,停止播放。
通知:
server -> device
{
"type": "stop",
"session": string_sesid, // 该id为流媒体session
}
报告:
device -> server
{
"type": "stop",
"session": string_sesid,
"status": "stopped"
}
sdp
通知:
server -> client
{
"type": "sdp",
[optional]"session": string_sesid_c_you, // 该 session_id 为流媒体 session_id ,已存在的 session 的 sdp 发生变化时服务器要携带该参数,第一次通知设备拉流时不携带
"url": string_sesid_dest,
"sdp": string_sdp // sdp信息
}
报告:
{
"type": "sdp",
[optional]"session": string_sesid_c_you,
"status": "restarting", // 报告 starting/restarting 之后开始setup等拉流流程
}
sdp 样例
v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 2176187384832
t=0 0
a=tool:libavformat 58.17.101
m=video 0 RTP/AVP 96
b=AS:1024
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QIFazZQeCP6hAAAAMAEAAAAwMg8WLZYA==,aOvssiw=; profile-level-id=640815
a=control:streamid=0
m=audio 0 RTP/AVP 97
b=AS:128
a=rtpmap:97 MPEG4-GENERIC/48000/2
a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=119056E500
a=control:streamid=1
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/likangGit/VRVehicle.git
[email protected]:likangGit/VRVehicle.git
likangGit
VRVehicle
VRVehicle
master

搜索帮助