现在有一个需求,需要在外网通过rtsp协议访问内网。但是,由于内网没有固定的IP地址,所以,rtsp协议根本进不来啊。
这里我想出一个办法,如下
编写两个服务,第一个跑在内网的PC机上面,一个跑在云服务器上面。
第一步:腾讯云的服务先监听一个端口,比如8888
第二步:PC端的服务,与腾讯云的8888端口建立一个tcp连接,是一个长连接
第三步:腾讯云服务器如果请求IPC的摄像机,先通过私有协议发送一个请求给PC机
第四步:PC机再与云服务器的服务流媒体监听端口建立tcp连接,并发送命令告诉是哪个IPC
第五步:云服务器发送请求,请求视频流,
第六步:开始接收视频流,进行后续的逻辑处理。
******************************************信令交互接口定义********************
注册接口:PC机与腾讯云注册,并上报设备ID
<request>
<cmd>Register</cmd>
<paramter>
<item>
<camid>1</camid>
</item>
<item>
<camid>2</camid>
</item>
</paramter>
</request>
应答:加上心跳周期单位为秒
<response>
<cmd>Register</cmd>
<paramter>
<code>0</code>
<text>success</text>
<keepalive>20</keepalive>
</paramter>
</response>
心跳:
<request>
<cmd>KeepAlive</cmd>
<paramter>
<keepalive>20</keepalive>
</paramter>
</request>
<response>
<cmd>KeepAlive</cmd>
<paramter>
<code>0</code>
<text>success</text>
<keepalive>20</keepalive>
</paramter>
</response>
请求IPC推流:
<request>
<cmd>PlayIpc</cmd>
<paramter>
<camid>1</camid>
</paramter>
</request>
应答:
<response>
<cmd>PlayIpc</cmd>
<paramter>
<code>0</code>
<text>success</text>
</paramter>
</response>
*************************流媒体端口命令************
建立tcp连接之后,PC机发送连接信息
<request>
<cmd>ConnectIpc</cmd>
<paramter>
<camid>1</camid>
</paramter>
</request>
<response>
<cmd>ConnectIpc</cmd>
<paramter>
<code>0</code>
<text>success</text>
</paramter>
</response>
腾讯云服务器处理完之后,向PC机发送开始请求流的命令
<request>
<cmd>StartIpc</cmd>
<paramter>
<camid>1</camid>
</paramter>
</request>
<response>
<cmd>StartIpc</cmd>
<paramter>
<code>0</code>
<text>success</text>
</paramter>
</response>
命令完之后,后面就是开始接收rtp数据了。。
*****************************上述就是信令的交互流程************************
下面对交互格式定义:
开头以# 开始,1表示请求信令,2表示应答信令,3表示流媒体(H264)4表示流媒体(H265),长度为4字节的网络字节序,后面是信令或者流媒体数据,媒体数据的话,媒体数据的话,还需要增加4个字节的时间戳,在每帧数据的开头。
**************至此,完成了该服务的定义工作**************后续开始编码尝试效果了。