流媒体——RTP 基于UDP和TCP协议传输数据——初探

1、RTP over RTSP(TCP,RTP包通过使用TCP来传输)优势:

  • UDP协议上的RTSP/RTP需要打开许多UDP端口,一个端口用于RTSP通信,n个端口用于RTP,n个端口用于RTCP
  • 中间网络路由器很容易就过滤或者忽略掉UDP数据包
  • UDP是不可靠传输协议,媒体包在因特网上传输时会面临着丢包

 

2、RTP over RTSP(TCP) 与 RTP over RTSP(UDP)  RTP包头差异:

rtp基于tcp的包头比基于udp的包头多了4个字节:

  •  magic固定为0x24,
  •  channel用来区分音视频等多路流媒体的通道,其中偶数通道为流媒体内容,奇数通道为RTCP
  •  len表示数据包的长度减去开始的4个字节,即len字段之后的数据长度

 

3、RFC3984是H.264的baseline码流在RTP方式下传输的规范。

 

4、H.264的NAL层处理

  • H264以NALU(NALunit)为单位来支持编码数据在基于分组交换技术网络中传输。
  • NALU定义了可用于基于分组和基于比特流系统的基本格式,同时给出头信息,从而提供了视频编码和外部事件的接口。

 

5、H264编码过程中的三种不同的数据形式:

  • SODB 数据比特串
  • RBSP 原始字节序列载荷
  • EBSP 扩展字节序列载荷

 

6、NALU打包成RTP的方式有三种:

(1)单一 NAL 单元模式:

  •  即一个RTP 包仅由一个完整的 NALU 组成.
  • 这种情况下 RTP NAL 头类型字段和原始的 H.264的NALU 头类型字段是一样的.
  • 对于 NALU 的长度小于 MTU 大小的包, 一般采用单一 NAL 单元模式.
  • 12字节的RTP头后面的就是音视频数据,比较简单。一个封装单个NAL单元包到RTP的NAL单元流的RTP序号必须符合NAL单元的解码顺序。

(2)组合封包模式:

  • 即可能是由多个NAL 单元组成一个 RTP 包.
  • 分别有4种组合方式: STAP-A, STAP-B, MTAP16, MTAP24.那么这里的类型值分别是 24, 25, 26 以及 27.
  • 当 NALU 的长度特别小时, 可以把几个 NALU 单元封在一个 RTP 包中.

(3)分片封包模式:

  • 用于把一个NALU 单元封装成多个 RTP 包.
  • 存在两种类型 FU-A 和 FU-B. 类型值分别是 28 和 29.
  • 而当 NALU 的长度超过 MTU 时, 就必须对 NALU 单元进行分片封包. 也称为 Fragmentation Units (FUs).
  • 数据比较大的H264视频包,被RTP分片发送。12字节的RTP头后面跟随的就是FU-A分片。

注:还记得前面nal_unit_type的定义吧,0~23是给H264用的,24~31未使用,在rtp打包时,如果一个NALU放在一个RTP包里,可以使用NALU的nal_unit_type,但是当需要把多个NALU打包成一个RTP包,或者需要把一个NALU打包成多个RTP包时,就定义新的type来标识。

 

7、拆包和解包

(1)拆包:当编码器在编码时需要将原有一个NAL按照FU-A进行分片,原有的NAL的单元头与分片后的FU-A的单元头有如下关系:
原始的NAL头的前三位为FU indicator的前三位,原始的NAL头的后五位为FU header的后五位,FUindicator与FU header的剩余位数根据实际情况决定。

(2)解包:当接收端收到FU-A的分片数据,需要将所有的分片包组合还原成原始的NAL包时,FU-A的单元头与还原后的NAL的关系如下:
还原后的NAL头的八位是由FU indicator的前三位加FU header的后五位组成,即:
nal_unit_type = (fu_indicator & 0xe0) | (fu_header & 0x1f) 。

 

8、TCP/IP、UDP:

  • IP 协议负责将多个包交换网络连接起来,并管理通讯 IP 源地址和目标地址的协议
  • TCP 和 UDP 协议则是位于应用层和 IP 层之间,负责它们之间信息传输的重要协议

 

9、TCP 和 UDP 的特点

  • TCP:面向连接、可靠、基于字节流控制的传输,就像一个管道一样将应用层和 IP 层连接起来。
  • UDP:提供无连接通信,但不对传送的数据包提供可靠性保证。

 

10、端口及其特点:

端口号属于传输协议的一部分,因此我们可以说,数据通过 IP 地址发送对应的数据到指定设备上,而通过端口号把数据发送到指定的服务或程序上。

 

11、程序一般不止是监听指定的端口号,而且也会明确对应的传输协议。所以我们在进行数据传输的时候,既要指定对应的端口号,也要指定对应的通讯协议,如:

程序 A 使用 TCP 协议,监听 33001 端口;程序 A 使用 UDP 协议,监听 33001 端口。

 

