RTSP作为客户端 推流 拉流的过程分析

之前写过一个 rtsp server 作为服务端的简单demo

这次分析下 rtsp作为客户端 推流和拉流时候的过

A.作为客户端拉流 TCP方式

1.Client发送OPTIONS方法 Server回应告诉支持的方法

2.Client发送DESCRIPE方法 这里是从海康摄像机拉流并且设置了用户名密码 Server回复未认证

3.客户端通过服务器回复的realm nonce 计算response 重新带认证信息的DESCRIBE报文

服务器回复

4.客户端发送SETUP报文

5.客户端发送 PLAY报文

RTSP交互的过程如上

实际测试中发现 几点需要注意:

a.需要用户密码的 大多数是在发送DESCRIBE方法后返回401 有的是第一次发送OPTIONS方法就会返回401

b.服务端包含视频流 音频流 必须单独发送一次SETUP视频流 再发送一次SETUP音频流 我本来想只要视频流 不要音频流 但是实测发现不行 必须 视频流 音频流都SETUP

c.最后发送play报文之后 server回复报文的时候大多数时候 会将rtp报文连带一起发过来

需要做切割

需要用户名密码时候的认证信息计算 大多数都是走DIGEST方式 仅仅介绍此种方式

首先计算loginhash 计算方法为 MD5(username:realm:password) 之后转换为字符串

然后针对method和uri计算method_hash MD5(method:uri)

需要注意的是:SETUP时候的uri 和其他方法的uri是不一样的

最后计算response = MD5(MD5(loginhash:nonce):method_hash) 如下图

整个过程中 loginhash只需要计算一次既可 别的 每次都要计算

由于是tcp方式 和RTSP RTP RTCP 共用一个端口 后面 解析数据包即可

不管是rtp包还是rtcp包 前面有一个四个字节的头

首字节固定0x24 后面一个字节channel 区分 音视频 rtp rtcp 一般偶数通道标识rtp包 奇数标识rtcp包 后面两个字节表示包长

0x24 channel datalen

但是实际测试中发现 部分rtsp server tcp方式发送的时候 rtcp包没有这四个字节 找0x24头的时候找不到 ffmpeg会将错误原因设置为End of file 如下图 80 C8 00 06 是RTCP的报文

在我自己的测试程序中 可以直接跳过这个包 直接继续接受数据处理 即可 发现也没问题 采用ffmpeg的话 就只能更改ffmpeg源码了 会比较麻烦

以上是作为客户端拉流的时候

2.RTSP作为客户端推流 这里 采用ffmpeg推流rtsp 默认UDP方式 server采用ZLMediakit 分析

客户端发送OPTIONS方法 服务端回复支持的方法 可以看到比一般的摄像头多了ANNOUNCE RECORD方法

客户端发送ANNOUNCE方法

客户端发送SETUP方法

客户端发送RECORD方法

相关推荐
我是koten10 小时前
【运维杂谈】K8s遇到Terminating的名称空间删除不了怎么办?(解决方案亲测有效)
linux·运维·服务器·云原生·kubernetes·k8s·名称空间
feng_you_ying_li18 小时前
linux之数据链路层
linux·网络·智能路由器
修己xj18 小时前
服务器无法解析域名?一次 DNS 配置缺失的排查与修复
运维
国科安芯20 小时前
人在回路中的总线:商业空间站环境控制与生命保障系统CANFD网络的可靠性与功能安全
网络·嵌入式硬件·安全·架构·php·抗辐射
爱吃奥利奥_wen21 小时前
SQL Server 基础语法详解:从建库建表到约束与增删改查
服务器·数据库·oracle
国科安芯21 小时前
算力上天之后的电与静:星上边缘计算载荷带外管理网络的低功耗调度与辐射容错
网络·人工智能·嵌入式硬件·安全·边缘计算·低轨卫星·商业航天
wdeok1 天前
Socket编程UDP-简单的聊天室
网络·网络协议·udp
xbzb1 天前
自定义 yum 软件源:Linux 上 createrepo,Windows 上纯 Python 也能造
linux·运维·windows·python·yum·createrepo
Android系统攻城狮1 天前
Linux FFmpeg深度解析之avio_open调用流程与实战(三十八)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
瑞克-桑切斯1 天前
ERP 企业生产管理系统部署手册
运维·docker·云原生·容器·eureka