RTP (I): Intro to RTP and SDP - Kurento
RTP
real-time transport protocol(实时传输协议)
- 一个 RTP 会话,一组与通过 RTP 协议进行通信(发送或接受音视频)的参与者(peers)。
- 发送的参与者会将媒体划分为不同的数据块,称为
RTP packets
,然后通过UDP将其发送到接收器。 - 接收数据的参与者将打开一个UDP端口,以侦听传入的RTP数据包。这些数据包必须被收集并重新组合,以获取发送方最初发送的媒体。
一个 rtp packet:
(Bitmap)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|X| CC |M| PT | sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| synchronization source (SSRC) identifier |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
| contributing source (CSRC) identifiers |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| payload ... |
| +-------------------------------+
| | RTP padding | RTP pad count |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
rtp 是 16年前的标志,很多强制性的 Header 现在不用了。
PT(Payload Type)
,常用 dynamic type:96-127
sequence number
,从一个随机数开始,每个包递增。timestamp
从一个随机数开始,根据 PT 定义的时钟频率增长SSRC
随机数,用于确定传输 meida track
典型的 RTP 是基于 UDP 传输的。
一个 RTP 会话,也有 RTCP 包,用于传输会话的一些基本统计信息。如接收方将接收RTP并发送RTCP接收方报告。
RTCP数据包包含有关流的非常有用的信息:
- SSRCs
- CNAME, 可用于将几种媒体组合在一起的标识符。
- 来自发送者和接收者的时间戳差异,数据包计数和抖动估计。然后,每个对等方都可以使用这些统计信息来检测不良情况,例如数据包丢失。
还有一些扩展格式,
- Google REMB,是算法的一部分,旨在适应发送方视频比特率,以避免网络拥塞引起的问题。
- etc
RTP会话中的两个对等方可能支持也可能不支持这些功能,并且必须明确协商并启用这些功能。这通常是通过SDP协商完成的.
SDP(Session Description Protocol)
SDP messages, 纯文本文件遵循松散格式的结构,其中包含描述流参数所需的所有详细信息。
SDP message 由 RTP 会话的参与者生成。用作发送给它的媒体的明确描述。SDP信息是指RTP参与者期望接收的内容。
Simplest SDP
v=0
o=- 0 0 IN IP4 127.0.0.1
s=-
c=IN IP4 127.0.0.1
t=0 0
m=video 5004 RTP/AVP 96
a=rtpmap:96 VP8/90000
# session 级别描述,
# Protocol version; always 0
v=0
# 发起者和会话标识符
o=- 0 0 IN IP4 127.0.0.1
# 会话描述
s=-
# 链接信息
c=IN IP4 127.0.0.1
# 会话开始和结束的NTP时间戳
t=0 0
# 媒体级别描述,可多个
# 5004 本地端口接受其他参与者发送的RTP包,+1 5005,则是接受 RTCP 包
# RTP/AVP profile
# 96 Payload Type
m=video 5004 RTP/AVP 96
# PT与编码,可多个
a=rtpmap:96 VP8/90000
SDP Offer/Answer Model
模型描述了一种机制,通过这种机制,两个RTP参与者都同意SDP编解码器和设置的一个公共子集,因此每个人都可以与另一个人“交谈”,一个参与者从他们的角度向另一人提供了所需会话的描述,另一位参与者从他们的角度回答了所需会话。
当一个RTP参与者(称为要约人)将初始SDP消息发送给另一对等方时,SDP要约/答案协商就开始了。此SDP消息包含要约人想要接收的所有媒体轨道和功能的描述,称为SDP Offer。
SDP的接收方,现在应解析 Offer 并找到可接受的轨道和功能的子集。然后,这些将用于构建新的SDP消息,称为SDP Answer 发回发送方。
SDP Offer/Answer Model 假设存在高层协议,该高层协议能够交换SDP消息,以在RTP会话的参与者之间建立会话。这通常称为会话信令。但并没有任何标志或 RFC 规定如何交换消息。每个应用程序必须选择适当的信令方法,该方法允许在参与者之间来回发送SDP消息。这可能是各种各样的方法,手动复制和粘贴;共享用于交换SDP消息的公共数据库;直接TCP套接字连接,例如WebSocket;网络消息代理,例如RabbitMQ,MQTT或Redis;等等
RTSP & SRTP
尽管它们的名称相似,但它们有很大的不同,不要混淆!
RTSP
Real Time Streaming Protocol – RTSP,将RTP和SDP的概念结合在一起,通过添加流发现和回放控件将它们带入下一步。 我们可以将RTSP描述为类似于HTTP的协议:就像HTTP服务器提供了基于方法的接口,其名称包括GET,POST,DELETE,CONNECT等,在RTSP中,有一台服务器提供了一个 具有文字动词(例如DESCRIBE,SETUP,ANNOUNCE,TEARDOWN,PLAY,PAUSE,RECORD等)的控制面板。
RTSP 还定义了信令。
SRTP
Secure Real-time Transport Protocol – SRTP
- 加密,所有RTP数据包的媒体有效负载。请注意,尽管只有有效负载受到保护,而RTP Header 不受保护。
- 断言所有RTP和RTCP数据包均已通过身份验证,并来自它们声称将来自的源。
- 确保整个RTP和RTCP数据包的完整性,即防止对数据包内容进行任意修改。
- 防止重放攻击。
上手
opencv + gstreamer 实现 rtp
appsrc ! autovideoconvert ! omxh264enc ! h264parse ! rtph264pay config-interval=1 ! udpsink host=192.168.50.211 port=5000
需要自己手动编辑 sdp 文件:
v=
o=- 0 0 IN IP4 192.168.50.211
s=No Name
c=IN IP4 192.168.50.211
t=0 0
a=tool:libavformat 57.83.100
m=video 5000 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1
播放
gst-launch-1.0 playbin uri="sdp://$PWD/video.sdp" video-sink=ximagesink