PS封装H264码流分析

作者&投稿:迪闹 (若有异议请与网页底部的电邮联系)
~

一个完整的ps包封装:
PSheader + PS system header + PS system Map + PES header + h264 data

因为一般视频数据都是采用rtp打包发送,所以这里我就把ps封装和rtp封装放在一起讲

当我们获取到一帧h264的关键帧数据时,先进行PS封装,在视频数据前加上 PS header + PS system header + PS system Map header ,当前面的头添加完毕后还需要再加一个 PES header,但是由于PES头的负载长度类型是short,最大为65536,所以每65536字节的视频数据后都得加一个PES头,如下:
| PS header | PS system header | PS system Map |PES | data | PES | data | PES | data|
这样一个关键帧的PS封装就完成了剩下的就是把封装好的数据分包打RTP包了,每1300字节的数据前加一个RTP包头,然后发送出去

pack_start_code : (32b) 起始码字段 默认0x000001BA 标志一个包的开始
marker_bit :(2b) 标记位字段2位字段,取值’01’。
system_clock_reference_base[32..30] :(3b)系统时钟参考字段
marker_bit : (1b) 标记位字段取值’1’
system_clock_reference_base[29..15] : (15b) 系统时钟参考字段
marker_bit : (1b) 标记位字段取值’1’
system_clock_reference_base[14..0] : (15b) 系统时钟参考字段
marker_bit : (1b) 标记位字段取值’1’
system_clock_reference_extension : (9b) 系统时钟参考字段
marker_bit : (1b) 标记位字段取值’1’

program_mux_rate : (22b) 节目复合速率字段
marker_bit : (1b) 标记位字段取值’1’
marker_bit : (1b) 标记位字段取值’1’
reserved : (5b) 填充字段
pack_stuffing_length : (3b) 包填充长度字段

节目复合速率字段 program_mux_rate (没查到相关资料)
一个22位整数,规定P-STD在包含该字段的包期间接收节目流的速率。其值以50字节/秒为单位。不允许取0值。该字段所表示的值用于在2.5.2中定义P-STD输入端的字节到达时间。该字段值在本标准中的节目多路复合流的不同包中取值可能不同。

/12字节RTP头/
80 60 00 00 00 00 00 00 0d 25 5a a5
/PS 头/
00 00 01 ba 44 00 05 5f 94 01 00 60 1b f8

00 00 01 ba 开始码

44 00 44 f5 84 01 系统时钟参考字段,二进制如下
01 000 1 000000000000000 1 010101111110010 1 000000000 1

SCR = 90000/8 = 00000000 00000000 00101011 11110010 (SRC值是累加的,这个是第一帧数据的SRC值)
上面红色的1都是marker_bit 标记位
000 这三个位段的值是由SCR值的第30-32位填充,参考上述SRC值,故填充3位0
000000000000000 这15位字段是由SRC值的第15-29位填充,故填充000000000000000

010101111110010 这15位字段是由SRC值的第0-14位填充,故填充 0101011 11110010

00 60 1b f8 二进制如下:
00000000001100000000110 11 11111 000

00000000001100000000110 没看懂用途,尝试随便取值不影响视频和音频,不能取0,我这里用的是6150(1100000000110)

11111 5位填充字段 全部填1
00 3位扩展长度填充字段 填0

system_header_start_code : (32b) 开始码 0x000001BB
header_length : (16) 该字段后的系统标题的字节长度
marker_bit : (1b) 标记位字段取值’1’
rate_bound : (22b) 速率界限字段
marker_bit : (1b) 标记位字段取值’1’
audio_bound : (6b) 音频界限字段
fixed_flag : (1b) 固定标志字段
CSPS_flag : (1b) CSPS标志字段
system_audio_lock_flag : (1b) 系统音频锁定标志字段
system_video_lock_flag : (1b) 系统视频锁定标志字段
marker_bit : (1b) 标记位字段取值’1’
vedio_bound : (5b) 视频界限字段
packet_rate_restriction_flag: (1b) 分组速率限制标志字段
reserved_bits : (7b) 保留位字段
stream_id : (8b) 流标识字段
marker_bit : (2b) 取值’11’
P-STD_buffer_bound_scale : (1b) P-STD缓冲区界限比例字段
P-STD_buffer_size_bound : (13) P-STD缓冲区大小界限字段

