From 16412d11cd1a21df873d01afe6263209e6c89a20 Mon Sep 17 00:00:00 2001 From: duiniuluantanqin <495810242@qq.com> Date: Tue, 6 May 2025 17:22:03 +0800 Subject: [PATCH 1/8] DOC: rtsp --- .../current/doc/rtsp.md | 133 ++++++++++++++++++ sidebars.json | 3 +- 2 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md b/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md new file mode 100644 index 00000000..d05a92a8 --- /dev/null +++ b/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md @@ -0,0 +1,133 @@ +--- +title: RTSP +sidebar_label: RTSP +hide_title: false +hide_table_of_contents: false +--- + +# RTSP + +RTSP是很古老的协议,已经有接近30年的历史。在安防行业,几乎每家公司都自己实现了一个RTSP服务器,但他们都不喜欢开源,还喜欢加很多私有的东西在里面。在市面上,你随便就能找到一个RTMP服务器,却很难找到一个RTSP服务器。 + +SRS最早在2.0版本就已经支持RTSP协议,但只有推流(ANNOUNCE → SETUP → RECORD),而没有拉流(DESCRIBE → SETUP → PLAY)。实际上,很多传统的C/S架构的客户端、解码器、嵌入式设备,以及最新的AI视觉检测等,首选播放协议仍然RTSP。 + +这个版本,复用了2.0的协议解析的部分代码,删除推流,新增拉流。同时,尽可能的复用了WebRTC模块,包括RTP打包,SDP解析,因为这些几乎是一样的。 + +## Usage + +首先,编译和启动SRS,请确认版本为`7.0.xxxx`: + +```bash +cd srs/trunk && ./configure && make -j16 +./objs/srs -c conf/rtsp.conf +``` +> 编译时必须开启`--rtc=on`(默认开启)。 + +然后,使用RTMP协议推流 + +```bash +ffmpeg -re -i doc/source.flv -c copy -f flv rtmp://localhost/live/livestream +``` + +最后,使用RTSP协议拉流,支持TCP和UDP两种方式 + +```bash +ffplay -rtsp_transport udp -i rtsp://localhost:8554/live/livestream +或者 +ffplay -rtsp_transport tcp -i rtsp://localhost:8554/live/livestream +``` + +## Config + +```bash +rtsp_server { + enabled on; + listen 8554; +} +``` +RTSP默认端口是`554`,但是某些系统需要`root`权限,所以这里改成了`8554`。 +同时因为复用了RTC模块,所以必须开启所有RTC相关的配置,如下: + +```bash +rtc_server { + enabled on; + listen 8000; + candidate $CANDIDATE; +} + +vhost __defaultVhost__ { + rtc { + enabled on; + rtmp_to_rtc on; + keep_bframe on; + } +} +``` + +由于RTC不支持B帧,所以`keep_bframe`默认为`off`,但如果不考虑RTC播放,可以将其设置为`on`,RTSP协议是支持B帧的。 + +## Test + +### 单元测试 + +```bash +./configure --utest=on & make utest -j16 +./objs/srs_utest +``` + +### 回归测试 + +需要先启动SRS +```bash +./objs/srs -c conf/rtsp.conf +``` + +然后执行 + +```bash +cd srs/trunk/3rdparty/srs-bench +go test ./srs -mod=vendor -v -count=1 -run=TestRtmpPublish_RtspPlay +``` + +### 黑盒测试 + +黑盒测试无需启动SRS + +```bash +go test ./blackbox -mod=vendor -v -count=1 -run=TestFast_RtmpPublish_RtspPlay_Basic +``` + +## RTP + +如果是UDP传输,RTP打包方式跟RTC完全相同,直接发送即可。 + +而TCP传输,每个RTP包前面有额外的4个字节,第1个字节是固定的`0x24`,后跟1个字节通道标识符,后跟2个字节的RTP包长度,参考`RFC2326`中的第10.12小节`Embedded (Interleaved) Binary Data`。 + +## 开放端口 + +开放端口目前只需要一个,比如`8554`,TCP传输模式会复用交互时的Socket链接。 + +对于UDP,情况有些复杂,客户端会开放2个端口分别用于接收RTP和RTCP,常规做法,服务端也绑定2个端口用于发送RTP和RTCP,而这会导致需要开放的端口数量剧增,这将挑战防火墙的底线。实际上,我们可以复用RTC的`8000`端口,用作发送端口,并接收RTCP请求。目前暂未实现,而是选择随机端口发送RTP包。 + +## 编码格式 + +对于音频编码格式,因为是基于RTC的Consumer模块,所以拿到的RTP包已经是转码后的`OPUS`格式。如需保持原有格式,需要额外的开发。 + +## GOP + +目前,播放RTSP流时会等待一段时间才出画面,是因为RTC模块没有实现缓存GOP功能,需要等待下一个关键帧的出现。 + +## 源码 + +RTSP协议解析部分,拷贝了原来3.0的代码,删除了SDP和RTP以及推流相关的一些代码,只保留关键的`SrsRtspRequest`和`SrsRtspResponse`用于处理请求和相应,并且只处理`OPTIONS`、`DESCRIBE`、`SETUP`、`PLAY`、`TEARDOWN`这5个方法。对于RTSP播放,这足够了。 + +业务部分,`SrsRtspConn`用于接收网络数据。同时,继承于`SrsRtcConnection`,是为了复用`RTC Consumer`,实际上,每一个RTSP播放者,等同于一个RTC播放者。真实业务处理下放到`SrsRtspSession`里面,包括生成SDP、发送RTP包,以及通用的Security、Hook、Stat。 + +## TODO + +目前的版本,只是实现了一个基本功能,其他比如音频编码、鉴权、重定向等,根据实际需要再做计划,或许就在不久的将来。 + + +## 参考文档 + +- [rfc2326-1998-rtsp.pdf](https://ossrs.net/lts/zh-cn/assets/files/rfc2326-1998-rtsp-12b5cccfcac4f911bfab96c8f57b0bf9.pdf) \ No newline at end of file diff --git a/sidebars.json b/sidebars.json index 39f0685c..cddb1e8b 100644 --- a/sidebars.json +++ b/sidebars.json @@ -39,7 +39,8 @@ "doc/webrtc", "doc/flv", "doc/srt", - "doc/gb28181" + "doc/gb28181", + "doc/rtsp" ] }, { From 9d6c1e24e1ce87eaba28d950b51a4a04c28be397 Mon Sep 17 00:00:00 2001 From: duiniuluantanqin <495810242@qq.com> Date: Wed, 7 May 2025 09:16:02 +0800 Subject: [PATCH 2/8] update --- .../current/doc/rtsp.md | 29 +++++++------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md b/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md index d05a92a8..29ac5519 100644 --- a/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md +++ b/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md @@ -18,7 +18,7 @@ SRS最早在2.0版本就已经支持RTSP协议,但只有推流(ANNOUNCE → 首先,编译和启动SRS,请确认版本为`7.0.xxxx`: ```bash -cd srs/trunk && ./configure && make -j16 +cd srs/trunk && ./configure && make ./objs/srs -c conf/rtsp.conf ``` > 编译时必须开启`--rtc=on`(默认开启)。 @@ -64,36 +64,29 @@ vhost __defaultVhost__ { } ``` -由于RTC不支持B帧,所以`keep_bframe`默认为`off`,但如果不考虑RTC播放,可以将其设置为`on`,RTSP协议是支持B帧的。 +RTC不支持B帧,但RTSP支持;如果需要使用RTSP播放B帧,开启`keep_bframe`即可,但此时RTC无法正常播放,可能会有花屏;如果需要同时使用RTC和RTSP播放流,推流时不应该开启B帧。 ## Test -### 单元测试 +### Unit Test ```bash ./configure --utest=on & make utest -j16 ./objs/srs_utest ``` -### 回归测试 - -需要先启动SRS -```bash -./objs/srs -c conf/rtsp.conf -``` - -然后执行 +### Regression Test ```bash cd srs/trunk/3rdparty/srs-bench go test ./srs -mod=vendor -v -count=1 -run=TestRtmpPublish_RtspPlay ``` +> 注意:回归测试需要先启动SRS -### 黑盒测试 - -黑盒测试无需启动SRS +### BlackBox Test ```bash +cd srs/trunk/3rdparty/srs-bench go test ./blackbox -mod=vendor -v -count=1 -run=TestFast_RtmpPublish_RtspPlay_Basic ``` @@ -103,13 +96,13 @@ go test ./blackbox -mod=vendor -v -count=1 -run=TestFast_RtmpPublish_RtspPlay_Ba 而TCP传输,每个RTP包前面有额外的4个字节,第1个字节是固定的`0x24`,后跟1个字节通道标识符,后跟2个字节的RTP包长度,参考`RFC2326`中的第10.12小节`Embedded (Interleaved) Binary Data`。 -## 开放端口 +## Port 开放端口目前只需要一个,比如`8554`,TCP传输模式会复用交互时的Socket链接。 对于UDP,情况有些复杂,客户端会开放2个端口分别用于接收RTP和RTCP,常规做法,服务端也绑定2个端口用于发送RTP和RTCP,而这会导致需要开放的端口数量剧增,这将挑战防火墙的底线。实际上,我们可以复用RTC的`8000`端口,用作发送端口,并接收RTCP请求。目前暂未实现,而是选择随机端口发送RTP包。 -## 编码格式 +## Codec 对于音频编码格式,因为是基于RTC的Consumer模块,所以拿到的RTP包已经是转码后的`OPUS`格式。如需保持原有格式,需要额外的开发。 @@ -117,7 +110,7 @@ go test ./blackbox -mod=vendor -v -count=1 -run=TestFast_RtmpPublish_RtspPlay_Ba 目前,播放RTSP流时会等待一段时间才出画面,是因为RTC模块没有实现缓存GOP功能,需要等待下一个关键帧的出现。 -## 源码 +## Source RTSP协议解析部分,拷贝了原来3.0的代码,删除了SDP和RTP以及推流相关的一些代码,只保留关键的`SrsRtspRequest`和`SrsRtspResponse`用于处理请求和相应,并且只处理`OPTIONS`、`DESCRIBE`、`SETUP`、`PLAY`、`TEARDOWN`这5个方法。对于RTSP播放,这足够了。 @@ -128,6 +121,6 @@ RTSP协议解析部分,拷贝了原来3.0的代码,删除了SDP和RTP以及 目前的版本,只是实现了一个基本功能,其他比如音频编码、鉴权、重定向等,根据实际需要再做计划,或许就在不久的将来。 -## 参考文档 +## Refer - [rfc2326-1998-rtsp.pdf](https://ossrs.net/lts/zh-cn/assets/files/rfc2326-1998-rtsp-12b5cccfcac4f911bfab96c8f57b0bf9.pdf) \ No newline at end of file From 56be1ff3aea97e9e982ac1d6f2e99e91e3257988 Mon Sep 17 00:00:00 2001 From: duiniuluantanqin <495810242@qq.com> Date: Wed, 7 May 2025 15:26:37 +0800 Subject: [PATCH 3/8] update --- i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md b/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md index 29ac5519..3d9efd3b 100644 --- a/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md +++ b/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md @@ -71,7 +71,7 @@ RTC不支持B帧,但RTSP支持;如果需要使用RTSP播放B帧,开启`kee ### Unit Test ```bash -./configure --utest=on & make utest -j16 +./configure --utest=on & make utest ./objs/srs_utest ``` @@ -104,7 +104,7 @@ go test ./blackbox -mod=vendor -v -count=1 -run=TestFast_RtmpPublish_RtspPlay_Ba ## Codec -对于音频编码格式,因为是基于RTC的Consumer模块,所以拿到的RTP包已经是转码后的`OPUS`格式。如需保持原有格式,需要额外的开发。 +对于音频编码格式,因为是复用了RTC的Consumer模块,所以拿到的RTP包已经是转码后的`OPUS`格式。如需保持原有格式,需要额外的开发。 ## GOP From 63693f23f7d25a2e080cc1e410272209160e7b5d Mon Sep 17 00:00:00 2001 From: duiniuluantanqin <495810242@qq.com> Date: Wed, 7 May 2025 15:31:50 +0800 Subject: [PATCH 4/8] update faq --- i18n/zh-cn/docusaurus-plugin-content-pages/faq.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/zh-cn/docusaurus-plugin-content-pages/faq.md b/i18n/zh-cn/docusaurus-plugin-content-pages/faq.md index 12ca1564..032011d3 100644 --- a/i18n/zh-cn/docusaurus-plugin-content-pages/faq.md +++ b/i18n/zh-cn/docusaurus-plugin-content-pages/faq.md @@ -194,7 +194,7 @@ ### [RTSP](#rtsp) * `RTSP`:RTSP推流,RTSP服务器,RTSP播放等 > 1. SRS支持用Ingest拉RTSP,不支持推RTSP流到SRS,这不是正确的用法,详细原因请参考 [#2304](https://github.com/ossrs/srs/issues/2304) 。 - > 1. 当然RTSP服务器,RTSP播放,更加不会支持,参考 [#476](https://github.com/ossrs/srs/issues/476) + > 1. ~~当然RTSP服务器,RTSP播放,更加不会支持,参考 [#476](https://github.com/ossrs/srs/issues/476)~~ 已经支持RTSP播放,参考 [#4333](https://github.com/ossrs/srs/pull/4333) > 1. 如果你需要非常多比如1万路摄像头接入,那么用FFmpeg可能会比较费劲,这么大规模的业务,比较推荐的方案是自己用ST+SRS的代码,实现一个拉RTSP转发的服务器。 * `Browser RTSP`: 如何使用浏览器播放RTSP等 > 1. H5如何播放RTSP流,FFmpeg拉RTSP流,如何降低延迟,参考[链接](https://stackoverflow.com/a/70400665/17679565) From b03c49928c1bfb395d63c3eccf367651f625ac4a Mon Sep 17 00:00:00 2001 From: duiniuluantanqin <495810242@qq.com> Date: Wed, 7 May 2025 15:39:32 +0800 Subject: [PATCH 5/8] update SDP --- .../current/doc/rtsp.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md b/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md index 3d9efd3b..c47dad17 100644 --- a/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md +++ b/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md @@ -90,17 +90,26 @@ cd srs/trunk/3rdparty/srs-bench go test ./blackbox -mod=vendor -v -count=1 -run=TestFast_RtmpPublish_RtspPlay_Basic ``` +## Port + +开放端口目前只需要一个,比如`8554`,TCP传输模式会复用交互时的Socket链接。 + +对于UDP,情况有些复杂,客户端会开放2个端口分别用于接收RTP和RTCP,常规做法,服务端也绑定2个端口用于发送RTP和RTCP,而这会导致需要开放的端口数量剧增,这将挑战防火墙的底线。实际上,我们可以复用RTC的`8000`端口,用作发送端口,并接收RTCP请求。目前暂未实现,而是选择随机端口发送RTP包。 + ## RTP 如果是UDP传输,RTP打包方式跟RTC完全相同,直接发送即可。 而TCP传输,每个RTP包前面有额外的4个字节,第1个字节是固定的`0x24`,后跟1个字节通道标识符,后跟2个字节的RTP包长度,参考`RFC2326`中的第10.12小节`Embedded (Interleaved) Binary Data`。 -## Port +## SDP -开放端口目前只需要一个,比如`8554`,TCP传输模式会复用交互时的Socket链接。 +目前,SDP中,缺少了`fmtp`属性,是由于RTC模块没有保存SPS/PPS信息,但是不影响播放,因为每个关键帧前面都会发送SPS/PPS。理想中的SDP应包含如下信息: -对于UDP,情况有些复杂,客户端会开放2个端口分别用于接收RTP和RTCP,常规做法,服务端也绑定2个端口用于发送RTP和RTCP,而这会导致需要开放的端口数量剧增,这将挑战防火墙的底线。实际上,我们可以复用RTC的`8000`端口,用作发送端口,并接收RTCP请求。目前暂未实现,而是选择随机端口发送RTP包。 +```bash +a=fmtp:96 packetization-mode=1; profile-level-id=640032; sprop-parameter-sets=Z2QAMqxyiQHgCJ+XAWoCAgKAAAADAIAAAB5HjBhRMA==,aOk7yw== +a=rtpmap:96 H264/90000 +``` ## Codec From 66dcd4d73f7e27196ce2509126fa2faedf498c71 Mon Sep 17 00:00:00 2001 From: duiniuluantanqin <495810242@qq.com> Date: Wed, 7 May 2025 15:48:31 +0800 Subject: [PATCH 6/8] update --- i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md b/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md index c47dad17..1cce7849 100644 --- a/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md +++ b/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md @@ -94,7 +94,7 @@ go test ./blackbox -mod=vendor -v -count=1 -run=TestFast_RtmpPublish_RtspPlay_Ba 开放端口目前只需要一个,比如`8554`,TCP传输模式会复用交互时的Socket链接。 -对于UDP,情况有些复杂,客户端会开放2个端口分别用于接收RTP和RTCP,常规做法,服务端也绑定2个端口用于发送RTP和RTCP,而这会导致需要开放的端口数量剧增,这将挑战防火墙的底线。实际上,我们可以复用RTC的`8000`端口,用作发送端口,并接收RTCP请求。目前暂未实现,而是选择随机端口发送RTP包。 +对于UDP,情况有些复杂,客户端会开放2个端口分别用于接收RTP和RTCP,常规做法,服务端也绑定2个端口用于发送RTP和RTCP,而这会导致需要开放的端口数量剧增,这将挑战防火墙的底线。实际上,我们可以复用RTC的`8000`端口,用作发送端口,并接收RTCP请求。目前暂未实现,所以系统会随机端口发送RTP包。 ## RTP @@ -104,7 +104,7 @@ go test ./blackbox -mod=vendor -v -count=1 -run=TestFast_RtmpPublish_RtspPlay_Ba ## SDP -目前,SDP中,缺少了`fmtp`属性,是由于RTC模块没有保存SPS/PPS信息,但是不影响播放,因为每个关键帧前面都会发送SPS/PPS。理想中的SDP应包含如下信息: +目前,SDP中,缺少了`fmtp`属性,是由于RTC模块没有保存SPS/PPS信息,但是不影响播放,因为每个关键帧前面都会发送SPS/PPS。如果实现了GOP缓存功能,这个问题会迎刃而解。理想中的SDP应包含如下信息: ```bash a=fmtp:96 packetization-mode=1; profile-level-id=640032; sprop-parameter-sets=Z2QAMqxyiQHgCJ+XAWoCAgKAAAADAIAAAB5HjBhRMA==,aOk7yw== From 7df8ed2049b99e6aa90f33de1719c3945fb234bb Mon Sep 17 00:00:00 2001 From: duiniuluantanqin <495810242@qq.com> Date: Thu, 8 May 2025 10:23:35 +0800 Subject: [PATCH 7/8] big update --- .../current/doc/rtsp.md | 80 +++++++++---------- 1 file changed, 38 insertions(+), 42 deletions(-) diff --git a/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md b/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md index 1cce7849..fe3f51d8 100644 --- a/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md +++ b/i18n/zh-cn/docusaurus-plugin-content-docs/current/doc/rtsp.md @@ -11,7 +11,7 @@ RTSP是很古老的协议,已经有接近30年的历史。在安防行业, SRS最早在2.0版本就已经支持RTSP协议,但只有推流(ANNOUNCE → SETUP → RECORD),而没有拉流(DESCRIBE → SETUP → PLAY)。实际上,很多传统的C/S架构的客户端、解码器、嵌入式设备,以及最新的AI视觉检测等,首选播放协议仍然RTSP。 -这个版本,复用了2.0的协议解析的部分代码,删除推流,新增拉流。同时,尽可能的复用了WebRTC模块,包括RTP打包,SDP解析,因为这些几乎是一样的。 +这个版本,复用了2.0的协议解析的部分代码,删除推流,新增拉流。同时,尽可能的复用了WebRTC模块,包括RTP打包,SDP解析,因为这些几乎是一样的。也是因为高度复用了RTC,导致存在一些局限性,下面会详细说明。 ## Usage @@ -39,16 +39,14 @@ ffplay -rtsp_transport tcp -i rtsp://localhost:8554/live/livestream ## Config +因为复用了RTC模块,所以必须开启所有RTC相关的配置,参考`conf/rtsp.conf` + ```bash rtsp_server { enabled on; listen 8554; } -``` -RTSP默认端口是`554`,但是某些系统需要`root`权限,所以这里改成了`8554`。 -同时因为复用了RTC模块,所以必须开启所有RTC相关的配置,如下: -```bash rtc_server { enabled on; listen 8000; @@ -64,7 +62,40 @@ vhost __defaultVhost__ { } ``` -RTC不支持B帧,但RTSP支持;如果需要使用RTSP播放B帧,开启`keep_bframe`即可,但此时RTC无法正常播放,可能会有花屏;如果需要同时使用RTC和RTSP播放流,推流时不应该开启B帧。 +## Port + +RTSP协议分为2个部分,1个是信令交互,即DESCRIBE/SETUP/PLAY等;1个是媒体传输,即RTP/RTCP包发送。 + +信令交互必须是TCP协议,默认端口是`554`,某些系统需要`root`权限才能监听,所以这里改成了`8554`。 + +交互成功后开始媒体传输,有2种方式:TCP或UDP。TCP模式直接复用交互时建立的Socket链接。对于UDP,情况有些复杂,客户端会开放2个端口分别用于接收RTP和RTCP,常规做法,服务端也绑定2个端口用于发送RTP和RTCP,但这会导致需要开放的端口数量剧增,这将挑战防火墙的底线。实际上,我们可以复用RTC的`8000`端口,用作发送端口,并接收RTCP请求。目前暂未实现,所以系统会随机端口发送RTP包。 + +## Rtp + +如果是UDP传输,RTP打包方式跟WebRTC完全相同,直接发送即可。 + +而TCP传输,每个RTP包前面有额外的4个字节,第1个字节是固定的`0x24`,后跟1个字节通道标识符,后跟2个字节的RTP包长度,参考`RFC2326`中的第10.12小节`Embedded (Interleaved) Binary Data`。 + +## Limitations + +1. RTC不支持B帧,但RTSP支持;如果需要使用RTSP播放B帧,开启`keep_bframe`即可,但此时RTC无法正常播放,可能会有花屏;如果需要同时使用RTC和RTSP播放流,推流时不应该开启B帧。 + +2. SDP中,缺少了`fmtp`属性,是由于RTC模块没有保存SPS/PPS信息,但是不影响播放,因为每个关键帧前面都会发送SPS/PPS。如果实现了GOP缓存功能,这个问题会迎刃而解。理想中的SDP应包含如下信息: + + ```bash + a=fmtp:96 packetization-mode=1; profile-level-id=640032; sprop-parameter-sets=Z2QAMqxyiQHgCJ+XAWoCAgKAAAADAIAAAB5HjBhRMA==,aOk7yw== + a=rtpmap:96 H264/90000 + ``` + +3. 音频编码格式统一转码为`OPUS`,因为RTC不支持AAC/MP3,RTSP消费的RTP包已经是转码后的。视频不受影响。 + +4. 由于RTC模块没有实现缓存GOP功能,所以会等待一段时间才出画面,是在等待关键帧的出现。 + +## Architecture + +RTSP协议解析部分,拷贝了原来3.0的代码,删除了SDP和RTP以及推流相关的一些代码,只保留关键的`SrsRtspRequest`和`SrsRtspResponse`用于处理请求和相应,并且只处理`OPTIONS`、`DESCRIBE`、`SETUP`、`PLAY`、`TEARDOWN`这5个方法。对于RTSP播放,这足够了。 + +业务部分,`SrsRtspConn`用于接收网络数据。同时,继承于`SrsRtcConnection`,是为了复用`RTC Consumer`,实际上,每一个RTSP播放者,等同于一个RTC播放者。真实业务处理下放到`SrsRtspSession`里面,包括生成SDP、发送RTP包,以及通用的Security、Hook、Stat。 ## Test @@ -90,44 +121,9 @@ cd srs/trunk/3rdparty/srs-bench go test ./blackbox -mod=vendor -v -count=1 -run=TestFast_RtmpPublish_RtspPlay_Basic ``` -## Port - -开放端口目前只需要一个,比如`8554`,TCP传输模式会复用交互时的Socket链接。 - -对于UDP,情况有些复杂,客户端会开放2个端口分别用于接收RTP和RTCP,常规做法,服务端也绑定2个端口用于发送RTP和RTCP,而这会导致需要开放的端口数量剧增,这将挑战防火墙的底线。实际上,我们可以复用RTC的`8000`端口,用作发送端口,并接收RTCP请求。目前暂未实现,所以系统会随机端口发送RTP包。 - -## RTP - -如果是UDP传输,RTP打包方式跟RTC完全相同,直接发送即可。 - -而TCP传输,每个RTP包前面有额外的4个字节,第1个字节是固定的`0x24`,后跟1个字节通道标识符,后跟2个字节的RTP包长度,参考`RFC2326`中的第10.12小节`Embedded (Interleaved) Binary Data`。 - -## SDP - -目前,SDP中,缺少了`fmtp`属性,是由于RTC模块没有保存SPS/PPS信息,但是不影响播放,因为每个关键帧前面都会发送SPS/PPS。如果实现了GOP缓存功能,这个问题会迎刃而解。理想中的SDP应包含如下信息: - -```bash -a=fmtp:96 packetization-mode=1; profile-level-id=640032; sprop-parameter-sets=Z2QAMqxyiQHgCJ+XAWoCAgKAAAADAIAAAB5HjBhRMA==,aOk7yw== -a=rtpmap:96 H264/90000 -``` - -## Codec - -对于音频编码格式,因为是复用了RTC的Consumer模块,所以拿到的RTP包已经是转码后的`OPUS`格式。如需保持原有格式,需要额外的开发。 - -## GOP - -目前,播放RTSP流时会等待一段时间才出画面,是因为RTC模块没有实现缓存GOP功能,需要等待下一个关键帧的出现。 - -## Source - -RTSP协议解析部分,拷贝了原来3.0的代码,删除了SDP和RTP以及推流相关的一些代码,只保留关键的`SrsRtspRequest`和`SrsRtspResponse`用于处理请求和相应,并且只处理`OPTIONS`、`DESCRIBE`、`SETUP`、`PLAY`、`TEARDOWN`这5个方法。对于RTSP播放,这足够了。 - -业务部分,`SrsRtspConn`用于接收网络数据。同时,继承于`SrsRtcConnection`,是为了复用`RTC Consumer`,实际上,每一个RTSP播放者,等同于一个RTC播放者。真实业务处理下放到`SrsRtspSession`里面,包括生成SDP、发送RTP包,以及通用的Security、Hook、Stat。 - ## TODO -目前的版本,只是实现了一个基本功能,其他比如音频编码、鉴权、重定向等,根据实际需要再做计划,或许就在不久的将来。 +目前的版本,只是实现了一个基本功能,其他比如音频编码、鉴权、重定向、RTCP等,根据实际需要再做计划,或许就在不久的将来。 ## Refer From 428848414b8e14e858dd8e85c495de4222eaa3a1 Mon Sep 17 00:00:00 2001 From: Haibo Chen <495810242@qq.com> Date: Sat, 10 May 2025 09:20:56 +0800 Subject: [PATCH 8/8] init english version --- .../current/doc/rtsp.md | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 i18n/en-us/docusaurus-plugin-content-docs/current/doc/rtsp.md diff --git a/i18n/en-us/docusaurus-plugin-content-docs/current/doc/rtsp.md b/i18n/en-us/docusaurus-plugin-content-docs/current/doc/rtsp.md new file mode 100644 index 00000000..ac026182 --- /dev/null +++ b/i18n/en-us/docusaurus-plugin-content-docs/current/doc/rtsp.md @@ -0,0 +1,37 @@ +--- +title: RTSP +sidebar_label: RTSP +hide_title: false +hide_table_of_contents: false +--- + +# RTSP + + +## Usage + + +## Config + + +## Port + + +## Rtp + + +## Limitations + + +## Architecture + + +## Test + + +## TODO + + +## Refer + +- [rfc2326-1998-rtsp.pdf](https://ossrs.net/lts/zh-cn/assets/files/rfc2326-1998-rtsp-12b5cccfcac4f911bfab96c8f57b0bf9.pdf) \ No newline at end of file