12、指定传输协议和端口,显而易见的好处在于,当我们进行端口转发或者构建网络防火墙的时候,我们可以很方便的通过协议和端口进行隔离。以防止不可预见的意外发生。对于计算机来说,通过这种方式可以防止外网各种不必要的数据,进入本地局域网。

 

13、IANA( Internet Assigned Numbers Authority 即互联网号码分配局 ),它负责管理端口注册。大多数主流的程序,都有一个明确的已注册端口,比如常见的 FTP 监听 20、 21 端口,而 HTTP 服务监听 80 端口等。如果有一个程序想注册某个端口,那么 IANA 会先去查一查这个端口是否已被注册,如果已经被注册了,它则会拒绝申请。

 

14、端口号根据范围分为三种:

  • Well-Known Ports(即公认端口号):

                它是一些众人皆知著名的端口号,这些端口号固定分配给一些服务,我们上面提到的 HTTP 服务、 FTP服务等都属于这一类。知名端口号的范围是:0-1023。

  • Registered Ports(即注册端口):

              它是不可以动态调整的端口段,这些端口没有明确定义服务哪些特定的对象。不同的程序可以根据自己的需要自己定义,注册端口号的范围是:1024-49151。

  • Dynamic, private or ephemeral ports(即动态、私有或临时端口号):

              顾名思义,这些端口号是不可以注册的,这一段的端口被用作一些私人的或者定制化的服务,当然也可以用来做动态端口服务,这一段的范围是:49152–65535。

 

 

 

参考&&致谢:

https://blog.csdn.net/daha1314/article/details/89106895

https://network.51cto.com/art/201905/596779.htm

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 基于Linux和Qt的实时视频传输客户端和服务端应用程序是利用RTP(Real-time Transport Protocol,实时传输协议)来实现实时视频传输的。RTP是一种面向实时多媒体数据的传输协议,常用于音频和视频的传输。 在客户端和服务端的设计中,使用Qt作为界面开发工具和库,通过其提供的多媒体功能来处理和显示视频数据。客户端负责发送视频数据,服务端负责接收并显示视频。以下是简要的实现步骤: 1. 客户端: - 使用Qt提供的音频和视频模块,打开摄像头和麦克风,获取音视频数据。 - 封装音视频数据为RTP数据包,包括相应的RTP头部和负载数据。 - 通过网络传输RTP数据包到服务端。 2. 服务端: - 使用Qt提供的音频和视频模块,接收网络数据包。 - 解析RTP数据包,获取音视频数据。 - 对音视频数据进行解码,得到原始的音视频帧。 - 将音视频帧显示在界面上。 需要注意的是,RTP协议本身并不提供数据传输的可靠性、安全性或容错功能。在实际应用中,可以结合其他协议(如RTCP或SRTP)来增加传输的可靠性和安全性。 此外,还需要考虑网络传输的带宽、延迟等因素,采用合适的编码格式和传输策略,以确保视频传输的实时性和畅性。 总结来说,基于Linux和Qt的实时视频传输客户端和服务端利用RTP协议实现音视频数据的传输和显示,通过Qt的音视频模块处理数据并提供界面显示功能。但具体实现涉及到网络传输、编解码等复杂的技术,需要进一步深入学习和实践。 ### 回答2: 在Linux操作系统下使用Qt开发基于RTP协议的实时视频传输客户端和服务端,可以通过以下步骤实现。 服务端: 1. 创建一个Qt项目,并引入RTP库,如live555,以便实现RTP协议的功能。 2. 使用QTcpServer类创建一个TCP服务器,用于接收客户端的连接请求。 3. 在接收到客户端连接请求后,创建一个RTP会话,并将客户端的地址信息绑定到会话上。 4. 使用RTP会话发送视频数据,可以将视频数据分片成RTP包进行传输,并将其发送到客户端。 客户端: 1. 创建一个Qt项目,并引入RTP库,如live555,以便实现RTP协议的功能。 2. 使用QTcpSocket类创建一个TCP套接字,用于向服务端发送连接请求。 3. 在连接成功后,创建一个RTP会话,并将服务端的地址信息绑定到会话上。 4. 使用RTP会话接收服务端发送的视频数据,并在界面上进行显示。 在实现过程中,需要注意以下几点: 1. RTP协议可以自定义载荷类型,可根据需求选择合适的载荷类型进行视频传输。 2. 考虑网络传输的延迟和带宽限制,可以通过设置RTP会话的一些参数,如时间戳,序列号等,来优化传输效果。 3. 在服务端和客户端中,需要进行视频数据的编码和解码操作,以便进行数据的传输和显示。 总结而言,如果想要在Linux Qt下实现基于RTP协议的实时视频传输客户端和服务端,需要借助RTP库,创建RTP会话,并使用TCP套接字进行连接。同时,需要进行视频数据的编码和解码操作,以实现视频的传输和显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xw-何妨吟啸且徐行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值