视音频数据PS封装offset.docx

上传人:b****5 文档编号:6253892 上传时间:2023-01-04 格式:DOCX 页数:25 大小:69.03KB
下载 相关 举报
视音频数据PS封装offset.docx_第1页
第1页 / 共25页
视音频数据PS封装offset.docx_第2页
第2页 / 共25页
视音频数据PS封装offset.docx_第3页
第3页 / 共25页
视音频数据PS封装offset.docx_第4页
第4页 / 共25页
视音频数据PS封装offset.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

视音频数据PS封装offset.docx

《视音频数据PS封装offset.docx》由会员分享,可在线阅读,更多相关《视音频数据PS封装offset.docx(25页珍藏版)》请在冰豆网上搜索。

视音频数据PS封装offset.docx

视音频数据PS封装offset

MPEG2-PS

1.PS介绍  

MPEG2-PS是一种多路复用数字音频、视频等的封装容器。

PS是ProgramStream(程序流或节目流)的简称。

程序流将一个或多个分组但有共同的时间基准的基本数据流(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封装按照ISODEC-13818-1标准。

一个PS包包含PSHeader,PESHeader,PSsystemheader,PSsystemmap等。

针对H264做如下PS封装:

每个IDRNALU前一般都会包含SPS、PPS等NALU,因此将SPS、PPS、IDR的NALU封装为一个PS包,包括ps头,然后加上PSsystemheader,PSsystemmap,PESheader+h264rawdata。

所以一个IDRNALUPS包由外到内顺序是:

PSheader|PSsystemheader|PSsystemMap|PESheader| h264rawdata。

对于其它非关键帧的PS包,就简单多了,直接加上PS头和PES头就可以了。

顺序为:

PSheader|PESheader|h264rawdata。

以上是对只有视频video的情况,如果要把音频Audio也打包进PS封装,也可以。

当有音频数据时,将数据加上PESheader放到视频PES后就可以了。

顺序如下:

PS包=PS头|PES(video)|PES(audio),再用RTP封装发送就可以了。

对应的解码流程则为:

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

RFC2250建议96表示PS封装

RFC3016建议97为MPEG-4

RFC3984建议98为H264

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

若负载类型为98,直接按照H264的解码类型解码。

基于RTP的PS封装首先按照ISO/IEC13818-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.1PS包头

节目流包标题

offset

语法

位数

助记符

pack_header(){

0

pack_start_code

32

bslbf

4

'01'

2

bslbf

system_clock_reference_base[32..30]

3

bslbf

marker_bit

1

bslbf

system_clock_reference_base[29..15]

15

bslbf

marker_bit

1

bslbf

system_clock_reference_base[14..0]

15

bslbf

marker_bit

1

bslbf

system_clock_reference_extension

9

uimsbf

marker_bit

1

bslbf

10

program_mux_rate

22

uimsbf

marker_bit

1

bslbf

marker_bit

1

bslbf

13

reserved

5

bslbf

pack_stuffing_length

3

uimsbf

14

for(i=0;i

stuffing_byte

8

bslbf

}

if(nextbits()==system_header_start_code){

system_header()

}

}

包起始码字段pack_start_code

值为'00000000000000000000000110111010'(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位字段,取值恒为'11111111'。

该字段能由编码器插入,例如为了满足通道的要求。

它由解码器丢弃。

在每个包标题中最多只允许有7个填充字节。

3.2系统标题

offset

语法

位数

助记符

system_header(){

0

system_header_start_code

32

bslbf

4

header_length

16

uimsbf

6

marker_bit

1

bslbf

rate_bound

22

uimsbf

marker_bit

1

bslbf

9

audio_bound

6

uimsbf

fixed_flag

1

bslbf

CSPS_flag

1

bslbf

10

system_audio_lock_flag

1

bslbf

system_video_lock_flag

1

bslbf

marker_bit

1

bslbf

vedio_bound

5

uimsbf

11

packet_rate_restriction_flag

1

bslbf

reserved_bits

7

bslbf

12

while(nextbits()=='1'){

stream_id

8

uimsbf

'11'

2

bslbf

P-STD_buffer_bound_scale

1

bslbf

P-STD_buffer_size_bound

13

uimsbf

}

}

系统标题起始码字段system_header_start_code

取值'00000000000000000000000110111011'(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将来使用。

它的值应为'1111111',除非ISO/IEC对它作出其它规定。

流标识字段stream_id

8位字段。

指示其后的P-STD_buffer_bound_scale和P-STD_buffer_size_bound字段所涉及的流的编码和基本流号码。

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

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.3PES分组头部

offset

语法

位数

助记符

PES_packet(){

0

packet_start_code_prefix

24

bslbf

3

stream_id

8

uimsbf

4

PES_packet_length

16

uimsbf

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-TRec.H.222.1typeEstream){

6

'10'

2

bslbf

PES_scrambling_control

2

bslbf

PES_priority

1

bslbf

data_alignment_indicator

1

bslbf

copyright

1

bslbf

original_or_copy

1

bslbf

7

PTS_DTS_flags

2

bslbf

ESCR_flag

1

bslbf

ES_rate_flag

1

bslbf

DSM_trick_mode_flag

1

bslbf

additional_copy_info_flag

1

bslbf

PES_CRC_flag

1

bslbf

PES_extension_flag

1

bslbf

8

PES_header_data_length

8

uimsbf

if(PTS_DTS_flags=='10'){

9

'0010'

4

bslbf

PTS[32..30]

3

bslbf

marker_bit

1

bslbf

10

PTS[29..15]

15

bslbf

marker_bit

1

bslbf

12

PTS[14..0]

15

bslbf

marker_bit

1

bslbf

}

if(PTS_DTS_flags=='11'){

9

'0011'

4

bslbf

PTS[32..30]

3

bslbf

marker_bit

1

bslbf

10

PTS[29..15]

15

bslbf

marker_bit

1

bslbf

12

PTS[14..0]

15

bslbf

marker_bit

1

bslbf

14

'0001'

4

bslbf

PTS[32..30]

3

bslbf

marker_bit

1

bslbf

15

PTS[29..15]

15

bslbf

marker_bit

1

bslbf

17

PTS[14..0]

15

bslbf

marker_bit

1

bslbf

}

if(ESCR_flag=='1'){

9

reserved

2

bslbf

ESCR_base[32..30]

3

bslbf

marker_bit

1

bslbf

ESCR_base[29..15]

15

bslbf

marker_bit

1

bslbf

ESCR_base[14..0]

15

bslbf

marker_bit

1

bslbf

ESCR_extension

9

uimsbf

marker_bit

1

bslbf

}

if(ES_rate_flag=='1'){

9

marker_bit

1

bslbf

ES_rate

22

uimsbf

marker_bit

1

bslbf

}

if(DSM_trick_mode_flag=='1'){

9

trick_mode_control

3

uimsbf

if(trick_mode_control==fast_forward){

field_id

2

bslbf

intra_slice_refresh

1

bslbf

frequency_truncation

2

bslbf

}

elseif(trick_mode_control==slow_motion){

rep_cntrl

5

uimsbf

}

elseif(trick_mode_control==freeze_frame){

field_id

2

uimsbf

reserved

3

bslbf

}

elseif(trick_mode_control==fast_reverse){

field_id

2

bslbf

intra_slice_refresh

1

bslbf

frequency_truncation

2

bslbf

elseif(trick_mode_control==slow_reverse){

rep_cntrl

5

uimsbf

}

else

reserved

5

bslbf

}

if(additional_copy_info_flag=='1'){

9

marker_bit

1

bslbf

additional_copy_info

7

bslbf

}

if(PES_CRC_flag==‘1’){

9

previous_PES_packet_CRC

16

bslbf

}

if(PES_extension_flag=='1'){

9

PES_private_data_flag

1

bslbf

pack_header_field_flag

1

bslbf

program_packet_sequence_counter_flag

1

bslbf

P-STD_buffer_flag

1

bslbf

reserved

3

bslbf

PES_extension_flag_2

1

bslbf

if(PES_private_data_flag=='1'){

10

PES_private_data

128

bslbf

}

if(pack_header_field_flag=='1'){

10

pack_field_length

8

uimsbf

pack_header()

}

if(program_packer_sequence_counter_flag=='1'){

10

marker_bit

1

bslbf

program_packet_sequence_counter

7

uimsbf

11

marker-bit

1

bslbf

MPEG1_MPEG2_indentifier

1

bslbf

original_stuff_length

6

uimsbf

}

if(P-STD_buffer_flag=='1'({

10

'01'

2

bslbf

P-STD_buffer_scale

1

bslbf

P-STD_buffer_size

13

uimsbf

}

if(PES_extension_flag_2=='1'{

10

marker_bit

1

bslbf

PES_extension_field_length

7

uimsbf

for(i=0;i

reserved

8

bslbf

}

}

}

9

for(i=0;i

stuffing_byte

8

bslbf

}

9

for(i=0;i

PES_packet_data_byte

8

bslbf

}

}

elseif(stream_id==program_stream_map

||stream_id==private_stream_2

||stream_id==ECM

||stream_id==EMM

||stream_id==program_stream_directory

||stream_id==DSMCC_stream

||stream_id==ITU-TRec.H.222.1typeEstream){

for(i=0;i

PES

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1