H264 编解码器:
编解码器规范在概念上区分视频编码层(VCL) 和网络抽象层(NAL)。
VCL编码器输出切片:一点包含整数个宏块数据的字符串宏块和切片头信息。NAL编码器将VCL编码器的切片封装成网络抽象层单元(NAL),适用于通过分组网络或者面向分组的多路复用环境。
F: 1 bit forbidden_zero_bit. The H.264 specification declares a value of 1 as a syntax violation.
NRI: 2 bits nal_ref_idc. A value of 00 indicates that the content of the NAL unit is not used to reconstruct reference pictures for inter picture prediction. Such NAL units can be discarded without risking the integrity of the reference pictures. Values greater than 00 indicate that the decoding of the NAL unit is required to maintain the integrity of the reference pictures.
Type: 5 bits nal_unit_type. This component specifies the NAL unit payload type as defined in Table 7-1 of [1] and later within this memo. For a reference of all currently defined NAL unit types and their semantics, please refer to Section 7.4.1 in [1]
IDR picture: A coded picture containing only slices with I or SI slice types that causes a "reset" in the decoding proces
h264 rtp打包载荷结构有三种:单一NAL单元模式、组合封包模式、分片封包模式。
参考:RFC 6184 - RTP Payload Format for H.264 Video
1、单一NAL单元模式
即一个RTP包仅由一个完整的NALU组成。这种情况下RTP NAL头类型字段和原始的H.264的NALU头类型字段是一样的。对于NALU的长度小于MTU大小的包,一般采用单一NAL单元模式。对于一个原始的H.264NALU单元常由[StartCode][NALUHeader][NALUPayload]三部分组成,其中StartCode用于标示这是一个NALU单元的开始,必须是"00 00 00 01"或"00 00 01",NALU头仅一个字节,其后都是NALU单元内容。打包时去除"00 00 01"或"00 00 00 01"的开始码,把其他数据封包的RTP包即可。
https://datatracker.ietf.org/doc/html/rfc6184
2、组合封包模式
由多个NAL单元组成一个RTP包。组合打包又分STAP(Single-time aggregation packet)、MTAP(Multi-time aggregation packet)两种。
单时间聚合包,聚合具有相同NALU时间的NAL单元。定义两种STAPs类型,一个没DON(STAP-A),另一个包含DON(STAP-B)。
不包含DON:
包含DON:
多时间聚合包,聚合具有潜在不同NALU时间的NAL单元。定义了两个不同的MTAPs,其NAL单元的时间戳偏移的长度不同。
用于把一个NALU单元封装成多个RTP包。存在两种类型FU-A和FU-B。类型值分别是28和29。而当NALU的长度超过MTU时,就必须对NALU单元进行分片封包。也称为Fragmentation Units(FUs)。将NALU拆分成小于MTU的数据包进行发送。
F:1个比特.
forbidden_zero_bit. 在 H.264 规范中规定了这一位必须为 0.
NRI:2个比特.
nal_ref_idc. 取00~11,似乎指示这个NALU的重要性,如00的NALU解码器可以丢弃它而不影响图像的回放,0~3,取值越大,表示当前NAL越重要,需要优先受到保护。如果当前NAL是属于参考帧的片,或是序列参数集,或是图像参数集这些重要的单位时,本句法元素必需大于0。
Type:5个比特
nal_unit_type. 这个NALU单元的类型,1~12由H.264使用,24~31由H.264以外的应用使用,简述如下:
0 没有定义
1-23 NAL单元 单个 NAL 单元包
1 不分区,非IDR图像的片
2 片分区A
3 片分区B
4 片分区C
5 IDR图像中的片
6 补充增强信息单元(SEI)
7 SPS
8 PPS
9 序列结束
10 序列结束
11 码流借宿
12 填充
13-23 保留
24 STAP-A 单一时间的组合包
25 STAP-B 单一时间的组合包
26 MTAP16 多个时间的组合包
27 MTAP24 多个时间的组合包
28 FU-A 分片的单元
29 FU-B 分片的单元
30-31 没有定义
S: 1 bit When set to one, the Start bit indicates the start of a fragmented NAL unit. When the following FU payload is not the start of a fragmented NAL unit payload, the Start bit is set to zero. E: 1 bit When set to one, the End bit indicates the end of a fragmented NAL unit, i.e., the last byte of the payload is also the last byte of the fragmented NAL unit. When the following FU payload is not the last fragment of a fragmented NAL unit, the End bit is set to zero. R: 1 bit The Reserved bit MUST be equal to 0 and MUST be ignored by the receiver. Type: 5 bits The NAL unit payload type as defined in Table 7-1 of 。
h264的rtp打包模式有如下三种:1、Single NAL unit mode;2、Non-interleaved mode;3、Interleaved mode.
根据协议,模式1/2,适合低延时的实时会议系统。模式3适合对系统延时要求不高的传输系统。模式1遵守ITU-T Recommendation H.241协议。模式2不按照这个协议来。三种模式下支持的NAL Unit Type类型如下:
webrtc只支持Single NAL unit mode和Non-interleaved mode两种打包模式。
webrtc通过VideoCodec::SetDefaultParameters函数配置kH264FmtpPacketizationMode参数,配置RTP发包模式。
封包实现函数RtpPacketizerH264::GeneratePackets。
解包实现函数RtpDepacketizerH264::Parse。
RtpDepacketizerH264::ParseH264PictureID
RtpDepacketizerH264::ParseH264Extension
RtpDepacketizerH264::ProcessStapAOrSingleNalu
RtpDepacketizerH264::Parse
RTPReceiverVideo::ParseRtpPacket
RtpReceiverImpl::IncomingRtpPacket
RtpVideoStreamReceiver::ReceivePacket
RtpVideoStreamReceiver::OnRecoveredPacket
UlpfecReceiverImpl::ProcessReceivedFec
RtpVideoStreamReceiver::ParseAndHandleEncapsulatingHeader
RtpVideoStreamReceiver::ReceivePacket
RtpVideoStreamReceiver::OnRtpPacket
RtpDemuxer::OnRtpPacket
RtpStreamReceiverController::OnRtpPacket
internal::Call::DeliverRtp
internal::Call::DeliverPacket
WebRtcVideoChannel::OnPacketReceived
BaseChannel::ProcessPacket
video_coding::RtpFrameReferenceFinder::ManageFrame
RtpVideoStreamReceiver::OnReceivedFrame
video_coding::PacketBuffer::InsertPacket
RtpVideoStreamReceiver::OnReceivedPayloadData
RTPReceiverVideo::ParseRtpPacket
RtpReceiverImpl::IncomingRtpPacket