RTSP 和 RTMP 原理 通过ffmpeg 实现将本地摄像头串流到RTSP服务器

RTSP 和 RTMP 原理 通过ffmpeg 实现将本地摄像头串流到RTSP服务器

RTMP 与 RTSP

流媒体协议 (Streaming Protocol

流媒体协议是一种用于通过 Web 传递多媒体的协议。

流媒体协议有很多,主要分为三大类:

  • 传统视频流协议
    • RTMP
    • RTSP
  • 基于 HTTP 的自适应协议
    • Apple HLS
    • Low-Latency HLS
    • MPEG-DASH
    • Adobe HDS
  • 新技术
    • SRT
    • WebRTC

RTMP

RTMP (Real Time Messaging Protocol)是基于 TCP 开发的,RTSP 使用到了 UDP

可以在服务器和客户端服务器之间保持稳定的连接,无论用户的互联网连接质量如何,它都可以无缝低延迟进行流媒体传输,通过将数据流分成相等的小部分(音频数据默认为 64 字节,视频数据默认为 128 字节)并将它们顺序传输到接收设备,然后将它们重新组合成视频流来实现的。

缺点是它与 HTML5 播放器不兼容,这样的话必须使用另一种协议,例如 HLS来传输视频文件到达用户的设备,此外,RTMP 容易受到带宽问题的影响。

RTSP

用于控制 VHS 式视频流的娱乐和通信系统,RTSP 使用高效的 RTP 协议,将流数据分解成更小的块,这样可以更快地传递。RTSP 支持可靠的分段流,这意味着用户可以在仍在下载流的同时继续观看流。Android 和 iOS 设备没有开箱即用的 RTSP 兼容播放器,所以普及度并不高,但 RTSP 在许多监控 和闭路电视 (CCTV) 应用非常广泛,远程摄像头、在线教育和互联网直播等,都用的比较频繁。

RTMP 提供与不同摄取设备的兼容性和低延迟流媒体的稳定性,但是,您需要一个特定的 Flash Media Server 来使用 RTMP 分发您的内容,所以RTMP 适用于主要的第三方流应用程序和较旧的硬件编码器;

RTP(Real-time Transport Protocol)实时传输协议 UDP 实现 低延迟

1
2
3
4
5
6
7
8
除了RTP协议,为确保流畅和一致的流传输,RTSP 还使用另外两种网络通信协议:

- TCP 收发控制命令(例如播放或停止请求)
- UDP 传送音频、视频和数据。

TCP可靠传输,比如用户按下播放或者停止播放的时候,这个是个准确的请求,这个需要保证可靠性,这个时候TCP作用就体现了。

UDP是低延迟的协议,那么用于传送音频、视频和数据可以达到非常高效的效果

image-20240712103123752

RTSP 工作原理

  1. 用户设备向视频流平台发送 RTSP 请求
  2. 视频流平台返回可以操作的请求列表,比如播放、暂停等
  3. 用户设备向视频流平台发送具体的请求,比如播放
  4. 视频流平台解析请求并调用指定机制启动视频流处理
  5. 由于 RTSP 依赖于专用服务器,并且依赖于 RTP,因此该协议不支持加密视频内容或重传丢失的数据包。

RTSP虽然实时性最好,但是实现复杂,适合视频聊天和视频监控;

RTMP强在浏览器支持好,加载flash插件后就能直接播放,所以非常火,相反在浏览器里播放rtsp就很困难了。

RTMP的优点:

1、低延迟:RTMP使用独占的 1935 端口,无需缓冲,可以实现低延迟。

2、适应性强:所有 RTMP 服务器都可以录制直播媒体流,同时还允许观众跳过部分广播并在直播开始后加入直播流。

3、灵活性:RTMP 支持整合文本、视频和音频,支持 MP3 和 AAC 音频流,也支持MP4、FLV 和 F4V 视频。

RTMP的缺点:

1、HTML5 不支持:标准HTML5 播放器不支持 RTMP 流。

2、容易受到带宽问题的影响:RTMP 流经常会出现低带宽问题,造成视频中断。

3、HTTP 不兼容:无法通过 HTTP 流式传输 RTMP,必须需要实现一个特殊的服务器,并使用第三方内容交付网络或使用流媒体视频平台。

HTTP

http协议的直播分二种格式,m3u8和flv。flv是一种即将被淘汰的直播格式。用来做直播已显的力不从心了。所以综合考虑,m3u8相对的比较好点,优点是支持移动端,并且支持PC端上安装了flashplayer的环境。缺点就如同rtmp一样。flashplayer并不是未来的发展趋势。另外一个缺点就是m3u8是有延迟的。并不能实时,实时传输方面不如rtmp协议。因为m3u8的直播原理是将直播源不停的压缩成指定时长的ts文件(比如9秒,10秒一个ts文件)并同时实时更新m3u8文件里的列表以达到直播的效果。这样就会有一个至少9,10秒的时间延迟。如果压缩的过小,可能导致客户端网络原因致视频变卡。

RTSP和RTMP如何选择

  • IP 摄像机选择RTSP:几乎所有 IP 摄像机都支持 RTSP,这是因为 IP 摄像机早在 RTMP 协议创建之前就已经存在,与 RTSP 和 IP 摄像机结合使用时,IP 摄像机本身充当 RTSP 服务器,这意味着要将摄像机连接到 IP 摄像机服务器并广播视频。

  • 物联网设备选择RTSP:RTSP 通常内置在无人机或物联网软件中,从而可以访问视频源,它的好处之一是低延迟,确保视频中没有延迟,这对于无人机来说至关重要。

  • 流媒体应用程序选择RTMP:比如各种短视频软件、视频直播软件等都内置了RTMP,RTMP 是为满足现代流媒体需求而设计的。

ffmpeg将本地摄像头推流到RTSP服务器

使用rtsp-simple-server作为中转服务器,用于ffmpeg(写客户端)推流,后台服务(读客户端)拉流

引用:

ffmpeg将本地摄像头推流到rtsp8554端口上(rtsp-simple-server在处理rtsp时,监听的是8554端口,指定其他端口ffmpeg推流会失败)

参考即可(记得修改rtsp-simple-server.yml配置文件中的ip地址,在yml文件中可能1935端口号被占用的情况 导致无法启动 修改rtmp端口 disable改为yes)

打开rtsp-simple-server.exe监听RTSP下TCP的8554端口,然后通过ffmpeg将指定摄像头采集到的图像帧向该端口进行推流(即多个客户端与服务器端的socket通信)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import cv2

def capture_video(rtsp_path):
name = rtsp_path.split("/")[-1]
capture = cv2.VideoCapture(rtsp_path)
while capture.isOpened():
ret, frame = capture.read()
if not ret:
break
cv2.imshow(name, frame)
if cv2.waitKey(50) == 27:
break

if __name__ == '__main__':
# rtsp_paths = ['rtsp://127.0.0.1:8554/videoFile_test','rtsp://127.0.0.1:8554/camera_test']
rtsp_paths = ['rtsp://127.0.0.1:8554/videoFile_test']
for rtsp_path in rtsp_paths:
capture_video(rtsp_path)

cv2.waitKey(0)
cv2.destroyAllWindows()

服务器端:RTSP服务器

1
2
3
开启两个ffmpeg模拟两个写客户端,完成摄像头采集视频帧的推流和本地视频文件的推流

该过程会出现两个createby和publishing,在不同文件路径下写入图像帧,可以通过指定进程(ip+端口)来处理(这里新创建了56725和56732两个进程来处理),而RTSP的监听端口仍然是8554,这样可以实现非阻塞通信。

具体安装使用参考blog

大致实现过程:使用rtsp-simple-server作为中转服务器,用于ffmpeg(写客户端)推流,后台服务(读客户端)拉流

ffmpeg推流视频文件到指定ip + 端口上-stream_loop -1

延时

使用ffmpeg的时候,假如不使用编码,直接上传到rtmp服务器,那么视频是没什么延时的,但是这样流量却非常的大,因为假如不编码,就意味着不压缩,直接原始数据上传,消耗流量。

视频的压缩(编码)需要对帧作一定时间的缓存,假如每一个字节都原始传输,就没有压缩的概念了,所以编码的压缩效果,是跟延时有一定的关系的,延时越高,压缩比就越高,因此我们假如需要调整延时,就需要调整延时的帧数了

1
ffmpeg -f dshow -i audio="qudong ming "  -acodec aac -f gdigrab  -s 1920x1080  -i desktop  -vcodec libx264  -g 60  -crf 30    -f flv   rtmp://127.0.0.1:9355/rtmp/room

加上-g 60参数,-g的意思是延时60帧传输,ffmpeg默认的每秒帧数好像是30(假如需要调整,可以加 -r 20),假如设置了-g 60,那么延时就是2秒,加上其他编码算法的延时、服务器处理的网络影响,延时可能大概是4秒左右。

https://blog.csdn.net/weixin_43025343/article/details/124957360

https://www.cnblogs.com/biao-wu/articles/13064243.html

https://blog.csdn.net/qq_33934427/article/details/128009659

https://ffmpeg.org/ffmpeg-protocols.html