视音频数据PS封装-offset

更新时间:2024-06-18 04:35:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

MPEG2-PS

1. PS介绍

MPEG2-PS是一种多路复用数字音频、视频等的封装容器。PS是Program Stream(程序流或节目流)的简称。程序流将一个或多个分组但有共同的时间基准的基本数据流 (PES)合并成一个整体流。它是为可靠稳定的储存媒介如光盘而设计的。

TS流与PS流的区别在于TS流的包结构是固定长度的,而PS流的包结构是可变长度的。它是分包发送的,每一个包长为188字节。在TS流里可以填入很多类型的数据,如视频、音频、自定义信息等。他的包的结构为,包头为4个字节,负载为184个字节。

PS包与TS包在结构上的这种差异,导致了它们对传输误码具有不同的抵抗能力,因而应用的环境也有所不同。TS码流由于采用了固定长度的包结构,当传输误码破坏了某一TS包的同步信息时,接收机可在固定的位置检测它后面包中的同步信息,从而恢复同步,避免了信息丢失。而PS包由于长度是变化的,一旦某一PS包的同步信息丢失,接收机无法确定下一包的同步位置,就会造成失步,导致严重的信息丢失。因此,在信道环境较为恶劣,传输误码较高时,一般采用TS码流;而在信道环境较好,传输误码较低时,一般采用PS码流。辨别这两种格式最简便的方法是利用MediaInfo工具查看MPEG视频的编码信息,这样就能确定它是何种格式,以方便后续的无损剪辑。一般来说,采用MPEG2-HD格式的高清数码摄像机一般以“MPEG2-PS”来保存文件;而采用AVCHD格式的高清摄像机则通常以“.M2TS”或“.MTS”保存文件。

2. PS封装H264的流程

PS封装按照ISO DEC-13818-1标准。一个PS包包含PS Header, PES Header, PS system header, PS system map等。

针对H264做如下PS封装:每个IDR NALU前一般都会包含SPS、PPS等NALU,因此将SPS、PPS、IDR 的NALU封装为一个PS包,包括ps头,然后加上PS system header,PS system map,PES header+h264 raw data。所以一个IDR NALU PS包由外到内顺序是:PS header | PS system header | PS system Map | PES header | h264 raw data。对于其它非关键帧的PS包,就简单多了,直接加上PS头和PES头就可以了。顺序为:PS header | PES header | h264 raw data。以上是对只有视频video的情况,如果要把音频Audio也打包进PS封装,也可以。当有音频数据时,将数据加上PES header 放到视频PES后就可以了。顺序如下:PS包=PS头|PES(video)|PES(audio),再用RTP封装发送就可以了。

视频数据视频编码器视频PES节目流音频数据音频编码器音频PES分组器复合器节目流分组器传输流复合器传输流系统规范TISO5760-95/d01

对应的解码流程则为:

已解码视频视频解码器通道通道特定解码器节目流解码器时钟控制已解码音频节目流音频解码器TISO5800-95/d05

GB28181对RTP传输的数据负载类型有规定(参考GB28181附录B),负载类型中96-127动态范围:

RFC2250建议96表示PS封装 RFC3016建议97为MPEG-4 RFC3984建议98为H264

即我们接收到的RTP包首先需要判断负载类型,若负载类型为96,则采用PS解复用,将音视频分开解码。若负载类型为98,直接按照H264的解码类型解码。

基于 RTP 的PS 封装首先按照 ISO/IEC 13818-1将视音频流封装成 PS 包,再将 PS 包以负载的方式封装成 RTP 包。PS 包的主要参数设置针对本文档规定的几种视音频格式,PS 包中的流类型(stream_type)的取值如下: a) MPEG-4视频流: 0x10; b) H.264视频流: 0x1B; c) SVAC视频流: 0x80; d) G.711音频流: 0x90; e) G.722.1音频流: 0x92; f) G.723.1音频流: 0x93; g) G.729音频流: 0x99; h) SVAC音频流: 0x9B。

