本文主要讲解 客户端 通过 RTSP 协议 从服务器拉流的 整个交互过程,以及这个过程中的一些交互,原理。实际上这个在通信角度来看,播放不是拉流,而是服务器向客户端推流。服务器源源不断地把音视频数据往客户端推送。
服务器采用 ZLMediaKits
,服务器的搭建请看 ZL的官方文档。
拉流客户端是 ffplay
,推流命令如下:
ffplay -fflags nobuffer -f rtsp -i rtsp://192.168.0.123/live/test
上面我用了 一个命令,指定编码格式,然后通过 rtsp 协议 播放一个动画片
下面就用 wireshark
来抓包看下整个通信过程,过滤规则如下:
host 192.168.0.123
为了方便读者对照,这里提供一下 pcapng
包文件,可以下载 用 wireshark
打开,就跟本文的一致了。下载地址:百度网盘,提取码:oz9p
在UDP 的方式下,无论是拉流还是推流,每个流都占两个端口,一个传输 RTP(流数据),一个传输 RTCP (统计)。
实际上 ffplay
拉流的整个通信流程,跟 之前的《RTSP协议-UDP推流》是非常类似的,只是有些东西是反着来的,我讲一下重点。
重点一:ffmpeg
推流,SDP(流的编码信息等)是客户端发给服务器的,ffplay
拉流,这个 SDP 是 服务器发给 客户端的,告诉客户端有多少个流,编码信息等。请看下面截图:
重点二:上图有两个 setup 跟 reply,这个跟推流一样,就是协商传输端口的,截图如下:
重点三:第一个 RTP,RTCP 包,还是由客户端向服务器发送,所以服务器需要先 listen 监听这些新端口,截图如下:
RTSP UDP 拉流播放分析完毕。
相关阅读:
由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。QQ:2338195090。