PS流详解(载荷H264)

2023-05-16

目录

  • PS简介
  • 标准结构
    • 标准H264流结构
    • 定长音频帧和其他流式私有数据的结构
  • PS流封装标准
    • PSH结构
    • PES包结构
    • PSM包结构体
  • 元素流 PS 封装规则
    • H264元素流封装规则
    • 音频元素流封装规则
    • 私有信息封装规则

PS简介

PS 封装方式需要支持 MPEG2/MPEG4/H.264 等视频和 MPEG 系列音频,可以被大部分支持 PS 和相应元素流解码的播放器正常播放,支持在多个层次加入私有数据,方便解码、拖动和减小延时,同时考虑到标准的 PS、TS 和 RTP 封装方式间的相互转换,提高处理效率

标准结构

标准H264流结构

详解H264标准

标准 H.264 流以 0x00 00 00 01 起始码为标志分割成若干单元,称之为 Network Abstraction Layer
unit,缩写 NALu,其一般顺序为

//如果出现 
Access Unit Delimiter; 简称 AUD,起始码 0x00 00 00 01 09
Sequence Parameter Set; 简称 SPS, 起始码 0x00 00 00 01 67
Picture Parameter Set; 简称 PPS, 起始码 0x00 00 00 01 68 
Slice 0 of IDR Picture; 起始码 0x00 00 00 01 65
Slice 1 of IDR Picture; 起始码 0x00 00 00 01 x5 或 x1
…………………………………

H.264 标准可以将一帧图像分成多个 Slice 进行编码,每个 Slice 会输出一个 NALu,例如对一幅
图像进行两场编码,则有两个 NALu

定长音频帧和其他流式私有数据的结构

定长音频帧和其他流式私有数据的结构本文中不做具体规定,但要求其中不出现 0x000001 形式
的伪起始码

PS流封装标准

在这里插入图片描述
一个 PS 流或者文件可以视为多个 PS GOP,每个 GOP 是以 I 帧起始的多帧集合,各 GOP 之间
的信息没有相互依赖性,可以进行剪切拼接。一个 PS GOP 由一个或多个 PS 包组成,一个 PS 包内包含一个 PSH(PS Header)和若干个 PES 包,每个 PS GOP 的第一个 PS 包应当在包头 PSH 后立即跟随一个 PSM 包。PSM 包是一种特殊的 PES 包,含有对其他 PES 负载数据类型的描述。PS 包内的其他 PES 的出现顺序和内容没有特殊约束,即一个 PS 包内可以包含交错出现的视频、音频和私有流等 PES 包,各 PES 包根据 PSM 的描述进行拆分。

PSH结构

PSH (Program Stream pack Header)是 PS 包的包头,主要包含系统时间信息。常用的 PSH 的语法定义如下:

PSH (){ 									位数: 	注释:
pack_start_code 							32 bit 	0x 00 00 01 BA
‘012 		MPEG2 标志
system_clock_reference_base [32..30] 		3
marker_bit 									1
system_clock_reference_base [29..15] 		15
marker_bit 									1
system_clock_reference_base [14..0] 		15
marker_bit 									1
system_clock_reference_extension 			9
marker_bit 									1
program_mux_rate 							22
marker_bit 									1
marker_bit 									1
reserved 									51”
pack_stuffing_length 						3 		此字段之后填充字节的数目
for( i = 0 ; i < pack_stuffing_length ; i++)
	{
		stuffing_byte; 						8		 0x FF; 每个组头不能多于 7}
}

pack_start_code32 bit 值为 0x 00 00 01 BA
system_clock_reference_base: 33bit
单位为 90kHz 时钟,为了处理方便建议输入接口取其高 32 位,即 45kHz 时钟。
system_clock_reference_extension: 9bit
SCR, system clock reference, 把系统频率的 1/300 编成 33 位码。再加上 9 位余数。
system_clock_reference_base: (system_clock_frequency* t ( ))DIV 300%2^33;
system_clock_reference_extension: (system_clock_frequency* t ( ))%300
system_clock_frequency: 27MHz
由于大部分系统不需要如此精确的时钟,建议 system_clock_reference_extension = 0。
marker_bit: 1bit 值为1。

