menu

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
keyboard_arrow_up