00 00 01 bb 00 0c 80 1e ff fe e1 7f e0 e0 d8 c0 c0 20
00 00 01 bb : 四字节开始码
00 0c : 当前字段后该头的长度 12
80 1e ff 转成二进制如下:
1 0000000000111101111111 1
111101111111 :rate_bound 该字段可被解码器用于估计是否有能力对整个流解码(没查到如何填值)
fe e1 7f转成二进制如下:
111111 1 0 1 1 1 00001 0 1111111
111111: 音频界限字段 audio_bound 6位字段,取值是在从0到32的闭区间中的整数,且不小于节目流中解码过程同时活动的GB/T XXXX.3和GB/T AAAA.3音频流的最大数目。在本小节中,若STD缓冲区非空或展现单元正在P-STD模型中展现,则GB/T XXXX.3和GB/T AAAA.3音频流的解码过程是活动的。
1 : 固定标志字段 fixed_flag 1位标志位。置’1’时表示比特率恒定的操作;置’0’时,表示操作的比特率可变。
0 : CSPS标志字段 CSPS_flag 1位字段。
1: 系统音频锁定标志字段 system_audio_lock_flag 置 ‘1’
1: 系统视频锁定标志字段 system_video_lock_flag 置 ‘1’
00001: 视频界限字段 video_bound
0: 分组速率限制标志字段 packet_rate_restriction_flag 1位标志位。若CSPS标识为’1’,则该字段表示2.7.9中规定的哪个限制适用于分组速率。若CSPS标识为’0’,则该字段的含义未定义。
1111111 : 7位字段。被保留供ISO/IEC将来使用。它的值应为’111 1111’,除非ISO/IEC对它作出其它规定。

e0 e0 d8 c0 c0 20转成二进制如下:
11100000 11 1 0000011011000 11000000 11 0 0000000100000
11100000 : 流标识字段 stream_id E0在gb28181中定义是视频
11: 固定值
1: 1位字段。表示用于解释后续P-STD_buffer_size_bound字段的比例系数。若前面的stream_id表示一个音频流,则该字段值为’0’。若表示一个视频流,则该字段值为’1’。对于所有其它的流类型,该字段值可以为’0’也可以为’1’。
0000011011000 : 音频缓存区大小 216 单位是1024字节

11000000: 流标识字段 stream_id C0在gb28181中定义是音频
11: 固定值
0:
0000000100000: 视频缓存区大小 32 单位 128字节

packet_start_code_prefix : (24b) 开始码 0x000001
map_stream_id : (8) 映射流标识字段 值为0xBC
program_stream_map_length: (16) 节目流映射长度字段
current_next_indicator : (1) 当前下一个指示符字段
reserved : (2) 填充字段
program_stream_map_version: (5) 节目流映射版本字段
reserved : (7)
marker_bit : (1)
program_stream_info_length : (16) 节目流信息长度字段
elementary_stream_map_length: (16) 基本流映射长度字段
stream_type : (8) 流类型字段
elementary_stream_id : (8) 基本流标识字段
elementary_stream_info_length : (16) 基本流信息长度字段
CRC_32 : (32) CRC 32字段

00 00 01 bc 00 18 e1 ff 00 00 00 08 1b e0 00 00 90 c0 00 00 23 b9 0f 3d