program_mux_rate: 22bit
表示接收此字段所在分组的程序流的速率。值以每秒 50 字节为单位。禁止0值。
pack_stuffing_length:3bit 此字段之后填充字节的数目
stuffing_byte: 8bit; 值为 0x FF。
考虑到 4 字节对齐问题,建议 pack_stuffing_length = 6

需要注意的是,PSH 主要包含了系统同步时间,MPEG2 part 1 并没有定义 PSH 与其后数据之 间的必然关系。虽然 PSH 是一个PS 包的包头,但 PSH 本身并不包含 PS 包负载数据的内容和长度信息,这些信息存在于作为 PS 包负载的 PES 包内,一个 PS包内包含的 PES 包个数、类型和长度没有限制。也就是说,一个 PS 流文件只需要有头上一个 PSH,后面的视频、音频和私有数据PES包可以交错排列。但是作为系统同步的需要,PSH 应当以一定的频率在流中出现

PES包结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
packet_start_code_prefix: 24bit ; 值为 0x 000001(网络序,下同)
stream_id: 用来区分 PES 分组负载,例如,0x e0~0x ef 表示负载为视频 PES.

stream_id 定义如下(bit 表示):
1110 xxxx 视频 PES 
110x xxxx 音频 PES
1011 1101 包含时标数据的私有 PES
1011 1110 填充 PES(填充数据为 0xff1011 1111 不含时标数据的私有 PES,不需要与其他流同步时使用

PES_packet_length: 16bit
此字段后 PES 分组的字节数。‘0’表明对 PES 分组长度既没有说明也没有限制,这种情况只
有在 PES 分组的有效负载是 TS 流分组中的视频原始流时才允许。
PES_scrambling_control: 2bit
表示 PES 分组有效负载的加密模式,不加密时建议置 0,否则置 01,10 和 11 保留。
PES_priority: 1bit
指示 PES 分组负载的优先级。1高优先级,0低优先级。非参考帧(包括 B 帧和海康流中使用
E 帧时的 P 帧)应置 0,其余帧置 1。
data_alignment_indicator: 1bit
置1表明此 PES 分组头部之后是 data_stream_alignment_descriptor 所定义的访问单元数据类型。
若为‘0’,则没有定义是否对准。建议当是输入单元的第一个包时置 1,其余置 0。
copyright: 1bit
置‘1’,表明相应 PES 分组的有效负载中的数据是有版权的,建议置 0。
original_or_copy: 1bit
建议置 1。
PTS_DTS_flag,:2bit
标志 PES 首部含有 PTS, DTS 的状态。‘1x’表明 PES 首部含有 PTS,若为‘x1’, 则首部含有
DTS。PTS, presentation_time_stamp, DTS, decoding_time_stamp, 建议置‘10’或‘00’。
ESCR_flag: 1bit
置‘1’表示 ESCR 的 base 和 extension 字段都在 PES 分组首部出现;建议置 0。
ES_rate_flag: 1bit
置‘1’表示 PES 首部有 ES_rate 字段;建议置 0。
DSM_trick_mode_flag: 1bit
置‘1’表示 PES 首部有 8bit 的 trick_mode_field;建议置 0。
additional_copy_info_flag: 1bit
置‘1’表示有 additional_copy_info 字段;建议置 0。
PES_CRC_flag: 1bit
置‘1’表示在 PES 首部分组中有 CRC 字段;建议置 0。
PES_extension_flag: 1bit
置‘1’可选字段出现,当需要在每帧添加私有数据时建议置 1,其余情况置 0
PES_header_data_length: 8bit
表示 PES 分组首部中可选字段和填充字节的总字节数。
marker_bit: 1bit, 值为1。
PTS: 33bit
Presentation Time Stamp,表示该 PES 所包含的元素流单元的显示时刻。
PES_private_data_flag: 1bit
置‘1’表示 PES 分组首部中含有私有数据;当需要在每帧添加私有数据时建议置 1,其余情
况置 0,具体见 3.3。
pack_header_field_flag: 1bit
置‘1’表示一个 ISO/IEC 11172 组首部或程序流组首部存储在此 PES 分组首部,建议置 0。
program_packet_sequence_counter_flag: 1bit
置‘1’表示 PES 分组中有 program_packet_sequence_counter 和 original_stuff_length 字段。建
议置 0。
P-STD_buffer_flag: 1bit
置‘1’表示 PES 分组首部中有 P-STD_buffer_scale 和 P-STD_buffer_size 字段;建议置 0。
PES_private_data: 128bit 用户私有数据,见可用扩展字段说明。
PES_extension_flag2: 置‘1’表示出现 PES_extension_field; 建议置 0。
stuffing_byte: 填充字节,根据标准编码其应当在此填入 0xff,解码器端应当将这些字节抛弃。但为
了减少解码延时,本文在此建议进行扩展

需要注意的是,当对原始流进行 PES 分组,尤其是需要将一帧信息断开分成多个 PES 分组时,
从第二个分组开始不需要 PTS,PES_header_data_length 和它前面的一个字节又都为 0x00,很可能与后面断开的数据组合形成 0x00 00 01 等类似的伪起始码或关键字,令解码端在收到流不完整时产生误判,因此填充字节 stuffing_byte 至少必须加入 1 byte 以确保这种误判不会发生。同时为了入一些私有信息,目前规定 stuffing_byte 至少必须加入 2byte

PSM包结构体

program_stream_map(PSM)节目流映射提供了关于节目流中原始流以及它们之间相互关系的描述。作为一个 PES 分组出现
在这里插入图片描述
packet_start_code_prefix:24bit 0x00 00 01
map_stream_id: 8bit 其值为 0xBC
program_stream_map_length: 16bit

表示在此字段之后节目流映射的字节总数。最大为 1024。
current_next_indicator: 1bit
‘1’ 表示该表当前可用。‘0’表示当前不可用,下一个有效,建议置 1。
program_stream_map_version: 5bit
节目流映射的版本号。此版本号随着节目流映射定义的每次改变而加1。其值达到 31 后,回复
到0。
program_stream_info_length: 16bit
表示此字段之后 descriptor 的总长度。
marker_bit: 1bit, 值为1。
elementary_stream_map_length: 16bit
规定在此节目流映射中所有原始流信息的总字节数。
stream_type: 8bit
对节目中各个流的编码方式进行标志,详细定义参考下表。
在这里插入图片描述
在这里插入图片描述
本文在此基础上,在 User Private 字段添加如下定义
在这里插入图片描述
elementary_stream_id: 8bit
表示此原始流所在 PES 分组的首部中 stream_id 的值。
elementary_stream_info_length: 16bit
表示此字段之后描述子的字节数。
CRC_32: 32bit
32bit CRC 校验码。
表中的 descriptor()描述了关于节目流和各个原始流的一些基本特征,其结构如下
在这里插入图片描述

元素流 PS 封装规则

H264元素流封装规则

  • 1、一个网络抽象单元(NALu)视为一个处理单元,编码器一帧编码后输出可能是多个处理单元;

  • 2、除 B 帧外的帧输出的多个单元封装时应当在第一个单元头部添加 PSH;

  • 3、当一个 NALu 单元长度超过系统 PES 包长限制时,可以将该 NALu 分割成多个 PES 包,但每个 PES 包内不应当包含多于 1 个 NALu 的数据;

  • 4、每个帧的第一个处理单元所封装成的第一个 PES 包包头应当带有 PTS;

  • 5、每个 I 帧封装时应当在 PSH 之后添加 PSM;

  • 6、当元素流的基本特性(编码格式,帧率,分辨率,场编码等)发生变化时,变化后的第一帧封装时必须在 PSH 之后添加 PSM;

在这里插入图片描述在这里插入图片描述

音频元素流封装规则

  • 1、在音视频同步时序条件允许的情况下,连续的一个或多个音频帧可以合并,每帧视为一个处理单元;

  • 2、当音频帧长度不大于 PES 包负载或网络传输单元所能承受的最大长度时,建议将每个音频帧封装成一个单独的 PES 包;

  • 3、每次处理的第一个音频帧所形成的第一个 PES 包头应当带有 PTS,其余音频帧所形成的第一个 PES 包头建议带有 PTS;

  • 4、当系统不包含视频流时,PSH 在流中出现的间隔应当小于 1 秒,PSM 的出现间隔应当小于 4 秒;当音频参数(码率,采样率,声道数等)发生变化时,必须在变化后立即出现 PSH 和 PSM。
    在这里插入图片描述

私有信息封装规则

  • 1、在 PS 流中传输的海康私有信息一般一帧对应的一种信息视为一个处理单元;;

  • 2、当一个处理单元的长度不大于 PES 包负载或网络传输单元所能承受的最大长度时,建议将其封装成一个单独的 PES 包;

  • 3、每个处理单元的第一个 PES 包包头应当带有 PTS。
    在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PS流详解(载荷H264) 的相关文章

随机推荐

  • STM32F4中断(Interrupt)详解

    STM32F4中断 Interrupt 详解 文章目录 STM32F4中断 Interrupt 详解一 中断是什么 二 STM32的中断体系2 1 STM32的中断分类2 2 STM32中断优先级2 2 1 抢占优先级2 2 2 响应优先级
  • 基于RK3399&ESP8285自动售货柜项目—ESP8266(8285)程序编写与烧录

    基于RK3399 amp ESP8285自动售货柜项目 ESP8266 8285 程序编写与烧录 本系列文章讲详细讲解该基于RK3399及ESP8285自动售货柜的完整实现方法 xff0c 从硬件连接到网络通信再到软件实现 xff0c 本产
  • Windows10安装OpenCV4.1.0+opencv_contrib

    Windows10安装OpenCV4 1 0 43 opencv contrib 文章目录 Windows10安装OpenCV4 1 0 43 opencv contrib一 Visual Studio 2015安装二 下载和安装OpenC
  • 用MATLAB来做智能小车的建模与仿真

    两种智能小车的构造简介 在市面上常见的两种智能小车都是基于轮式的 xff0c 在某宝上面卖的最多的 xff0c 各位在学生时代拿来应付课程设计和毕业设计用的各种小车分为两种 1 后轮驱动 xff0c 前轮阿克曼转向的 xff0c 通常后轴通
  • Qt编写网络调试助手(TCP客户端+TCP服务端+UDP服务端)

    Qt编写网络调试助手 xff08 TCP客户端 43 TCP服务端 43 UDP服务端 xff09 终极版开源 飞扬青云 博客园
  • RKNN-Toolkit模型转换并在Rockchip NPU推理并进行性能评估

    RKNN Toolkit转换Tensorflow模型至Rockchip NPU推理并进行性能评估 文章目录 RKNN Toolkit转换Tensorflow模型至Rockchip NPU推理并进行性能评估一 基本知识二 环境部署2 1环境准
  • Redis Stream终端间使用流消费者组通信

    redis stream终端间使用流消费者组通信 附redis消息队列和消费者相关命令表 消息队列的相关命令 xff1a XADD xff1a 添加消息到末尾 xff08 生产消息 xff09 XTRIM xff1a 对流进行修剪 xff0
  • 如何将顶点数据保存为STL文件?

    stl 文件是在计算机图形应用系统中 xff0c 用于表示三角形网格的一种文件格式 它的文件格式非常简单 xff0c 应用很广泛 STL是最多快速模型系统所应用的标准文件类型 STL是用三角网格来表现3D CAD模型 STL只能用来表示封闭
  • 常见图像噪声及产生原因(高斯、泊松和椒盐噪声)

    目录 什么是图像噪声噪声来源常见噪声高斯噪声泊松噪声乘性噪声椒盐噪声 信噪比 什么是图像噪声 噪声在图像上常表现为一引起较强视觉效果的孤立像素点或像素块 一般 xff0c 噪声信号与要研究的对象不相关 xff0c 它以无用的信息形式出现 x
  • 音视频OSD——修改叠加信息的位置

    目录 分析 叠加代码分析 总结 同一行中叠加 代码 效果 不同行中叠加 现象 代码 效果 纵向保护 代码 效果 总结 代码 c文件 h文件 效果 分析 之前的OSD叠加的位置是默认的 在初始位置 若想改动OSD叠加的位置 在叠加时进行位置的
  • 音视频OSD——修改叠加在yuv420p图像上信息的颜色

    目录 预备知识 准备图片 分析 映射关系 代码 效果 代码优化 c h 效果 预备知识 字符编码 一些基本概念 字符编码 详解常用字符集 ASCII ISO8859 1 GB2312 GBK Unicode 和字符编码 UTF 8 UTF
  • H.264——使用H.264视频编解码器JM进行YUV图像序列的编解码

    目录 常见H 264视频编码器JM基础配置准备一个YUV视频 JM实现编码修改配置文件Encoder Control编译运行 JM实现解码如何判断编码解码是否正确 常见H 264视频编码器 X264 xff08 只有编码没有解码 xff09
  • 有意思的题:(++a * a++)、(b++ * ++b)、(c++ * c++)、(++d * ++d)

    include lt stdio h gt int main int a 61 3 b 61 3 c 61 3 d 61 3 int a1 b1 c1 d1 a1 61 43 43 a a 43 43 b1 61 b 43 43 43 43
  • 详解LVDS通信协议

    目录 LVDS概述LVDS接口电路的组成LVDS输出接口电路类型单路6位LVDS输出接口双路6位LVDS输出接口单路8位1TL输出接口双路8位1TL输出位接口 典型LVDS发送芯片介绍四通道LVDS发送芯片五通道LVDS发送芯片十通道LVD
  • 自动跟随机器人:一种简易的自动跟随方案,自动跟随小车、自动跟随平衡小车、STM32、基于超声波的自动跟随小车

    目的 xff1a 一种廉价的跟随方案 xff0c 让大家都能够参与进来 xff0c 技术难度不大 xff0c 一些人也能够DIY一些属于自己的 跟随 机器人 xff01 并不是要做工业应用什么的 只是做出来玩玩 1 介绍 先看视频 xff0
  • 详解MIPI协议

    目录 前言MIPI简介MIPI联盟的MIPI DSI规范MIPI名词解释MIPI DSI分层结构command和video模式 D PHYLane模组Lane 全局架构Lane电压和状态DATA LANE操作模式时钟LANE低功耗状态高速数
  • 音频处理——详解PCM数据格式

    目录 知识储备什么是PCM采样采样率重采样 量化编码PCM常用指标 PCM数据流 知识储备 音频处理 音频编码原理简介 音频处理 音频处理的基本概念 什么是PCM PCM全称Pulse Code Modulation xff0c 翻译一下是
  • 音频处理——常用音频编码格式简介(PCM、G726、ADPCM、LPCM、G711、AAC)

    目录 PCMG726ADPCMLPCMG711AAC格式对比音频帧长音频播放过程 PCM 音频处理 详解PCM数据格式 音频处理 解析PCM格式实例 xff08 音量调控 xff09 G726 G 726是ITU T定义的音频编码算法 19
  • 音频处理——G711标准详解

    目录 G711简介G711A算法原理压缩方法举例代码 G711U算法原理压缩方法举例代码 G711A与G711U对比 参考链接 G711简介 G711是国际电信联盟ITU T定制出来的一套语音压缩标准 xff0c 它代表了对数PCM xff
  • PS流详解(载荷H264)

    目录 PS简介标准结构标准H264流结构定长音频帧和其他流式私有数据的结构 PS流封装标准PSH结构PES包结构PSM包结构体 元素流 PS 封装规则H264元素流封装规则音频元素流封装规则私有信息封装规则 PS简介 PS 封装方式需要支持