3. PS的结构

3.1 PS包头

节目流包标题

offset 0 4 pack_header() { pack_start_code '01' system_clock_reference_base[32..30] marker_bit system_clock_reference_base[29..15] marker_bit 语法 位数 32 2 3 1 15 1 助记符 bslbf bslbf bslbf bslbf bslbf bslbf 10 13 14 system_clock_reference_base[14..0] marker_bit system_clock_reference_extension marker_bit program_mux_rate marker_bit marker_bit reserved pack_stuffing_length for (i=0;i

包起始码字段 pack_start_code

值为'0000 0000 0000 0000 0000 0001 1011 1010' (0x000001BA)的位串,用来标志一个包的开始。

系统时钟参考字段 system_clock_reference_base,system_clock_reference_extenstion

系统时钟参考(SCR)分两部分编码的42位字段。第一部分system_clock_reference_base是一个长度为33位的字段;第二部分system_clock_reference_extenstion是一个长度为9位的字段。SCR字段指出了基本流中包含ESCR_base最后一位的字节到达节目目标解码器输入端的期望时间。

标记位字段 marker_bit

1位字段,取值'1'。

节目复合速率字段 program_mux_rate

一个22位整数,规定P-STD在包含该字段的包期间接收节目流的速率。其值以50字节/秒为单位。不允许取0值。该字段值在本标准中的节目多路复合流的不同包中取值可能不同。

包填充长度字段 pack_stuffing_length

3位整数,规定该字段后填充字节的个数。 填充字节字段 stuffing_byte

8位字段,取值恒为'1111 1111'。该字段能由编码器插入,例如为了满足通道的要求。它由解码器丢弃。在每个包标题中最多只允许有7个填充字节。

3.2 系统标题

offset 0 4 6 system_header() { system_header_start_code header_length marker_bit rate_bound marker_bit 语 法 位数 32 16 1 22 1 助记符 bslbf uimsbf bslbf uimsbf bslbf 9 10 11 12 audio_bound fixed_flag CSPS_flag system_audio_lock_flag system_video_lock_flag marker_bit vedio_bound packet_rate_restriction_flag reserved_bits while (nextbits()=='1') { stream_id '11' P-STD_buffer_bound_scale P-STD_buffer_size_bound } } 6 1 1 1 1 1 5 1 7 8 2 1 13 uimsbf bslbf bslbf bslbf bslbf bslbf uimsbf bslbf bslbf uimsbf bslbf bslbf uimsbf 系统标题起始码字段 system_header_start_code

取值'0000 0000 0000 0000 0000 0001 1011 1011' (0x000001BB)的位串,指出系统标题的开始。

标题长度字段 header_length

16位字段。指出该字段后的系统标题的字节长度。在本规范将来的扩充中可能扩展该字段。

速率界限字段 rate_bound

22位字段,取值不小于编码在节目流的任何包中的program_mux_rate字段的最大值。该字段可被解码器用于估计是否有能力对整个流解码。

音频界限字段 audio_bound

6位字段,取值是在从0到32的闭区间中的整数,且不小于节目流中音频流的最大数目。 固定标志字段 fixed_flag

1位标志位。置'1'时表示比特率恒定的操作;置'0'时,表示操作的比特率可变。 CSPS标志字段 CSPS_flag

1位字段。

系统音频锁定标志字段 system_audio_lock_flag

1位字段。表示在系统目标解码器的音频采样率和system_clock_frequency之间存在规定的比率。

系统视频锁定标志字段 system_video_lock_flag

1位字段。表示在系统目标解码器的视频帧速率和system_clock_frequency之间存在规定的比率。比率SCFR的值是精确的。 视频界限字段 video_bound

5位字段,取值是在从0到16的闭区间中的整数且不小于节目流中解码过程同时活动的流的最大数目。

分组速率限制标志字段 packet_rate_restriction_flag

1位标志位。若CSPS标识为'0',则该字段的含义未定义。 保留位字段 reserved_bits

7位字段。被保留供ISO/IEC将来使用。它的值应为'111 1111',除非ISO/IEC对它作出其

它规定。

流标识字段 stream_id

8位字段。指示其后的P-STD_buffer_bound_scale和P-STD_buffer_size_bound字段所涉及的流的编码和基本流号码。若取值'1011 1000'(0xB8),则其后的P-STD_buffer_bound_scale和P-STD_buffer_size_bound字段指节目流中所有的音频流;若取值'1011 1001'(0xB9),则其后的P-STD_buffer_bound_scale和P-STD_buffer_size_bound字段指节目流中所有的视频流;若stream_id取其它值,则应该是大于或等于'1011 1100'的一字节值且应根据下表解释为流的编码和基本流号码。

a) MPEG-4视频流: 0x10; b) H.264视频流: 0x1B; c) SVAC视频流: 0x80; d) G.711音频流: 0x90; e) G.722.1音频流: 0x92; f) G.723.1音频流: 0x93; g) G.729音频流: 0x99; h) SVAC音频流: 0x9B。