00 00 01 bc 开始码加固定id
00 18 头的长度
e1 ff 00 00 00 08二进制如下:
11 00001 1111111 1 0000000000000000 0000000000001000
1: 当前下一个指示符字段 current_next_indicator 1位字段。置’1’时表示传送的节目流映射当前是可用的。置’0’时表示传送的节目流映射还不可用,但它将是下一个生效的表。
11: 填充字段 ‘11’
00001: 节目流映射版本字段 program_stream_map_version 5位字段,表示整个节目流映射的版本号。一旦节目流映射的定义发生变化,该字段将递增1,并对32取模。在current_next_indicator为’1’时,该字段应该是当前适用的节目流映射的版本号;在current_next_indicator为’0’时,该字段应该是下一个适用的节目流映射的版本号。

1111111: 填充字段
0000000000000000: 节目流信息长度字段 program_stream_info_length 16位字段,指出紧跟在该字段后的描述符的总长度
0000000000001000: 基本流映射长度字段 elementary_stream_map_length 16位字段,指出在该节目流映射中的所有基本流信息的字节长度。它只包括stream_type、elementary_stream_id和elementary_stream_info_length字段。(这里注意一下,这里的基本流映射长度,他只包括他后面的指定的那几个定义字段的总和,即从从这个长度,我们可以知道后面他根了几种类型的流定义,因为一种流的这个定义字段:stream_type(1BYTE)、elementary_stream_id(1byte)和elementary_stream_info_length(2byte)字段总和为4个字节,所以用elementary_stream_map_length/4可以得到后面定义了几个流类型信息。)
1b e0 00 00: 1b是H264视频流 e0 :指视频
00 00指后面跟着0个字节的视频描述字节
90 c0 00 00: 90是G.711 音频流:0x90 ,c0指音频
00 00:0个字节描述符
23 b9 0f 3d : 32位字段,它包含CRC值以在处理完整个节目流映射后在附录A中定义的解码器寄存器产生0输出值。/crc (23 b9 0f 3d)/

packet_start_code_prefix : (24b) 分组起始码前缀字段 packet_start_code_prefix 0x000001
stream_id : (8) 流标识字段 stream_id 这个字段的定义,其中0x(C0 DF)指音频,0x(E0 EF)为视频
PES_packet_length : (16) PES分组长度字段 PES_packet_length
‘10’ : (2)
PES_scrambling_control : (2) PES加扰控制字段 PES_scrambling_control
PES_priority : (1) PES优先级字段 PES_priority
data_alignment_indicator : (1) 数据对齐指示符字段 data_alignment_indicator
copyright: (1) 版权字段 copyright
original_or_copy : (1) 原始或拷贝字段 original_or_copy
PTS_DTS_flags : (2) PTS DTS标志字段 PTS_DTS_flags
ESCR_flag : (1) ESCR标志字段 ESCR_flag
ES_rate_flag : (1) ES速率标志字段 ES_rate_flag
DSM_trick_mode_flag : (1) DSM特技方式标志字段 DSM_trick_mode_flag
additional_copy_info_flag : (1) 附加版权信息标志字段 additional_copy_info_flag
PES_CRC_flag : (1) PES CRC标志字段 PES_CRC_flag
PES_extension_flag: (1) PES扩展标志字段 PES_extension_flag
PES_header_data_length: (8) PES标题数据长度字段 PES_header_data_length
‘0011’ : (4)
PTS[32..30] : (3) 展现时间戳字段 PTS
marker_bit: (1)
PTS[29..15] : (15)
marker_bit : (1)
PTS[14..0] : (15)
marker_bit : (1)

00 00 01 e0 49 e6 88 80 05 31 00 01 57 e5
00 00 01: 开始码
e0 : 视频
49 e6: 视频数据长度
88 80 05 :二进制数据如下
10 00 1 0 0 0 10 0 0 0 0 0 0 00000101
10 : 固定值
00: PES加扰控制字段 PES_scrambling_control
1: PES优先级字段 PES_priority ‘1’表示PES分组中有效负载的优先级高于该字段为’0’的PES分组有效负载
0: 数据对齐指示符字段 data_alignment_indicator 当值为’0’时,没有定义是否有任何此种的对齐。
0: 版权字段 copyright当值为’0’时,没有定义该材料是否受到版权保护
0: 原始或拷贝字段 original_or_copy 1位字段。置’1’时表示相关PES分组有效负载的内容是原始的;值为’0’表示相关PES分组有效负载的内容是一份拷贝

