首页 > 编程知识 正文

格式工厂h265转码,h. 265编码流代码

时间:2023-05-04 10:36:10 阅读:119646 作者:986

一、概述

本文介绍了对H264编码并封装为MP4格式的视频流进行RTP打包时需要了解的基本知识。

二、H264的基础知识

1.H264的编码格式

由H.263定义的码流结构为分层结构,共有4层。 从上面开始,依次是图像层(picturelayer )、块组层(block grayer )、宏块层(macro block layer )、块层(block layer )。 与H.263相比,H.264的码流结构与H.263有很大不同,没有采用严格的分层结构。 H.264支持对4:2:0连续或隔行视频进行编码和解码。 与H.263、MPEG-4相比,H.264压缩的视频压缩比提高了两倍。

H.264的功能被分成两层,即视频编码层(VCL,视频编码层)和网络提取层(NAL,网络附加层)。 VCL数据是编码处理的输出,并且表示经压缩经编码的视频数据序列。 在传输或存储VCL数据之前,这些编码的VCL数据被映射或封装到NAL单元中。 每个NAL单元包括RBSP、原始字节序列载荷和对应于视频编码的NAL报头信息的集合。 RBSP的基本结构是在原始编码数据的后面写入了末尾比特。 1比特“1”的几比特“0”使得字节对齐。

2.H264的传输

H.264经编码视频序列包括一系列NAL单元,且每个NAL单元包括RBSP。 参照表1。 代码片(包括数据分割片IDR片)和序列RBSP结束符定义为VCL NAL单元,其余为

是NAL单元。 图2描述了一个典型的RBSP单元序列。 每个单元按独立的NAL单元传输。 的头部(1字节)定义了RBSP单元的类型,而NAL单元的剩馀部分是RBSP数据。

3.H264的码流结构

开始代码:如果与NALU对应的Slice是一帧的开始,则用4字节表示。 即0x00000001; 否则用3字节表示,0x000001。

一个frame可以被划分成多个Slice并被编码,在对一个Slice进行编码之后,将其封装成一个NAL单元,但是在NAL单元中除了Slice经编码的码流之外,还包括序列参数集合SPS

三、MP4封装的H264数据

MP4文件中的所有数据都封装在box中,并由多个子box组成。 每个box可以包含不同的子box,每个box都有长度和类型。 ftyp (66747970 ) box:用作MP4格式的标志,并包含有关文件的信息。 只有一个。 “moov”(6D6 F6 f 76 ) box:包含介质的元数据信息,特别是avcC的sps和pps,只有一个。 包括“mdat”(6d 646174 ) box:MP4在内的媒体数据可以是多于或少于多个。 但是,媒体数据的结构是通过元数据描述的。 在MP4中,box存储方式处于大终端模式。 一般来说,标准框的开头有4字节的框大小。

在MP4格式文件中,H264 slice存储在mdat box中,而不是按00 00 00 01拆分。 H264基本码流由几列NALU组成。 原始NALU设备配置:开始代码[ nalu header ] [ nalu payload ]。

MP4数据格式|'ftyp'box|'moov'box及其子box|'mdat'box|.|。

' mdat'box格式(box的长度(4字节) box类型) 4字节) mdat-6d 64 61 74字节(|NALU的长度) 4字节)|NALU的header(1) 1字节|

MP4封装结构图:

长方体地图:

用MP4info分析的实例分析图:

四、H264视频流的RTP封包

1.RTP打包原则

RTP的数据包长度必须小于最大传输单元(MTU ),IP协议的最大MTU长度为1500字节。 除IP报头(20字节)、UDP报头(8字节)、RTP报头(12字节)之外的所有RTP有效载荷,也就是NALU内容的长度不能超过1460字节。

http://www.Sina.com/http://www.Sina.com /

前十二进制数字显示在每个RTP包中,但CSRC标识列表仅在插入混合器时显示。 各分段的含义如下:

版本(v )2.version (V ) v ) : 2位,标识RTP版本,协议初始版本为0

,RFC3550中规定的版本号为2。。
②填充标识(P)
padding (P): 1 bit   1位,如设置填充位,在包末尾包含了额外的附加信息,它不属于有效载荷。附加信息的最后一个字节表示额外附加信息的长度(包含该字节本身)。该字段之所以 存在是因为某些加密算法需要固定大小的填充字,或为在底层协议数据单元中携带几个RTP包。
③扩展(X)
extension (X): 1 bit           1位,如果该位被设置,则在固定的头部后存在一个扩展头部,格式定义在RFC3550 5.3.1节。
④CSRC计数(CC)
CSRC count (CC): 4 bits    4位,CSRC计数包括紧接在固定头后标识CSRC个数。
⑤标记(M)
marker (M): 1 bit     1位,标记解释由设置定义,目的在于允许重要事件在包流中标记出来。设置可定义其他标示位,或通过改变位数量来指定没有标记位,该位的功能依赖于 profile的定义。profile可以改变该位的长度,但是要保持marker和payload type总长度不变(一共是8 bit)。。

