H264的打包,nal,es,pes,pts,dts,ps,ts

编码层次

  • 视频编码层:预测、变换、量化、熵编码等操作
  • slice层:将视频帧分割成若干个编码单元,包含一定数量的宏块,提高编解码的并行性和容错性。
  • NAL层:提升对网络传输和数据存储的亲和性

视频编码层

  • 基准-Baseline Profile:主要用于视频会议、可视电话等实时通信领域;支持IP帧,熵编码支持 CAVLC 算法
  • 主要-Main Profile:主要用于数字电视广播、数字视频数据存储等;支持视频场编码、IPB帧。熵编码支持 CAVLC 和 CABAC
  • 扩展-Extended Profile:主要用于网络视频直播和点播等;支持基准所有特性,支持 SI 和 SP 条带

编码的概念

  • 序列:一组变化不大的图像
  • 帧:一个视频图像编码后的数据,一帧由一片或多片组成、一片由多个宏块组成。宏块是编码的基本单位
  • GOP:图像组,类似与序列
  • IDR:立即刷新帧,一定是 I帧,清空参考帧缓冲区

分层结构

在这里插入图片描述

  • SODB:视频编码层输出编码的数据后,经过数据划分,输出 SODB(String of Data Bits)数据比特串

  • RBSP:NAL层 将 SODB 打包成 RBSP (Raw Byte Sequence Payload)原始字节序列负载,在SODB 后面添加1和若干0字节对齐

  • EBSP:Encapsulated Byte Sequence Payload, 扩展字节序列载荷,RBSP加上NAL头就是一个NALU 单元,起始码 三字节的 0x000001 或 四字节的 0x00000001。access unit ,pps,sps 是 四字节。

  • NALU结束是三字节的 0x000000,防止数据中间出现0x000000,中间每遇到两个0x00就插入一个0x03
    -在这里插入图片描述

  • NAL头:8位

    • F(forbiden)禁止位 0:为1时语法错误
    • NRI 参考级别 1-2:值越大,越重要
    • TYPE Nal 单元数据类型 3-7:数据类型
      在这里插入图片描述

参数集

SPS-序列参数集

  • profile信息,baseline,main,extended
  • 码流level,不同的level定义了最大分辨率,最大帧率,最大码率,1080P30FPS20Mbps是 Level4.0
  • 色彩空间
  • 码率控制参数
  • 熵编码参数

PPS-图像参数集

  • 图像类型:IPB
  • 参考帧选择
  • 解码器配置
  • 参数集索引

ES-Elementary Streams(原始流)

  • 包含视频和音频
  • 视频是 NALU
  • 音频则是音频帧
  • 只含视频或音频
  • 由若干个 AU(Access Unit)组成

PES-Packetized Elementary Streams(分组的 ES)

  • ES流经过PES打包器形成的数据流,将ES流分组,打包,加入包头信息

PTS PresentationTime Stamp(显示时间标记)、DTS Decoding Time Stamp(解码时间标记)

  • 打包在PES包头内
  • 解决音视频同步显示
  • 防止解码器输入缓存上溢或下溢
  • 每个 IPB 帧包头都有一个 pts dts
  • B帧可以不标记 dts,因为通常同时参考前后两帧
  • B帧的解码顺序和显示顺序可能不同

PS Program Stream(节目流)

  • 由若干个 PES 包组成
  • 包含同步信息和时钟恢复信息
  • 最多可包含同一时间基准的16个视频PES和32个音频PES包
  • 可变长度的
  • 信道环境较好,传输误码率较低时使用PS码流

TS Transport Stream(传输流)

  • 定长的 TS 包组成 188 字节,或加上16字节的 CRC 校验数据
  • 是对 PES 包的重新封装
  • 信道环境较为恶劣、传输误码率较高时使用TS码流
  • 头 四字节,负载 184字节
  • 在这里插入图片描述

PAT 表,PMT 表

  • 通常只用于数字电视,实际网络传输用不到

`x264_nal_t`结构体是x264库中用于存储编码后的NAL数据信息的结构体,其中不包含PTSDTS、Duration和Index等信息,需要使用外部变量或函数进行传递或计算。具体实现时,可以按照以下步骤获取PTSDTS、Duration和Index等信息: 1. 在调用x264_encoder_encode函数进行编码时,可以将PTSDTS作为x264_picture_t结构体变量的i_pts和i_dts字段进行设置,例如: ``` x264_picture_t pic_in, pic_out; // 设置图像数据 pic_in.i_pts = pts; pic_in.i_dts = dts; // 编码一帧图像 int ret = x264_encoder_encode(encoder, &nal, &nnal, &pic_in, &pic_out); ``` 2. 在编码完成后,可以根据视频帧率和编码时长计算出Duration信息,例如: ``` int frame_rate = 25; // 视频帧率 int duration = 1000 / frame_rate; // 每帧编码时长(毫秒) ``` 3. 在传递x264_nal_t结构体变量时,可以使用外部变量或函数传递Index信息,例如: ``` int nal_index = 0; // NAL序号 for (int i = 0; i < nnal; i++) { x264_nal_t *nal_ptr = &nal[i]; // 设置NAL信息 nal_ptr->i_ref_idc = 0; nal_ptr->i_type = NAL_SLICE; nal_ptr->i_payload = nal_size[i]; nal_ptr->p_payload = nal_data[i]; nal_ptr->i_nal_units = nnal; nal_ptr->i_nal_unit = i; nal_ptr->i_temporal_reference = nal_index++; } ``` 通过以上步骤,就可以获取到PTSDTS、Duration和Index等信息,并将编码后的NAL数据存储到x264_nal_t结构体中。需要注意的是,具体实现时还需要根据具体情况进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值