10: PTS DTS标志字段 PTS_DTS_flags
2位字段。当值为’10’时,PTS字段应出现在PES分组标题中;当值为’11’时,PTS字段和DTS字段都应出现在PES分组标题中;当值为’00’时,PTS字段和DTS字段都不出现在PES分组标题中。值’01’是不允许的。
0 0 0 0 0 0 六个扩展标志位 置0
00000101 : PES标题数据长度字段 5 标明后续还有五个字节
31 00 01 57 e5:二进制如下
11 000 1 000000000000000 1 010101111110010 1
0011: 固定值
PTS = 90000/8 = 11250 二进制:
10101111110010
000: PTS第30 -32位填充
000000000000000: PTS第15 -29位填充
010101111110010: PTS第0 -14位填充




PS封装H264码流分析
一个完整的ps包封装: PSheader + PS system header + PS system Map + PES header + h264 data 因为一般视频数据都是采用rtp打包发送,所以这里我就把ps封装和rtp封装放在一起讲 当我们获取到一帧h264的关键帧数据时,先进行PS封装,在视频数据前加上 PS header + PS system header + PS system Map hea...

H264 码流结构详解
H264 码流实质上是一串经过特定规则组织的字节序列,用于视频文件解析和网络传输。它的结构复杂而有序,从大到小的层级包括视频序列、帧、片组、片、宏块、子块和像素。从功能角度看,H264 码流分为视频编码层(VCL)和网络提取层(NAL)。VCL负责视频数据的高效压缩,通过三个步骤实现;而NAL则确保码...

(推荐阅读)H264, H265硬件编解码基础及码流分析
原始码流与刷新图像IDR图像用于同步解码,确保错误恢复。编码数据被封装为NALU单元,分为VCL和NAL两层,每个NALU包含头信息、RBSP负载和起始码。编码格式H.264和H.265编码格式不同,如H.264的NALU由头、RBSP和起始码组成,而H.265则使用两个字节的头信息。码流有Annex B和AVCC两种封装格式,Annex B包含...

H264码流中NALU sps pps IDR帧的理解
再普及一个概念是GOP,GOP的全称是Group of picture图像组,也就是两个I帧之间的距离,GOP值越大,那么I帧率之间P帧和B帧数量越多,图像画质越精细,如果GOP是120,如果分辨率是720P,帧率是60,那么两I帧的时间就是120\/60=2s.

h264 一张图片出几个码流
没有数量之分,是一个范围:最好在5mbps\/5120kbps到8mbps\/8192kbps之间,因为低于5mbps不够清晰,而大于8mbps视频文件会过大

h264裸码流是不是没有pts和dts信息的
对,如果用mpeg2-ts进行封装,就有pts和dts了