节目流中的每个基本流应在每个系统标题中通过这种机制精确地规定一次它的P-STD_buffer_bound_scale和P-STD_buffer_size_bound; P-STD缓冲区界限比例字段 P-STD_buffer_bound_scale

1位字段。表示用于解释后续P-STD_buffer_size_bound字段的比例系数。若前面的stream_id表示一个音频流,则该字段值为'0'。若表示一个视频流,则该字段值为'1'。对于所有其它的流类型,该字段值可以为'0'也可以为'1'。

P-STD缓冲区大小界限字段 P-STD_buffer_size_bound 13位无符号整数,取值不小于节目流中流n的所有分组的P-STD缓冲区大小BSn的最大值。若P-STD_buffer_bound_scale的值为'0',则该字段以128字节为单位来度量缓冲区大小的边界。若P-STD_buffer_bound_scale的值为'1',则该字段以1024字节为单位来度量缓冲区大小的边界。

3.3 PES分组头部

offset 0 3 4 PES_packet(){ packet_start_code_prefix stream_id PES_packet_length if(stream_id != program_stream_map && stream_id !=padding_stream && stream_id !=private_stream_2 && stream_id !=ECM && stream_id !=EMM && stream_id !=program_stream_directory && stream_id !=DSMCC_stream && stream_id !=ITU-T Rec.H.222.1 type E stream){ 语 法 位数 助记符 24 8 16 bslbf uimsbf uimsbf

6 7 8 '10' PES_scrambling_control PES_priority data_alignment_indicator copyright original_or_copy PTS_DTS_flags ESCR_flag ES_rate_flag DSM_trick_mode_flag additional_copy_info_flag PES_CRC_flag PES_extension_flag PES_header_data_length if(PTS_DTS_flags =='10'){ 2 2 1 1 1 1 2 1 1 1 1 1 1 8 4 3 1 15 1 15 1 4 3 1 15 1 15 1 4 3 1 15 1 15 1 2 3 1 15 reserved ESCR_base[32..30] marker_bit ESCR_base[29..15] bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf uimsbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf bslbf 9 10 12 } '0010' PTS[32..30] marker_bit PTS[29..15] marker_bit PTS[14..0] marker_bit if(PTS_DTS_flags =='11'){ 9 10 12 '0011' PTS[32..30] marker_bit PTS[29..15] marker_bit PTS[14..0] marker_bit 14 15 17 9 } '0001' PTS[32..30] marker_bit PTS[29..15] marker_bit PTS[14..0] marker_bit if(ESCR_flag =='1'){ 9 9 9 9 9 } } } } } marker_bit ESCR_base[14..0] marker_bit ESCR_extension marker_bit if(ES_rate_flag =='1'){ marker_bit ES_rate marker_bit if (DSM_trick_mode_flag =='1'){ trick_mode_control if ( trick_mode_control = =fast_forward ) { field_id intra_slice_refresh frequency_truncation } else if ( trick_mode_control = = slow_motion ) { rep_cntrl } else if ( trick_mode _control = = freeze_frame ) { field_id reserved } else if ( trick_mode _control = = fast_reverse ) { field_id intra_slice_refresh frequency_truncation else if ( trick_mode_control = = slow_reverse ) { rep_cntrl } else reserved if ( additional_copy_info_flag = ='1'){ marker_bit additional_copy_info if (PES_CRC_flag==‘1’){ previous_PES_packet_CRC if ( PES_extension_flag =='1') { PES_private_data_flag 1 15 1 9 1 1 22 1 3 2 1 2 5 2 3 2 1 2 5 5 1 7 16 1 bslbf bslbf bslbf uimsbf bslbf bslbf uimsbf bslbf uimsbf bslbf bslbf bslbf uimsbf uimsbf bslbf bslbf bslbf bslbf uimsbf bslbf bslbf bslbf bslbf bslbf 10 10 10 11 pack_header_field_flag program_packet_sequence_counter_flag P-STD_buffer_flag reserved PES_extension_flag_2 if(PES_private_data_flag =='1'){ PES_private_data } if (pack_header_field_flag == '1'){ pack_field_length pack_header() } if (program_packer_sequence_counter_flag == '1'){ marker_bit program_packet_sequence_counter marker-bit MPEG1_MPEG2_indentifier original_stuff_length } if (P-STD_buffer_flag = = '1'({ 1 1 1 3 1 128 8 1 7 1 1 6 2 1 13 1 7 8 8 8 bslbf bslbf bslbf bslbf bslbf bslbf uimsbf bslbf uimsbf bslbf bslbf uimsbf bslbf bslbf uimsbf bslbf uimsbf bslbf bslbf bslbf 10 10 9 9 } } } for (i=0;i

24位代码,它和后面的stream_id构成了标识分组开始的分组起始码。它是一个值为'0000 0000 0000 0000 0000 0001' (0x000001)的位串。 流标识字段 stream_id

在节目流中,它规定了基本流的号码和类型。其中0xBC指下章节提到的节目流映射。0x(C0~DF)指音频,0x(E0~EF)为视频。具体见下表:

Stream_id赋值

stream_id 1011 1100 1011 1101 1011 1110 1011 1111 110x xxxx 1110 xxxx 1111 0000 1111 0001 1111 0010 1111 0011 1111 0100 1111 0101 1111 0110 1111 0111 1111 1000 1111 1001 1111 1010?1111 1110 1111 1111 注 1 类型为program_stream_map的PES分组有唯一的语法,在2.5.4.1中作了规定。 2 类型为private_stream_1和ISO/IEC_13352_stream的PES分组与GB/T XXXX.2及GB/T XXXX.3音频流服4 program_stream_directory 符号x表示值'0'或'1'均被允许且可产生相同的流类型。流号码由x的取值决定。 注 1 2 3 3 3 5 2 6 6 6 6 6 7 program_stream_map private_stream_1 padding_stream private_stream-2 GB/T XXXX.3或GB/T AAAA.3音频流编号xxxx GB/T XXXX.2或GB/T AAAA.2视频流编号xxxx ECM_stream EMM_stream GB/T XXXX.1附录B或GB/T XXXX.6_DSMCC_stream ISO/IEC_13522_stream ITU-T Rec. H.222.1类型A ITU-T Rec. H.222.1类型B ITU-T Rec. H.222.1类型C ITU-T Rec. H.222.1类型D ITU-T Rec. H.222.1类型E ancillary_stream 保留数据流 流 编 码 从相同的PES分组语法。 3 类型为private_stream_2,ECM_stream和EMM_stream的PES分组与private_stream_1相似,除了在PES_packet_length字段后未规定语法。 4 类型为program_stream_directory的PES分组有唯一的语法,在2.5.5中作了规定。 5 类型为DSM_CC_stream的PES分组有唯一的语法,在GB/T XXXX.6中作了规定。 6 stream_id与表2-29中的stream_type 0x09相关联。 7 stream_id仅用于PES分组。PES分组在传输流中携带了来源于节目流或GB/T AAAA.1系统流的数据(参见2.4.3.7)。 PES分组长度字段 PES_packet_length

16位字段,指出了PES分组中跟在该字段后的字节数目。值为0表示PES分组长度要么没有规定要么没有限制。这种情况只允许出现在有效负载包含来源于传输流分组中某个视频基本流的字节的PES分组中。

PES加扰控制字段 PES_scrambling_control

2位字段,表示PES分组有效负载的加扰方式。当加扰发生在PES层,PES分组标题,如果有可选字段的话也包括在内,不应被加扰。 PES优先级字段 PES_priority

1位字段,指示PES分组中有效负载的优先级。'1'表示PES分组中有效负载的优先级高于该字段为'0'的PES分组有效负载。多路复合器能使用该字段来区分安排基本流中数据的优先级。传输机制不应改动该字段。

数据对齐指示符字段 data_alignment_indicator

1位标志。当值为'0'时,没有定义是否有任何此种的对齐。 版权字段 copyright

1位字段。置'1'时表示相关PES分组有效负载的材料受到版权保护。当值为'0'时,没有定义该材料是否受到版权保护。 原始或拷贝字段 original_or_copy

1位字段。置'1'时表示相关PES分组有效负载的内容是原始的;值为'0'表示相关PES分组有效负载的内容是一份拷贝。 PTS DTS标志字段 PTS_DTS_flags

2位字段。当值为'10'时,PTS字段应出现在PES分组标题中;当值为'11'时,PTS字段和DTS字段都应出现在PES分组标题中;当值为'00'时,PTS字段和DTS字段都不出现在PES分组标题中。值'01'是不允许的。 ESCR标志字段 ESCR_flag

1位标志。置'1'时表示ESCR基础和扩展字段出现在PES分组标题中;值为'0'表示没有ESCR字段。

ES速率标志字段 ES_rate_flag

1位标志。置'1'时表示ES_rate字段出现在PES分组标题中;值为'0'表示没有ES_rate字段。

DSM特技方式标志字段 DSM_trick_mode_flag

1位标志。置'1'时表示有8位特技方式字段;值为'0'表示没有该字段。 附加版权信息标志字段 additional_copy_info_flag

1位标志。置'1'时表示有附加拷贝信息字段;值为'0'表示没有该字段。 PES CRC标志字段 PES_CRC_flag

1位标志。置'1'时表示CRC字段出现在PES分组标题中;值为'0'表示没有该字段。

PES扩展标志字段 PES_extension_flag

1位标志。置'1'时表示PES分组标题中有扩展字段;值为'0'表示没有该字段。 PES标题数据长度字段 PES_header_data_length

8位字段。指出包含在PES分组标题中的可选字段和任何填充字节所占用的总字节数。该字段之前的字节指出了有无可选字段。 标记位字段 marker_bit

值为'1'的1位字段。 展现时间戳字段 PTS

展现时间与解码时间的关系如下:PTS是一个编码在三个分离字段中的33位数字。它指出了基本流n的第k个展现单元在系统目标解码器中的展现时间tpn(k)。PTS的值以系统时钟频率的1/300(即90 kHz)为单位。展现时间由PTS根据下式计算而来。

PTS(k)=((system_clock_frequency×tpn(k)) DIV 300) % 233

其中,tpn(k)是展现单元Pn(k)的展现时间。 解码时间戳字段 DTS

DTS是一个编码在三个分离字段中的33位数字。它指出了基本流n的第j个展现单元在系统目标解码器中的解码时间tdn(j)。DTS的值以系统时钟频率的1/300 (即90 kHz)为单位。解码时间由DTS根据式计算而来:

DTS(j)=((system_clock_frequency×tdn(j)) DIV 300) % 233

其中,tdn(j)是存取单元An(j)的解码时间。 ESCR字段 ESCR_base,ESCR_extension

42位字段,分两部分编码。第一部分是一个长度为33位的字段;第二部分是一个长度为9位的字段。

基本流速率字段 ES_rate

22位无符号整数。对于PES流而言,它指出了系统目标解码器接收PES分组的速率。该字段在它所属的PES分组以及同一个PES流的后续PES分组中一直有效,直到遇到一个新的ES_rate字段。该字段的值以50字节/秒为单位,且不能为0。 特技方式控制字段 trick_mode_control

3位字段。它表示作用于相关视频流的特技方式。对其它类型的基本流,该字段及其后5位的含义没有定义。 字段标识字段 field_id

2位字段,表示应该显示哪个(些)字段。 片内参考字段 intra_slice_refresh

1位标志。置'1'时表示PES分组的视频数据编码片中可能有丢失的宏块;置'0'时,表示上述情况可能不出现。

频率截断字段 frequency_truncation

2位字段。指出在对PES分组中数据进行编码时可能用到受限系数集合。

显示次数控制字段 rep_cntrl

5位字段,指出隔行画面中每一字段的显示次数或渐进画面显示次数。 附加版权信息字段 additional_copy_info

7位字段,包含与版权信息有关的专用数据。 前PES分组CRC字段 previous_PES_packet_CRC

16位字段。在对前一个PES分组(不包括该PES分组的标题)进行处理后,该字段包含一个在解码器的16个寄存器中生成0输出的CRC值。 PES专用数据标志字段 PES_private_data_flag

1位标志。置'1'时表示PES分组标题中包含专用数据;置'0'时表示PES分组标题中无专用数据。

包标题字段标志字段 pack_header_field_flag

1位标志。置'1'时表示PES分组标题中有包标题或节目流包标题。若该字段在包含于节目流中的PES分组中,其值应为'0'。在传输流中,当值为'0'时表示PES标题中无包标题。 节目分组序列计数标志字段 program_packet_sequence_counter_flag

1位标志。值为'1'时表示PES分组有program_packet_sequence_counter,MPEG1_MPEG2_identifier和original_stuff_length字段。值为'0'时表示PES分组标题中无这些字段。

P-STD缓冲区标志字段 P-STD_buffer_flag

1位标志。置'1'时表示PES分组标题中有P-STD_buffer_scale和P-STD_buffer_size字段。值为'0'时表示PES标题中无这些字段。 PES扩展标志字段 PES_extension_flag_2

1位标志,置'1'时表示有PES_extension_field_length及相关字段。 PES专用数据字段 PES_private_data

16位字段。包含专用数据。这些数据与其前后的字段组合在一起时,不能与packet_start_code_prefix (0x000001)冲突。 包字段长度字段 pack_field_length

8位字段。表示pack_header_field()以字节为单位时的长度。 节目分组序列计数字段 program_packet_sequence_counter

7位字段。

MPEG1 MPEG2标识符字段 MPEG1_MPEG2_identifier

1位标志。置'0'时表示PES分组携带的信息来自于节目流。 初始填充长度字段 original_stuff_length

6位字段。指定分组标题中的填充字节数。 P-STD缓冲区比例字段 P-STD_ buffer_scale

1位字段。仅当该PES分组包含于节目流中时才有意义。它指出了用来解释后续P-STD_buffer_size字段的比例因子。若前面的stream_id表示一个音频流,该字段值应为'0';若前面的stream_id表示一个视频流,该字段值应为'1'。对于所有的其它流类型,其值可以为'0'或'1'。

P-STD缓冲区大小字段 P-STD_buffer_size

13位无符号整数。仅当该PES分组包含于节目流中时才有意义。它定义了P-STD输入缓冲区的大小BSn。若P-STD_ buffer_scale的值为'0',那么P-STD_buffer_size以128字节为单位来度量缓冲区的大小。若P-STD_buffer_scale的值为'1',那么P-STD_buffer_size以1024字节为单位来度量缓冲区的大小。

PES扩展字段长度字段 PES_extension_field_length

7位字段。指出了跟在该字段之后在PES扩展字段中直到且包括任何保留字节的数据的字节长度。

填充字节字段 stuffing_byte

8位字段,其值恒定为'1111 1111'。可以由编码器插入以满足通道的需求等。解码器丢

弃该字段。一个PES分组标题中只能出现32个填充字节。 PES分组数据字节字段 PES_packet_data_byte

该字段应该是来自于由分组的stream_id或PID所指定的基本流的连续数据字节。 填料字节字段 padding_byte

8位字段,其值恒定为'1111 1111'。该字段被解码器丢弃。

3.4 节目流映射

offset 0 3 4 6 7 8 10 10+N 12+N program_stream_map() { packet_start_code_prefix map_stream_id program_stream_map_length current_next_indicator reserved program_stream_map_version reserved marker_bit program_stream_info_length for (i=0;i

节目流映射中各字段的语义定义

分组起始码前缀字段 packet_start_code_prefix

24位码。它和跟随其后的map_stream_id共同组成一个分组起始码以标志分组的开始。该字段是值为'0000 0000 0000 0000 0000 0001' (0x000001)的位串。 映射流标识字段 map_stream_id

8位字段,值为0xBC。

节目流映射长度字段 program_stream_map_length

16位字段。指示紧跟在该字段后的program_stream_map中的字节数。该字段的最大值为1018(0x3FA)。

当前下一个指示符字段 current_next_indicator

1位字段。置'1'时表示传送的节目流映射当前是可用的。置'0'时表示传送的节目流映射还不可用,但它将是下一个生效的表。

节目流映射版本字段 program_stream_map_version

5位字段,表示整个节目流映射的版本号。一旦节目流映射的定义发生变化,该字段将递增1,并对32取模。在current_next_indicator为'1'时,该字段应该是当前适用的节目流映射的版本号;在current_next_indicator为'0'时,该字段应该是下一个适用的节目流映射的版本号。

节目流信息长度字段 program_stream_info_length

16位字段,指出紧跟在该字段后的描述符的总长度。 标记位字段 marker_bit

1位字段,取值为'1'。

基本流映射长度字段 elementary_stream_map_length

16位字段,指出在该节目流映射中的所有基本流信息的字节长度。它包括stream_type、elementary_stream_id和elementary_stream_info_length字段。 流类型字段 stream_type

8位字段,根据表2-29规定了流的类型。该字段只能标志包含在PES分组中的基本流且取值不能为0x05。

基本流标识字段 elementary_stream_id

8位字段,指出该基本流所在PES分组的PES分组标题中stream_id字段的值。 基本流信息长度字段 elmentary_stream_info_length

16位字段,指出紧跟在该字段后的描述符的字节长度。 CRC 32字段 CRC_32

32位字段。

4. 恒亿录像解析

4.1 PS包头

00 00 01 BA表示包头起始码;

BA ~FE按照包头信息对应解析;其中FE的后3位表示后面的填充字节的长度,对应为6; FF~FB为对应的填充字节。

4.2 系统头部

恒亿录像没有做相关规定,不影响PS的复用和解复用。

4.3 节目流映射

其中00 00 01 BC为节目流的起始符;

00 56为节目流映射的长度(不包含节目流起始符和长度字节本身),大小为86个字节; 00 24表示流映射信息的长度,为36个字节; 后面36字节为节目流映射的描述信息;

00 28表示基本流映射的长度,为40个字节;

后40字节为基本流映射,按照“1字节流类型字段”“1字节基本流标示字段”“2字节基本流信息长度字段”“基本流信息”循环。1B表示H264编码格式,E0为视频流,指出该基本流所在PES分组的PES分组标题中stream_id字段的值,00 10为长度,16个字节,后16个字节为信息长度。91为G711.3音频格式,C0为音频流,00 0C为音频信息的长度,12个字节。最后面的F1 0C 61 7A为CRC(循环冗余校验)。

本文来源:https://www.bwwdw.com/article/17n3.html

Top