NALU RTP PS流
三者总体关系
NALU在RTP中的应用:视频流的RTP传输通常将NALU作为基本的单元进行传输。每个RTP包携带一个或多个NALU,这些NALU包含了视频编码数据。RTP协议通过其头部信息(如时间戳、序列号等)帮助接收端重新排列和解码这些NALU
PS流和NALU的转化:PS流本质上是一个容器,它可以封装多个NALU。在将PS流通过网络传输时,通常会将其分解成一个个NALU,然后通过RTP传输。这意味着PS流在网络传输中的表现通常是通过RTP承载NALU来实现的(注意,一般在GB28181平台上,都是先将Nalu封装成PS流后,然后再通过RTP包进行发送)
RTP封装PS流:尽管PS流通常是MPEG-2的容器格式,但它也可以用来封装视频数据和音频数据。当使用RTP进行流传输时,PS流通常会被切分成RTP包进行发送。RTP负责将数据流化并以网络友好的方式进行传输,而PS流则可能作为RTP数据的内容进行封装
NALU
可以吧Nalu想象成视频编码数据中信封,编码器就是将编码后的视频数据封装成一个一个的Nalu,然后通过网络进行传输
NALU是视频编码(特别是H.264/H.265)中网络抽象层的单位。NALU是视频编码后生成的数据块,用于将编码数据从编码器传输到网络层(如RTP、RTSP等)。每个NALU包含一个完整的编码数据单元,可以独立解码(例如一个图像帧的部分)
主要功能:NALU中包含了视频编码的具体信息,比如图像帧的宏块、序列参数集、片段参数集等。NALU通常是H.264或H.265编码数据的基本传输单位
网络抽象层(NAL)作用分析
视频编码标准(也就类似H264 265)一般分为两个主要层次
- 视频编码层(VCL):VCL主要就是负责视频内容的压缩编码,例如预测、变换、量化、熵编码等核心编码算法都发生在这个层面。 VCL 产生的输出就是 编码后的视频数据,也就是我们常说的 视频码流
- 网络抽象层(NAL):负责 将 VCL 层产生的编码数据适配到各种不同的网络传输环境。 不同的网络传输协议(如 RTP, RTSP, MPEG-2 TS, HTTP 等)对数据的格式和传输方式有不同的要求。 NAL 的作用就是将 VCL 产生的原始码流 封装成符合特定网络协议要求的格式,以便在各种网络中可靠地传输
Nalu的结构
简单来说NALU就是由两个部分组成,分别是NALU头部信息以及NALU负载。头部信息主要包含了NALU类型等新,负载就是实际的编码数据
NALU主要功能以及编码数据类型
NALU 的核心功能就是 封装和组织编码后的视频数据,使其可以作为网络传输的基本单元
- 视频编码层NALU,该类NALU包含实际的视频编码内容,是构成视频流的主体部分
- 编码片段:常见的NALU类型,其中包含了图像帧的编码数。在真实的传输中,一个图像帧可能会被分割成多个silece nalu进行传输
- IDR图像:特殊的图像帧, 解码器可以独立解码IDR图像,不需要考虑之前的帧。IDR图像一般都是用于视频流的随机访问和错误恢复
- 非视频编码层的NALU,该NALU包含了解码器正常工作所需要的辅助信息,但是没有实际的视频帧数据
-
序列参数集 (SPS - Sequence Parameter Set): 包含了 序列级别 的解码参数,例如 视频的 profile、level、分辨率、帧率 等信息。 SPS 对于解码整个视频序列至关重要,通常在视频流的开始处发送一次,或者在视频参数发生变化时更新。
-
图像参数集 (PPS - Picture Parameter Set): 包含了 图像级别 的解码参数,例如 熵编码模式、slice 分割方式 等信息。 PPS 针对每个图像帧或一组图像帧有效,可以频繁更新。
-
补充增强信息 (SEI - Supplemental Enhancement Information): 包含了 与解码过程本身无关的辅助信息,例如 定时信息、显示信息、用户自定义数据 等。 SEI 信息对于解码器不是必需的,但可以用于增强视频播放体验或实现特定功能。
-
RTP
RTP类似于一条高速公路,专门用于快速、准时运送实时性极高的数据
RTP是一种用于实时数据传输的协议,尤其适用于音视频流的传输。它设计用于在网络中传输实时数据(如音频、视频),提供时间戳、序列号和控制信息,帮助接收方重新排序丢失的数据包
主要功能
在视频流传输中,RTP用于将视频数据(如NALU)封装并传输到接收方。RTP保证了数据的实时性和顺序,可以处理丢包、延迟等问题。每个RTP包通常包含一个或多个NALU,RTP包头提供时间戳和序列号等信息,帮助接收方恢复视频数据的时序
RTP协议特点
RTP 的设计目标是 实时性优先,而不是完全可靠性。 这意味着 RTP 尽力保证数据的及时送达和播放的流畅性,即使在网络条件不佳的情况下,可能会牺牲一些数据的完整性(例如,允许少量数据包丢失)
对于实时音视频应用(例如视频会议、在线直播),延迟 (Latency) 是一个非常关键的指标。 如果数据传输延迟过高,会导致音视频播放卡顿、画面和声音不同步等问题,严重影响用户体验。 RTP 的设计就充分考虑了实时性的需求,力求 最小化延迟
RTP的关键功能
-
时间戳 (Timestamping): RTP 包头中包含 时间戳字段。 时间戳记录了 RTP 数据包中第一个字节的采样时刻。 这个时间戳对于接收端 恢复音视频数据的时序 至关重要,主要用于:
-
同步播放: 接收端可以使用时间戳来 同步音频和视频流,确保音视频同步播放。
-
抖动处理: 网络传输中,数据包到达接收端的时间间隔可能会不均匀,产生抖动。 接收端可以使用时间戳来 平滑抖动,保证播放的流畅性。
-
-
序列号 (Sequence Numbering): RTP 包头中包含 序列号字段。 序列号用于 标识 RTP 数据包的发送顺序。 接收端可以使用序列号来:
-
数据包重排序: 在 IP 网络中,数据包可能不按发送顺序到达接收端。 序列号可以帮助接收端 将乱序的数据包重新排序,恢复原始的数据顺序。
-
检测数据包丢失: 通过检查序列号的连续性,接收端可以 检测到数据包的丢失,并采取相应的措施(例如,请求重传,或者在实时性要求较高的情况下,直接忽略丢失的数据包)。
-
-
控制信息 (Control Information) - RTCP: RTP 协议通常与 RTCP(RTP 控制协议 - RTP Control Protocol) 一起使用。 RTCP 协议与 RTP 协议 并行工作,但不传输实际的音视频数据,而是 传输控制信息,用于:
-
服务质量 (QoS) 反馈: RTCP 允许接收端向发送端 反馈网络状况和接收质量,例如 丢包率、延迟、抖动 等信息。 发送端可以根据 RTCP 反馈信息 动态调整编码参数或传输策略,以适应网络变化,优化服务质量。
-
会话管理: RTCP 可以用于 会话参与者的身份标识和管理,例如报告参与者信息、进行会话控制等。
-
RTP在视频流中的作用分析
NALU 封装: RTP 通常用于 封装视频编码后的 NALU (网络抽象层单元)。 每个 RTP 包的 负载 (Payload) 部分通常包含一个或多个 NALU。 这样,NALU 就被封装在 RTP 包中,可以通过网络进行传输
实时性和顺序保证 (尽力而为): RTP 协议 尽力保证数据的实时性和顺序,但它 不是一个完全可靠的协议。 RTP 协议本身 不提供重传机制 来保证数据包的可靠送达。 RTP 的重点在于 及时传输数据,即使在网络拥塞或不稳定的情况下,也尽量保证视频流的 连续性和流畅性,而不是追求 100% 的数据可靠性。 在网络条件较差时,可能会出现 丢包 或 延迟 等问题,但 RTP 的时间戳和序列号机制可以帮助接收端 最大限度地恢复视频数据的时序和完整性
RTP包头信息, RTP 包头中包含的关键信息(如 时间戳 和 序列号)对于接收端 恢复视频数据的时序 至关重要。 接收端可以利用这些信息进行同步播放、抖动缓冲等
PS流
PS流(Program Stream)是MPEG-2视频标准的一部分,通常用于封装和传输视频、音频、字幕等多媒体数据。它是一种容器格式,用于将多个媒体流(如视频流和音频流)组合成一个程序(program),以便于存储和传输。主要目的是将 视频、音频、字幕 等多种不同的媒体流 “打包” 成一个单一的 “节目” (Program),以便于 存储和传输。
主要功能
多媒体流复用,其可以就爱那个多个独立的媒体流(例如视频流、音频流、字符流以及其他辅助数据)组合成一个单一的、连续的数据流。该过程就类似于将不同的解码片段组合成一个完整节目
PS流在网络传输中会转换为RTP流(重点)
虽然 PS 流非常适合文件存储和物理介质传输,但它 不太适合直接用于网络传输,特别是 互联网等 IP 网络环境 中的 实时流媒体传输
-
面向文件,非面向数据包: PS 流是一种 连续的字节流格式,它没有被设计成易于分割成 网络数据包 的结构。 将其直接通过 IP 网络传输,需要进行额外的分包和重组,效率较低。
-
缺乏实时传输特性: PS 流 本身不具备 RTP 协议那样的时间戳、序列号和控制信息等实时传输特性。 在网络丢包或抖动的情况下,PS 流的抗丢包能力和时序恢复能力较弱,难以保证实时播放的流畅性。
PS流封装RTP包(重点)
在 网络流媒体应用 中,为了更好地适应 IP 网络的特点,并实现 低延迟、高效率、抗丢包 的实时传输,PS 流通常会被转换为 RTP 流
-
解封装 PS 流: 首先,将 PS 流解封装,提取出其中的 视频流 (例如 MPEG-2 视频码流) 和 音频流 等基本媒体流。
-
NALU 封装 (对于 H.264/H.265 视频): 如果视频流是 H.264 或 H.265 编码的,则将其 进一步解析为 NALU (网络抽象层单元)。 NALU 是更小的、更适合网络传输的编码数据单元。
-
RTP 封装: 将 NALU (或原始视频/音频数据) 封装到 RTP 包 中。 每个 RTP 包头会添加 时间戳、序列号 等 RTP 特有的信息。
-
通过 UDP/IP 网络传输: 将 RTP 包通过 UDP (用户数据报协议) 或 IP (互联网协议) 网络进行传输。 UDP 协议具有较低的延迟和较高的效率,更适合实时流媒体应用
I帧、P帧、B帧
基本概念
- I帧(关键帧):独立的帧,可以单独解码,无需参考其他帧。
- P帧(预测帧):依赖之前的I帧或P帧,通过预测编码减少数据量。
- B帧(双向预测帧):通过前后帧的双向预测来压缩数据,通常比P帧更加高效
I帧
I帧是视频编码中的关键帧,它是完全自包含的帧,可以独立解码,无需依赖其他帧。I帧是视频编码中的基本单元,通常作为一个完整的图像进行存储(参考电影24帧中关键帧理解)
主要特点总结
- I帧通过对每个像素点进行编码来表示图像,压缩方式较为简单,通常使用离散余弦变换(DCT)
- 因为I帧不依赖其他帧,它能够恢复图像的完整信息,所以解码时不需要任何额外的数据
- I帧通常占用较大的文件大小,因为它包含了完整的图像信息,而不像P帧和B帧那样依赖其他帧的数据来减少冗余
主要用途
- I帧通常用于视频流的切换点、视频文件的开始或其他需要快速恢复的地方。
- 在视频播放过程中,I帧可以作为参考帧来帮助解码后续的P帧和B帧。
P帧
P帧是通过参考之前的I帧或P帧进行编码的,它包含了与前面帧的差异信息。P帧只存储与前一帧的变化部分(例如运动向量),因此能大大减少数据量
主要特点
- P帧依赖于前面的I帧或P帧。它通过运动补偿和差异编码的方法,只记录与参考帧的不同之处。
- P帧的编码方式相较于I帧要高效一些,但比B帧要少些。它通常较小,并且需要通过前面的帧来解码。
- 通过对比当前帧和参考帧的不同,P帧减少了冗余信息,压缩效率较高。
主要用途
- P帧用于减少视频中的冗余信息,通过参考前面的帧来压缩数据。视频流中I帧和P帧的交替使用,使得视频编码更加高效。
- 在视频流播放过程中,P帧通常依赖于前面的I帧或P帧来恢复图像内容。
B帧
B帧是通过参考前后两帧(I帧或P帧)来预测当前帧的信息。B帧通过双向运动估计来实现比P帧更高效的压缩,能够进一步减少数据量
主要特点
- B帧与P帧的不同之处在于,它不仅依赖于前面一帧的数据,还可以参考后续的帧。它使用双向预测来求解当前帧的内容,因此能够达到更高的压缩率。
- 因为B帧需要同时依赖前后的帧,所以解码时的复杂度会更高,且B帧不能单独解码。
- B帧的数据量最小,因为它依赖于前后两帧的运动估计。
主要用途
- B帧是视频编码中压缩效率最高的帧类型,适用于大多数的非实时视频流和大文件的编码。
- 因为B帧需要参考前后帧,它通常被用于视频编码的中间部分,能够有效地提高编码效率。
编码器与解码器
基本概念
- 编码器(Encoder):负责将原始音视频数据转换为压缩格式(例如H.264、HEVC等)。
- 解码器(Decoder):负责将压缩后的数据还原为原始音视频流。
编码器
编码器的主要作用是将原始的音视频信号(如未压缩的音频或视频)转换成压缩的格式(如H.264, HEVC, AAC等)。这个过程叫做“编码”或“压缩”,它减少了数据的大小,从而便于存储和传输
工作原理总结
-
帧分割:首先,视频或音频数据会被分割成单独的帧。视频通常以图像帧为单位进行分割,而音频则通常以时间为单位进行分割(例如采样率为44.1kHz的音频会以每秒44100个采样点进行处理)。
-
变换和量化:对每一帧进行数学变换(例如DCT—离散余弦变换,或离散傅里叶变换等),将图像或音频信号转换为频域数据。然后,进行量化操作,将信号值限制在一定范围内,从而丧失一些精度,减少数据量。
-
预测和差分:对于视频编码,编码器会基于当前帧与前一帧的差异(运动估计)来进行编码。例如,视频编码中的P帧和B帧通过预测前后帧的差异来达到更高的压缩比。
-
编码:通过特定的算法对信号进行编码。例如,H.264使用的CABAC(Context-based Adaptive Binary Arithmetic Coding)或者CAVLC(Context Adaptive Variable Length Coding)进行压缩。音频编码则使用如AAC中的MDCT(Modified Discrete Cosine Transform)等变换和编码方法。
-
输出压缩数据:最终编码器将经过压缩处理的音视频数据输出为某种格式的压缩码流,常见的编码格式有H.264、HEVC(H.265)、VP9、AAC、MP3等。
解码器
解码器的作用是将压缩的音视频数据转换回原始的音视频信号。它是编码器的反向操作,目标是恢复出尽可能接近原始数据的内容。解码器通常用于播放压缩视频文件、音频文件或流媒体内容
工作原理总结
-
接收压缩数据:解码器接收来自存储或网络传输的压缩数据流(例如,H.264、HEVC、AAC等格式的文件或流)。
-
解码:解码器首先对压缩的数据进行解码操作,这个过程包括:
- 运动补偿:在视频解码中,解码器会根据编码过程中计算出的运动矢量和参考帧恢复视频帧的内容。
- 逆变换和反量化:解码器将接收到的频域数据通过逆变换(如逆DCT)转回时域数据,并通过反量化过程恢复丢失的一部分精度。
- 预测还原:对于P帧和B帧,解码器根据前后帧的参考信息恢复图像数据。
-
图像或音频输出:经过解码的数据将转换为可播放的音频信号或视频帧。例如,视频信号可以恢复为帧序列,音频信号则恢复为一系列声音波形。
-
显示或播放:对于视频解码,解码器将输出的帧传递给显示设备进行呈现;对于音频解码,输出的音频数据传递给音响设备进行播放。
码流
经过压缩和编码的音视频数据流。它包含了编码后的视频信息和音频信息。
视频码流
视频码流通常是由一系列编码后的帧(I帧、P帧、B帧)组成,它们按照一定的顺序(例如,GOP——图像组)排列。视频码流的结构包括以下几个主要部分
-
帧数据:包括压缩后的视频帧数据(例如H.264编码中的NAL单元),表示视频每一帧的内容。每一帧可以是I帧(关键帧)、P帧(预测帧)或B帧(双向预测帧)。
-
NAL单元(Network Abstraction Layer Units):在H.264/HEVC等编码标准中,视频码流被分割成多个NAL单元。每个NAL单元包含一个或多个编码后的视频数据,负责存储视频帧的压缩信息。NAL单元是视频码流的基本组成单元。
-
头部信息:包括一些控制信息,如编码参数、分辨率、帧率、参考帧信息等,这些用于指导解码器如何正确解码视频流。
-
时间戳:码流中通常会有时间戳,用来指示视频帧的展示时间和播放顺序。
-
封装格式:视频码流通常会被封装成容器格式,如 MP4、MKV、AVI 等,这些容器格式将视频流、音频流、字幕流等多个媒体流组合在一起,便于存储和传输。
音频码流
音频码流则是经过音频编码(如 AAC、MP3、Opus 等)处理后产生的二进制数据流。它的结构一般包括
-
帧数据:音频码流包含一系列音频帧(例如,AAC中的音频帧)。每一帧可能包含一段音频的压缩信息。
-
头部信息:包括音频格式、采样率、通道数、比特率等音频的基本属性。
-
时间戳:音频码流同样会包含时间戳,以便音频能够与视频同步播放。
-
封装格式:音频流也常常与其他多媒体数据一起封装在容器文件中,如 MP4、MKV、FLV 等。
视频码流主要类型
- H.264/AVC(Advanced Video Coding):一种广泛使用的视频编码标准,压缩效率较高,广泛应用于网络视频流、蓝光光盘、高清电视等。
- HEVC/H.265(High Efficiency Video Coding):H.264的继任者,提供比H.264更高的压缩效率,广泛用于4K视频压缩。
- VP9:Google推出的视频编码格式,广泛应用于YouTube等流媒体平台。
- AV1:新的开源视频编码标准,提供比HEVC和VP9更高的压缩效率,主要用于高质量视频流和Web视频播放。
音频码流主要类型
- AAC(Advanced Audio Codec):一种高效的音频编码格式,广泛应用于流媒体和广播。
- MP3(MPEG Audio Layer III):早期广泛使用的音频编码格式,压缩效率较低,但依然广泛存在。
- Opus:一种低延迟音频编解码器,特别适用于实时通信(如VoIP)和音频流。
SEI
概念
SEI是视频流中附加的信息,通常用于增强视频质量、实现更高效的编码或者提供额外的传输信息。它通常不会影响解码,但对于解码后的显示或者处理有帮助。
视频编码中的作用
- 显示与呈现:包括视频播放中的显示特性、颜色空间信息、色度调整等,用于增强视频的显示效果。
- 后期处理:提供用于后期视频处理的参数,例如去噪、锐化、增强对比度等。
- 传输优化:在网络传输过程中,通过SEI提供一些动态调整参数或网络条件信息,从而优化传输质量。
- 编码优化:在编码阶段,SEI可以传输一些额外的辅助信息,帮助解码器或显示设备更好地适应编码特性,改善视频质量。
与Nalu的关系
在H.264和HEVC等编码标准中,SEI通常以**NALU(Network Abstraction Layer Units)**的形式存在。NALU是视频码流的基本单位,用来包装各种编码信息,而SEI则是被包装在某些类型的NALU中作为附加信息进行传输
注意,SEI在国标平台上传输,也是需要先封装成PS流,然后再打成RTP包进行发送