关于h264裸码流封装的问题
h264裸码流flashplayer播放不了,保存的.h264文件,播放器也播放不了。听你的回答说是必须要封装在容器里面,加上时间戳才能播放!这个应该怎么做(大概给... 小白一个,只求多指点一下。 h264裸码流flash player播放不了,保存的.h264文件,播放器也播放不了。 听你的回答说是必须要封装在容器里面,加上时间戳才能...

音视频压缩:H264码流层次结构和NALU详解
所以现在我们需要一种压缩方式减小数据的大小.在更低 比特率(bps)的情况下依然提供清晰的视频。 H264: H264\/AVC是广泛采用的一种编码方式。我们这边会带大家了解。从大到小排序依次是 序列,图像,NALU,片,宏块,亚宏块,块,像素。 问题背景: 前面在讲封装格式过程中,都有一个章节讲解如何将H.264的NALU单元...

h264裸码流怎么在网页中播放, 用flash怎么播放呢???急求,高分
可以尝试使用jwplayer来实现解码,服务器的话可以采用nginx,rtmp协议我没试过,不过HLS是支持的

存储h264码流使用什么文件格式
H264可以用很多容器封装,也就是你所说的文件格式封装 一般主流的H264封装文件格式有,TS,MP4,MKV,FLV,M3U8(就是TS分片)等等

滑县18990252229: 如何把H264文件的数据一帧一帧的读出来 -
登先防风: 这其实是一个协议分析过程,每一帧H264数据都是可以通过观察二进制码流分析出来的.根据协议说明,每一帧图像一般在开头有一个单元分隔符NAL,两个单元分隔符之间的数据包就是一帧图像.就是00 00 01 09,这个09就是单元分隔符的标志.不过协议并没有说NAL流必须如此组织,可能还有其它的组织形式.我手头的H264文件都是这样组织的.

滑县18990252229: 怎样用elecard分析码流基本参数 -
登先防风: 目前编解码分析领域,最权威的工具就是Elecard出品的.分析H264的话,可以用Elecard Stream Analyzer (分析码流结构),Elecard Stream Eye(分析帧结构和编码细节如宏块收敛等)

滑县18990252229: H264码流解析 -
登先防风: 00 00 00 01是Start code后面的ox67为 0110 0111 forbidden_zero_bit 是禁止位,应该是第一位即f(1)=0,1为语法有错误 nal_ref_idc是参考级别,代表被其它帧参考情况,u(2)= 11 = 3最(0为无参考,详见规范) nal_unit_type是该帧的类型,为剩...

滑县18990252229: 怎样判断h264一帧含有多少个slice -
登先防风: 解码器知道一帧图像有多少个MB,再通过每个slice的first_mb_in_slice语法元素就可以推出一帧含有多少个slice了

滑县18990252229: 通过wireshark对码流升降速分析 -
登先防风: 这个,丢包这个wireshark有分析的,速率方面其实用ip的流量就可以看出来的.具体操作,你随便找个截包,然后用voip的那些分析一下就可以了.网上好像也有wireshark教程的pdf的书

滑县18990252229: 如何从wireshark中获取H264码流 -
登先防风: 没什么关系的.以前H263的rtp包算得还不错,不过H264的时候感觉wireshark的分析就没什么用了. 没什么关系的.以前H263的rtp包算得还不错,不过H264的时候感觉wireshark的分析就没什么用了.

滑县18990252229: H264编码问题帧内预测宏块的AQ到底是如何回事
登先防风: 残差信息经熵编码后会成为码流的一部分,如果不做熵编码,直接做反变换反量化,则可获得残差(已有量化误差),该残差加上预测值则得到重建块.重建块可参与对其右边和下边的块的预测.在解码端也会有个类似的过程.在第一帧的第一个4x4块,通常会被预测成直流模式,即都被预测成128,然后做残差,经量化变换再反量化反变换后,再加上128,就得到了重建块.该块可以对右边的块进行水平预测,对下边的块进行垂直预测.如此循环,完成对全帧的编码.

滑县18990252229: gb28181适合民用安防吗 -
登先防风: 采用28181国标主要是兼容性、通用性好,民用、家用如果单独使用,采不采用基本没什么影响.

滑县18990252229: 电脑播放,H264与AVI格式哪个好 -
登先防风: 首先要说明两个概念:“H264定义了音视频的压缩算法,AVI是一种封装格式.”封装格式就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中,也就是说仅仅是一个外壳,或者大家把它当成一个放视频轨和音频轨的文件夹也可以.然后就是AVI中既可以封装H264的视频,也可以封装MPEG2的视频

滑县18990252229: 码流分析仪使用教程
登先防风: 鹏宇便携式码流分析仪PY-A1 便携式码流分析仪是我公司最新研制的产品,采用嵌入式系统设计,通过USB口与笔记本相连,支持实时码流的采集、分析和播放.它可以帮助设备商和运营商建立一个完整的数字电视信号处理平台,用于数字电视...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网