或M:标示位,1 位。如果当前 NALU为一个接入单元最后的那个NALU,那么将M位置 1;或者当前RTP 数据包为一个NALU 的最后的那个分片时(NALU 的分片在后面讲述),M位置 1。其余情况下M 位保持为 0。
⑥载荷类型(PT)
payload type (PT): 7 bits   7位,记录后面资料使用哪种 Codec , receiver 端找出相应的 decoder 解碼出來,该位标记着RTP packet所携带信息的类型,标准类型列出在RFC3551中。如果接收方不能识别该类型,必须忽略该packet。
⑦系列号
sequence number:16 bits  16位,系列号随每个RTP数据包发送后而增加1,接收方可以根据该序列号重新排列数据包顺序,或者探测包损失。系列号初值是随机的,使对加密的文本攻击更加困难。
⑧时间戳
timestamp: 32 bits    32位,时标反映RTP数据包中第一个八进制数的采样时刻,采样时刻必须从单调、线性增加的时钟导出,以允许同步与抖动计算。时标可以让receiver端知道在正确的时间将资料播放出来。实际中当采用”分片封包模式“打包RTP时,当一个NALU打包完毕时,时间戳更一次。


 

   由上图可知,如果只有系列号,并不能完整按照顺序的将data播放出来,因为如果data中间有一段是没有资料的,只有系列号的话会造成错误,需搭配上让它知道在哪个时间将data正确播放出来,如此我们才能播放出正确无误的信息。
⑨SSRC
SSRC: 32 bits                     32位,SSRC段标识同步源。此标识不是随机选择的,目的在于使同一RTP包连接中没有两个同步源有相同的SSRC标识,也就是在一个RTP Session其间每个数据流都应该有一个不同的SSRC。尽管多个源选择同一个标识的概率很低,所有RTP实现都必须探测并解决冲突。如源改变源传输地 址,也必须选择一个新SSRC标识以避免插入成环行源。
⑩CSRC列表
CSRC list: 0 to 15 items     bits0到15项,每项32位。CSRC列表表示包内的对载荷起作用的源。标识数量由CC段给出。如超出15个作用源,也仅标识15个。CSRC标识由 混合器插入,采用作用源的SSRC标识。只有存在Mixer的时候才有效。如一个将多声道的语音流合并成一个单声道的语音流,在这里就列出原来每个声道的 SSRC。

3.NALU header结构图

NALU header由一个字节组成, 它的语法如下:

F: 1 个比特.forbidden_zero_bit. 在 H.264 规范中规定了这一位必须为 0.

NRI: 2 个比特.nal_ref_idc. 取 00 ~ 11, 似乎指示这个 NALU 的重要性, 如00的NALU解码器可以丢弃它而不影响图像的回放. 不过一般情况下不太关心这个属性.

Type: 5 个比特.nal_unit_type. 这个 NALU 单元的类型. 但是在h264中只有 1~23 是有效的值.而其他的24~29在RTP封包采用”组合封包模式“和”分片封包模式“时所用的type类型,而非“单一NAL单元模式”时。

简述如下:

  0     没有定义
  1-23  NAL单元  单个 NAL 单元包.
  24    STAP-A   单一时间的组合包
  25    STAP-B   单一时间的组合包
  26    MTAP16   多个时间的组合包
  27    MTAP24   多个时间的组合包
  28    FU-A     分片的单元
  29    FU-B     分片的单元
  30-31 没有定义

4.RTP打包模式

主要分为三种模式:单一NALU模式、分片模式、组合模式,实际中前两种用的比较多。

(1)单一NALU模式

一个RTP包仅由一个完整的NALU组成。这种情况下RTP NAL头类型字段和原始的H.264的NALU头类型字段是一样的。适合条件是当NALU的长度小于RTP包长减去12时。

特别NALU type 值为 7 和 8 的NALU分别为序列参数集(sps)和图像参数集(pps)。

(2)组合封包模式

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

(3)分片封包模式Fragmentation Units (FUs)

用于把一个 NALU 单元封装成多个 RTP 包. 存在两种类型 FU-A 和 FU-B. 类型值分别是 28 和 29。适合条件当 NALU 的长度超过 MTU 时, 就必须对 NALU 单元进行分片封包. 

FU indicator 结构

 
F:当网络识别此单元存在比特错误时,可将其设为 1,以便接收方丢掉该单元。
NRI:必须根据分片NAL单元的NRI域的值设置,用来指示该NALU的重要性等级。值越大,表示当前NALU越重要。
TYPE:28表示FU-A和29表示FU-B

FU Header 结构:

S:当设置成1,开始位指示分片NAL单元的开始。当跟随的FU荷载不是分片NAL单元荷载的开始,开始位设为0。                
E:当设置成1,结束位指示分片NAL单元的结束。即荷载的最后字节是分片NAL单元的最后一个字节。当跟随的FU荷载不是分片NAL单元的最后分片,结束位设置为0。
R:保留位必须设置为0,接收者必须忽略该位。

Type:与NALU的header中的Type类型一致。

 

 

 

 

 

 

转载于:https://www.cnblogs.com/ghw-NO1/archive/2012/08/28/2660848.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。