首頁  >  文章  >  web前端  >  PS串流的格式和解析總結

PS串流的格式和解析總結

高洛峰
高洛峰原創
2017-02-15 09:43:154374瀏覽

對於PS流,最近因為工作需要,所以MPEG2中的PS流格式和解包過程進行了學習。

 首先我們需要知道PS包流格式是怎麼樣的:

針對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 套件由外到內順序是:PSheader| PS system header | PS system Map | PES header | h264 raw data。對於其它非關鍵影格的PS 包,就簡單多了,直接加上PS頭和PES 頭就可以了。順序為:PS header | PES header | h264raw data。以上是只有視訊video 的情況,如果要把音訊Audio也打包進PS 封裝,也可以。當有音訊資料時,將資料加上PES header 放到視訊PES 後就可以了。順序如下:PS 套件=PS頭|PES(video)|PES(audio),再用RTP 封裝發送就可以了。

上面這是對數據流的一個整體封裝格式,下面我們來看看每個封裝中的每個部分:

PS流的格式和解析总结

 首先是PSheader部分:(來自MPEG2標準中文文檔)

1 15uimsbf    program_mux_rate   lbf3 ing_length;i++ ) {          stuffing_byte     if (nextbits()==system_header_start_code) {   

語法

位數

助記符

pack_header(

    pack_start_code

32

bslbf

   lbf

    system_clock_reference_base[32..30]

3

bslbf

 

bslbf

    system_clock_reference_base[29..15]

15

bslbf

2

bslbf

    system_clock_reference_base[14.. 0]

bslbf

1

bslbf

    system_clock_reference_extension
    system_clock_reference_extension

   

9

 

bslbf

22

uimsbf

    

1

  保留

5

bslbf

bslbf

bslbf

bslbf

bslbf

    pack_stuffing_length

8

bslbf

 

        system_header()

    }
 

 

}
🎜🎜🎜在

位元串,用來標誌一個包的開始。

系統時鐘參考欄位  system_clock_reference_base

system_clock_reference_extenstion 

系統時脈參考(SCR)是一個分兩部分編碼的42位元欄位。第一部分system_clock_reference_base是一個長度為33位的字段,其值SCR_base(i)由式2-19給出;第二部分system_clock_reference_extenstion是一個長度為9位的字段,其值SCR_ext(i)由式2-20給出。 SCR欄位指出了基本流中包含ESCR_base最後一位的位元組到達節目目標解碼器輸入端的期望時間。

SCR字段的編碼頻率要求請參閱2.7.1。 標記位元字段  marker_bit 

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

節目複合速率字段  program_mux_rate

 一個22位元整數,規定P-STD在包含該字段的包期間接收節目流的速率。其值以50位元組/秒為單位。不允許取0值。此欄位所表示的值用於在2.5.2中定義P-STD輸入端的位元組到達時間。此欄位值在本標準中的節目多路複合流的不同包中取值可能不同。

包填滿長度欄位  pack_stuffing_length

 3位元整數,規定該欄位後填入位元組的數量。

填充位元組字段  stuffing_byte

 8位元字段,取值恆為'1111 1111'。此字段能由編碼器插入,例如為了滿足通道的要求。它由解碼器丟棄。在每個包標題中最多只允許有7個填充位元組。

 

它的定義位元組順序,如下圖

4B的​​包裝起始碼:

 byte 1

byte 2

byte 3

5

4

3

2

1

0

1

6

5

4

3

2

1

6

5

4

3

2

2

7

6

5

4

3

0

0000 0000 0000 0000 0000 0001

start code

1011 1010

PACK identifier

PACK identifier

 

PACK identifier -- 0xBA

 

系統時脈基準(SCR-System Clock Reference)的基本部分SCR的擴充部分

3341076541
byte 5

byte 6

byte 7

7

6

5

4

1

0

7

6

5

2

1

0

7

6

3

2

1

0

7

4

3

2

1

0

5

4

3

2

1

0

SCR 32..30

SCR 29..15

1

SCR 14..00

1

 

PS重複使用速率:

 

643 21076reserved 

byte 101

byte 12

byte 13

7

5

2

1

0

7

6

3

2

1

0

7

5

4

3

2

1

0
1

1

pack_stuffing_length

================================================= =============

 接下來看看PS system header(即PS系統頭:節目流程系統標題)部分的定義:(來自MPEG-2標準文件)

表2-34  節目流程系統標題

    system_header_start_code321bslbf    marker_bit    marker_bit1    system_audio_lock_flag111🜎111    marker_bit1        stream_id8uims  2bslbf13個    }  

語  法

位數

system

 
 

length

16

uimsbf

uimsbf

    marker_bit

    marker_bit

1

bslbf

   

uimsbf

    fixed_flag

bslbf

   

1

1

bslbf

    system_video_lock_flag

    vedio_bound

5

   packet_rate_restriction_flag

1

bslbf

bslbf

bslbf

    reserved_bits

7

bslbf

bslbf (

bslbf55個

bslbf55個

bslbf

15個

bslbf

bs磅

 
 

'11'

        P-STD_buffer_bound_scale

11%

        P-STD_buffer_size_bound

 

 

 

系統標題中各字段的語意定義:

系統標題中各字段的語意定義:

系統標題起始碼字段  system_header_start_code

 取值'0000 0000 0000 000010001010101001010010指出系統標題的開始。

標題長度欄位  header_length

 16位元欄位。指出該欄位後的系統標題的位元組長度。在本規範將來的擴充中可能擴充此欄位。

速率界限字段  rate_bound

 22位元字段,取值不小於編碼在節目流的任何包中的program_mux_rate字段的最大值。此欄位可被解碼器用於估計是否有能力對整個流解碼。

音頻界限字段  audio_bound

 6位元字段,取值是在從0到32的閉區間中的整數,且不小於節目流中解碼過程同時活動的GB/T XXXX.3和GB/T AAAA.3音訊串流的最大數目。在本小節中,若STD緩衝區非空或展現單元正在P-STD模型中展現,則GB/T XXXX.3和GB/T AAAA.3音訊串流的解碼過程是活動的。

固定標誌欄位  fixed_flag

 1位元標誌位。置'1'時表示位元率恆定的操作;置'0'時,表示操作的位元率可變。在恆定比特率的操作期間,複合的GB/T XXXX.1流中的system_clock_reference字段值應遵從下面的線性公式:SCR_base(i)=((c1×i

c2

) p 300) % 233                     (2-22)( ×ic2) p 300) % 300               (2- 23)

其中:

c1    對所有i均有效的實型常數;

c2    對所有i有效的實型常數;

i   對所有i有效的實型常數;最後一位的位元組索引。

CSPS標誌欄位  CSPS_flag 

1位元欄位。置'1'時,節目流符合2.7.9定義的限制。

系統音訊鎖定標誌欄位  system_audio_lock_flag 

1位元欄位。表示在系統目標解碼器的音訊取樣率和system_clock_frequency之間存在規定的比率。 system_clock_frequency在2.5.2.1中定義而音訊取樣率由GB/T XXXX.3規定。如果對節目流中所有音訊基本串流的所有展現單元,system_clock_frequency和實際音訊取樣率的比例SCASR是恆定的,且對音訊串流中所指出的標準取樣率和下表中數值相等,則該欄位只能為'1'。

SCASR=(system_clock_frequency) / audio_sample_rate_in_the_P-STD    (2-24)

2448--------16 00027 000 000300 00030 00027 000 00027 000 00027 000 000
標準音頻取樣頻率(kHz)

16

32

SCASR

27 000 000

------

22 050

------

44 100

------

24 000

--------

48 000

系統視訊鎖定標誌欄位  system_video_lock_flag  

1位元欄位。表示在系統目標解碼器的視訊幀速率和system_clock_frequency之間存在規定的比率。 system_clock_frequency在2.5.2.1中定義而視訊幀率由GB/T XXXX.2規定。如果對GB/T XXXX.1中所有視訊基本流的所有展現單元,system_clock_frequency和實際視訊幀速率的比例SCFR是恆定的,且對視訊串流中所指出的標準幀速率和下表中數值相等,則該字段只能為'1'。

SCFRsystem_clock_frequency / frame_rate_in_the_P-STD       

23.976242529.97305059.9460 1 080 000 900 900900 000540 000

1 126 125

1 125 000

比率SCFR的值是精確的。對於23.976,29.97或59.94幀/秒的標準速率,實際的幀速率與標準速率略有不同。

視頻界限字段  video_bound 

5位元字段,取值是在從0到16的閉區間中的整數且不小於節目流中解碼過程同時活動的GB/T XXXX.2和GB/T AAAA .2流的最大數目。在本小節中,若P-STD緩衝區非空或展現單元正在P-STD模型中展現,則GB/T XXXX.2和GB/T AAAA.2視訊串流的解碼過程是活動的。

分組速率限制標誌欄位  packet_rate_restriction_flag 

1位元標誌位元。若CSPS標識為'1',則該欄位表示2.7.9中規定的哪個限制適用於分組速率。若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',則其後的P-STD_buffer_bound_scale和P-STD_buffer_size_bound欄位指節目流中所有的音訊串流。

若取值'1011 1001',則其後的P-STD_buffer_bound_scale和P-STD_buffer_size_bound欄位指節目流中所有的視訊串流。

若stream_id取其它值,則應該是大於或等於'1011 1100'的一位元組值且應根據表2-18解釋為流的編碼和基本流號碼。

節目流中的每個基本流應在每個系統標題中透過這種機制精確地規定一次它的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_buffer_bound_scale的值為'0',則該欄位以128位元組為單位來度量緩衝區大小的邊界。若P-STD_buffer_bound_scale的值為'1',則該欄位以1024位元組為單位來度量緩衝區大小的邊界。因此:if (P-STD_buffer_bound_scale = = 0)

BS

nP-STD_buffer_size_bound×1288P-STD_buffer_size_bound×1288

P-STD_buffer_size_bound

×1024

所以對於系統頭部的解析,我們一般只要先判斷是否存在系統頭(根據系統頭的起始碼0x000001BB),然後我們讀取系統頭的頭部長度,即PS SYSTEM HEADER LENGTH部分,然後根據頭部的長度,跳過PS系統頭。進入下一個部分,即PS 節目流映射頭。

============================================= ===========

 接著看看

PS流的節目映射流部分(節目流映射)定義:(來自MPEG-2標準文檔)

表2-35  節目流映射

語  法

位數 24   5 uimsbf77bslbf   program_stream_info_length16 8         描述子()        }   32

助記符

)
助記符

_

    packet_start_code_prefix

bslbf

uimsbf

    program_stream_map_length

16

uimsbf

    current_next_indicator

bslbf

    保留

   program_stream_map_version

5

5

5

5

    保留

    標記位

1

bslbf

bslbf

bslbf

    對於(i=0;i

 

 

        描述詞()

 

 

   elementary_stream_map_length

uimsbf

    對於(i=0;i

       流型

uimsbf

      elementary_stream_id uimsbf

      elementary_stream_info_length

16 uimsbf

       for (i=0;i

 

 

    CRC_32

32

}

 

 

 

 

 

 

 

 

節目流映射中各字段的語意定義:

分組起始碼前綴字段  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(1BYTE)、elementary_stream_id(1byte)和elementary_stream_info_length(2byte)欄位總和為4個位元組,所以用elementary_stream_map_length/4可以得到後面定義了幾個流類型資訊。流類型字段  stream_type 

8位元字段,根據表2-29規定了流的類型。此欄位只能標誌包含在PES分組中的基本流且取值不能為0x05。

(這裡我們暫時根據國標GB28181中的定義可以知道

1、MPEG-4 視訊串流:0x10;

2、H.264 視訊串流:0x1B;

2、H.264 視訊串流:0x1B;

3、SVAC 視訊串流

3、03; 4、G.711 音頻流: 0x90;

5、G.722.1 音頻流: 0x92;

6、G.723.1 音頻流: 0x93;

7、G.729 音頻流: 0x93;

7、G.729 音頻流:0385; SVAC音訊串流: 0x9B。流標識字段  elementary_stream_id

 

8位元字段,指出該基本流所在PES分組的PES分組標題中stream_id字段的值。

(這個字段的定義,其中0x(C0~DF)指音頻,0x(E0~EF)為視頻)

基本流資訊長度字段  elmentary_stream_info_length

欄位後的描述符的位元組長度。 (

即這個類型的流描述長度。這個後面的字段後面的指定長度不在elementary_stream_map_length指定的範圍類。)

CRC 32

  CRC_32  CRC 32

  CRC_32 

CRC CRC32值字段在32完整個節目流程映射後在附錄A定義的解碼器暫存器產生0輸出值。

 對於這個字段的解析,我們需要取值0x000001BC的位元串,指出節目流映射的開始,暫時不需要處理,讀取Header Length直接跳過即可,如果需要解析流編碼類型,必須詳細解析這個欄位。

=================

PES包

========================== ===

 接下來我們來分析下PES套件的內容:PES套件=PES header+code raw data;

先看下

PES header(來自http://www.php .cn/)

PS流的格式和解析总结

接著我們來看看解析步驟:(來自MPEG-2標準文件)

表2-17  PES分組

字記符16uimsbfif( stream_id != program_stream_map   && stream_id !=EMM  && stream_id !=program_    && stream_id !=ITU-T Rec.H.222.1 type E stream){PES_scramblingdata_alignment_indicatorbslbfPTS_DTS_flagsES_rate_flag 1DSM_trick_mode_flagDSM_trick_mode 1PES_extension_flag 1 1PT S[32..30] 315  if(PTS_DTS_flags =='11'){ 4PTS[32..30]15bslbf  1 1marker_bit   115 er_bit }  1bslbf22==   lbf 頻率_截斷bslbf  else if (trick_mode _control == freeze_frame) {保留 3bslbf 頻率_截斷 2    5}_ ){    7bslbf}previous_PES_packet_CRC bslbf PES_private_data_flag 1bslbfprogram_packet_sequence_counter_flag PES_private_data 8uimsbf  program_packet_sequence_counter 1 6bslbf if (PES_extension_flag_2 == '1'{   2;i++){ ||stream_id = = ITU-T 建議書。流){  for      padding_byte 8 bslbf}     

 

其中:

表2-18  Stream_id賦值

PES_packet(){

 

prefix

24

bslbf

bslbf

stream_id

 8

uimsbf

 

 

_p 

&& stream_id !=private_stream_2

 

&stream_p

&& stream_id !=DSMCC_stream

 

 

 

 

 

🜟

'10'

 2

bslbf

PES_scrambling

bslbf

PES_priority

bslbf

5 f

copyright

 1

 1

original_or_copy

1

 2

bslbf

bslbf

bslbf

DSM_trick_mode_flag

b slbf

additional_copy_info_flag

 1

bslbf

PES_CRC_flag

bslbf

PES_header_data_length

 8

 8

if(PTS_DTS_flags =='10'){

 

 

'0010'

 4

 4

 4

 4

 4

PTS[29..15]

PTS[14..0]

15 bslbf

}

 

 

' 001 1'

bslbf

marker_bit

 1

bslbf

PTS[29..15]

15

bslbf

marker_bit

 1

]

marker_bit

4

bslbf

PTS [32..30]

 3

bslbf

bslbf

PTS[29..15]

15

bs磅

1

Bslbf

1

( ESCR_flag =='1 '){

3
bslbf

ESCR_base[29..15]

15

bslbf

ESCR_base[14..0]

_m15

 1

 1

bslbf

 

 

 

if(ES_rate_flag =='1'){

 

ES_rate

 1

bslbf

}

 

 

 

技巧模式控制

 3

uimsbf

formof(

field_id

2

 2

}

  control = = Slow_motion){

 

rep_cntrl

 5

uims

 

 

field_id

 3

 3

 3

 3

}

 

_tro

 

 

field_id

 2

bslbf

bslbf

1

bslbf

bslbf

否則如果(trick_mode_control = = Slow_reverse){

rep_cntrl

 5

uimsbf

}

 

保留

 5

bslbf

 

marker_bit

 1

bslbf

 

 

if (PES_CRC_flag=='1'){

 

16

}

 

 

 

bslbf

program_packet_sequence_counter_flag

program_packet_sequence_counter_flag  1

bslbf

P-STD_buffer_flag
P-STD_buffer_flag

bslbf

保留

 3

bslbf

PES_extension_flag_2

PES_extension_flag_2

slbf

if(PES_private_data_flag =='1'){

 

}

 

 

if (pack_header_field_flag == '1'){

 

 

_

pack_header()

 
 

if (program_packer_sequence_counter_flag == '1'){

marker_bit

 1

 1

 7

uims

bf

標記位

 1

bslbf5%

bslbf

original_stuff_length

 

 

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

 

'01'

P-STD_buffer_scale

 1

P-STD_buffer_size
uims bf

}

 

 

 1

bslbf

PES_extension_field_length

 7

; S_extension_field_length;i++){

 

保留

 8

bslbf

 

}

 

 

}

 

 

對於(i=0;i

 

 

stuffing_byte

 8

bslbf

}

 

 

 

}

 

}

 

 

else if (stream_id = =program_stream_map

 

private_stream_2
 

 

| |stream_id = = ECM
 

 

||stream_id = = EMM
||stream_id = = 節目_stream_目錄

 

 

||stream_id = = D

PES_packet_data_byte

 8

bslbf

}

}

else if ( steam_id == padding_stream){

對於(i=0i

 

 

}

 
 

10xBC 3)1110 xxxx ECM_stream(0xF0)1111 0010 5GB/T XXXX.1附錄B或GB/T XXXX.6_DSMCC_stream(0xF2)1111% 1111 010066ITU-T Rec. H .222.1型B1111 011061. 00171111 1010…1111 1110 1111 11114program_stream_directory(0xFF)符號x表示值'0'或'1'都被允許且可產生相同的流類型。流號碼由x的值決定。 1 

stream_id

stream_id

1011 1100

program_stream_map(

1011 11 1110

padding_stream(0xBE)

1011 1111

private_stream-2(0xBF)

GB/T XXXX.3或GB/T AAAA.3音頻串流編號xxxx(

0xC0~0xDF

.7X7272/4878(

)

1111 0000

3

ECM_stream(0xF0)

ECM_stream(0xF0)

3

EMM_stream(0xF1)

ISO/IEC_13522_stream(0xF3)

ITU-T Rec. H.222.1模式A

ITU-T Rec. H.222.1模式A

6

ITU- T Rec. H.222.1型D

1111 1000
6

ITU-T

6

ancillary_stream(0xF9)

類型為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音頻流服從相同的PES分組語法。

3  類型為private_stream_2,ECM_stream和EMM_stream的PES分組與private_stream_1相似,除了在PES_packet_length字段後未規定語法。

類型為program_stream_directory的PES分組有唯一的語法,在2.5.5中作了規定

5  類型為DSM_CC_stream的PES分組有唯一的語法,在GB/T XXXX.6中作了規定。

stream_id與表2-29中的stream_type  0x09相關聯

7  stream_id僅用於PES分組。 PES分組在傳輸流中攜帶了來自節目流或GB/T AAAA.1系統流的資料(參見2.4.3.7)。

 

PES分組中各字段的語意定義

分組起始碼前綴字段  packet_start_code_prefix 

24位代碼,它和標識後面的stream_id

組分組的分組代碼,它和標識後面的stream_id組成了分組開始的組分起始碼。它是一個值為'0000 0000 0000 0000 0000 0001' (0x000001)的位元字串。

流識別欄位  stream_id 

在節目流程中,它規定了基本流的號碼和類型。定義參見表2-18。在傳輸流中,它可以被設定為正確描述表2-18中定義的基本流類型的任何有效值。在傳輸流中,基本流類型在2.4.4的節目特定資訊中作了規定。 PES

分組長度字段  PES_packet_length 

16位元字段,指出了PES分組中跟在該字段後的位元組數目。值為0表示PES分組長度不是沒有規定或沒有限制。這種情況只允許出現在有效負載包含來自傳輸流分組中某個視訊基本流的位元組的PES分組中。 PES

加擾控製字段  PES_scrambling_control 

2位元字段,表示PES分組有效負載的加擾方式。當加擾發生在PES層,PES分組標題,如果有可選字段的話也包括在內,不應被加擾(參見2-19)。 PES

優先權字段  PES_priority 

1位元字段,指示PES分組中有效負載的優先權。 '1'表示PES分組中有效負載的優先權高於該欄位為'0'的PES分組有效負載。多路複合器能使用此欄位來區分安排基本流中資料的優先權。傳輸機制不應改動該欄位。

資料對齊指示符欄位  data_alignment_indicator

 

1位元標誌。置'1'時表示PES分組標題後緊接著在2.6.10中的data_alignment_indicator所指出的視訊起始碼或音訊同步字,如果有data_alignment_indicator描述符的話。若其值為'1'且無該描述符,則需要在表2-47和2-48中alignment_type '01'所表示的對齊。當值為'0'時,沒有定義是否有任何此種的對齊。

版權欄位  copyright

 

1位元欄位。置'1'時表示相關PES分組有效負載的材料受到版權保護。當值為'0'時,沒有定義該資料是否受到版權保護。 2.6.24中所述的版權描述符與包含PES分組的基本流相關。若描述符作用於包含PES分組的資料,則版權標誌置為'1'。

原始或拷貝欄位  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根據式2-11計算。編碼展現時間戳頻率的限制參考2.7.4。

PTS(k)=((system_clock_frequency×tpn(k  (2-11)其中,tpn

(k)是展現單元P

n(k)的展現時間。 對音訊而言,若PES分組標題中有PTS,則它是指PES分組中開始的第一個存取單元。若PES分組中有音訊存取單元的首字節,則有一個音訊存取單元開始於該PES分組中。

對影片而言,若PES分組標題中有PTS,則它是指包含PES分組中開始的第一個畫面起始碼的存取單元。若PES分組中有畫面起始碼的首字節,則有一個畫面起始碼開始於該PES分組中。

對音頻展現單元(PU),low_delay序列中的視頻PU以及B畫面,展現時間tp

n

(k)應等於td

n(k)。 對於非low_delay中的I畫面和P畫面,在存取單元(AU) k和k'之間無解碼不連續時,展現時間tpn

(k)應等於下一個傳輸的I畫面或P畫面的解碼時間td

n(k) (參見2.7.5)。若有解碼不連續或流終止,則tpn(k)和tdn(k)之間的差別應與初始流一直延續,沒有不連續也沒有終止時完全相同。 註1: low_delay序列是low_delay標誌被設定的視訊序列(參見GB/T XXXX.2中的6.2.2.3)。

若音訊中有濾波,則系統模型假定濾波不會導致延遲。因此,編碼時PTS所涉及的取樣與解碼時PTS所涉及的取樣是相同的。可伸縮編碼,請參閱2.7.6。

解碼時間戳字段  DTS  

DTS是一個編碼在三個分離字段中的33位數。它指出了基本流n的第j個展現單元在系統目標解碼器中的解碼時間tdn

(j)。 DTS的值以系統時脈頻率的1/300 (即90 kHz)為單位。解碼時間由DTS依據式2-12計算而來:

DTS

(

j)=((system_clock_frequency×tdn(j       (2 -12)其中,tdn(j)是存取單元An(j)的解碼時間。

對影片而言,若PES分組標題中有DTS,則它是指包含PES分組中開始的第一個畫面起始碼的存取單元。若PES分組中有畫面起始碼的首字節,則該畫面起始碼開始於該PES分組中。 對於可伸縮編碼,參見2.7.6。

ESCR

字段  ESCR_base

,ESCR_extension 

42位字段,分兩部分編碼。第一部分是長度為33位元的字段,其值ESCR_base(i)由式2-14給出;第二部分是長度為9位元的字段,其值ESCR_ext(i)由式2-15給出。 ESCR欄位指出了基本流中包含ESCR_base最後一個位元的位元組到達PES-STD輸出端的期望時間(參見2.5.2.4)。 特別地

ESCR

(

i

)=

ESCR_base

(i)×300+                     (2-13)(其中:ESCR_base(i )=((system_clock_frequency×

t

(

i

)) p 300) % 233   i)=((system_clock_frequency× t(i)) p 1) % 300                (2-15)ESCR和ES_rate欄位(請參閱下方緊接的語意)包含時間點相關的時間PES。這些字段應滿足2.7.3中定義的約束。

基本流量速率欄位  ES_rate 22位元無符號整數。對於PES流而言,它指出了系統目標解碼器接收PES分組的速率。此欄位在它所屬的PES分組以及同一個PES流的後續PES分組中一直有效,直到遇到一個新的ES_rate欄位。此欄位的值以50位元組/秒為單位,且不能為0。此欄位用於定義PES流的位元組到達P-STD輸入端的時間(請參閱2.5.2.4中的定義)。在各個PES分組中,編碼在該欄位中的值可能不同。 特技方式控製字段  trick_mode_control 

3位元字段。它表示作用於相關視訊串流的特技方式。對其它類型的基本流,該字段及其後5位的含義沒有定義。 trick_mode狀態的定義請參考2.4.2.3的特技模式部分。

當trick_mode狀態為假時,對GB/T XXXX.2影片而言,解碼過程輸出漸進序列中每幅畫面的次數N由repeat_first_field和top_field_first欄位來規定。對GB/T AAAA.2影片而言,由序列標題決定。

對於隔行序列,當trick_mode狀態為假時,對GB/T XXXX.2影片而言,次數N由repeat_first_field和progressive_frame欄位來規定。

當trick_mode狀態為真時,畫面的播放次數依賴值N。

表2-20 特技方式控制值

表2-20 特技方式控制值描  述'100''101'-'111'

'001'
慢動作

'010'
凍結幀

'0111'

慢倒

保留

當此字段值發生變化或特技模式操作停止時,可能會出現下列情況的任意組合:

l            時基不連續;

🠎        連續性計數器不連續;

在在特技模式的情況下,解碼和展現的非標準速度可能會導致影片基本流資料中定義的某些欄位值不正確。同樣,片段結構的語意約束也可能無效。這些例外所涉及的視訊文法元素為:

l            bit_rate;

l         field;

l            v_axis_positive;

l           l            burst_amplitude;

l            subcarrier_phase;

在特技模式中,解碼器不應該依賴編碼在這些欄位中的值。

標準並不要求解碼器能解碼trick_mode_control字段。但是,能解碼該欄位的解碼器應能滿足以下標準要求。

快轉fast forword

 

trick_mode_control欄位中的值'000'。當該值出現時,它表示一個快轉視訊串流並定義了PES分組標題中後續5位元的含義。 intra_slice_refresh位元可以設定為'1'以指出可能有遺失的巨集區塊。解碼器可以用前一個解碼畫面中相同位置的宏塊來代替。表2-21中定義的field_id字段,表示應該顯示哪個或哪些字段。 frequency_truncation欄位指出了可能包含的係數受限集合。此欄位值的含義如表2-22所示。

慢動作  slow motion

 

trick_mode_control欄位中的值'001'。當該值出現時,它表示一個慢動作視訊串流,並定義了PES分組標題中後續5個位元的含義。對漸進序列而言,該畫面應顯示N×rep_cntrl時間,其中N定義如上。

對GB/T AAAA.2視訊和GB/T XXXX.2視訊漸進序列而言,該畫面應被顯示N×rep_cntrl時間,其中N定義如上。

對GB/T XXXX.2隔行序列而言,該畫面應顯示N×rep_cntrl時間。若該畫面是一個幀畫面,則待顯示的第一個字段在top_field_first為1時應該是頂字段,在top_field_first為0時,應該是底字段(參見GB/T XXXX.2)。該欄位被顯示N×rep_cntrl / 2時間。該畫面的其它欄位被顯示N-N×rep_cntrl / 2時間。

凍結幀  freeze frame

 

trick_mode_control字段中的值'010'。當該值出現時,它表示凍結幀視訊串流,並定義了PES分組標題中後續5位元的含義。表2-21中定義的field_id字段,表示應該顯示哪個(一些)字段。 field_id欄位指出了包含該欄位的PES分組中開始的第一個視訊存取單元,除非該PES分組包含0個有效負載位元組。在後一種情況下,field_id欄位指出了最近的前一個視訊存取單元。

快倒  fast reverse

 

trick_mode_control欄位中的值'011'。當該值出現時,它表示一個快倒視訊串流並定義了PES分組標題中後續5位元的含義。 intra_slice_refresh位元可以設定為'1'以指出可能有遺失的巨集區塊。解碼器可以用前一個解碼畫面中相同位置的宏塊來代替。表2-21中定義的field_id字段,表示應該顯示哪個或哪些字段。 frequency_truncation欄位指出了可能包含的係數受限集合。此欄位值的意義如表2-22「係數選擇值」所示。

慢倒  slow reverse

 

trick_mode_control字段中的值'100'。當該值出現時,它表示一個慢倒視訊流並定義了PES分組標題中後續5位元的含義。對GB/T AAAA.2視訊和GB/T XXXX.2視訊漸進序列而言,該畫面應被顯示N×rep_cntrl時間,其中N定義如上。

對GB/T XXXX.2隔行序列而言,該畫面應顯示N×rep_cntrl時間。若該畫面是一個幀畫面,則待顯示的第一個字段在top_field_first為1時應該是底字段,在top_field_first為'0'時,應該是頂字段(參見GB/T XXXX.2)。該欄位被顯示N×rep_cntrl/2時間。該畫面的其它欄位被顯示N-N×rep_cntrl / 2時間。

字段標識字段  field_id 

2位元字段,表示應該顯示哪個(一些)字段。根據表2-21對其進行編碼。

表2-21  field_id字段控制值

蟜'01' 僅自底向上播放'10'播放所有幀'10'播放所有幀1位元標誌。置'1'時表示PES分組的視訊資料編碼片中可能有遺失的宏塊;置'0'時,表示上述情況可能不出現。更多的資訊可參考GB/T XXXX.2。解碼器可以用前一個解碼畫面中同一個位置的宏塊來取代遺失的宏塊。 2位元欄位。指出PES分組中資料編碼時可能會用到受限係數集合。其值定義於表2-22。

描  述

'

片內參考字段intra_slice_refresh

 

頻率截斷欄位  frequency_truncation

表2-22  係數選擇值

描述

'01'僅前三個係數非0'10'僅前六個係數非0僅前六個係數非0

'

顯示次數控製字段  rep_cntrl 

5位元字段,指出隔行畫面中每一字段的顯示次數或漸進式畫面顯示次數。對隔行畫面而言,頂字段或底字段是否應首先顯示是視訊序列標題中trick_mode_control字段和top_field_first字段的功能。該欄位值不能為'0'。

附加版權資訊字段  additional_copy_info 

7位元字段,包含與版權資訊相關的專用資料。

前PES分組CRC字段  previous_PES_packet_CRC 

16位元字段。在對前一個PES分組(不包括該PES分組的標題)進行處理後,此欄位包含一個在解碼器的16個暫存器中產生0輸出的CRC值。此CRC值與附錄A中所定義的相類似,但具有以下多項式:

x16+x12+x5+1

注2: x

5

+1注2: CRC3值是為了用於網絡維護,例如將有間隙性錯誤的來源隔離開來,而不是為了供基本流解碼器使用。它僅用於計算資料位元組,因為在傳輸過程中PES分組標題資料可能會被修改。

PES

專用資料標誌欄位  PES_private_data_flag 

1位元標誌。置'1'時表示PES分組標題包含專用資料;置'0'時表示PES分組標題中無專用資料。

包標題欄位標誌欄位  pack_header_field_flag

 1位元標誌。置'1'時表示PES分組標題中有GB/T AAAA.2包標題或節目流包標題。若該欄位在包含於節目流程中的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位元欄位。它是一個可選的計數器,隨著來自於節目流或GB/T AAAA.1流的每一個後續的PES分組或傳輸流中具有單一節目定義的PES分組而遞​​增,以提供與連續性計數器(參見2.4.3.2)相似的功能。它能用於檢索節目流或原始GB/T AAAA.1流中的初始PES分組序列。此計數器在達到最大值後回捲為0。 PES分組不能出現重複。因此,複合節目中任何兩個連續的PES分組不應具有相同的program_packet_sequence_counter值。

MPEG1 MPEG2

標識符欄位  MPEG1_MPEG2_identifier 

1位元標誌。置'1'時表示PES分組所攜帶的資訊來自於GB/T AAAA.1流;置'0'時表示PES分組所攜帶的資訊來自於節目流。

始填充長度欄位

  original_stuff_length

 6位元欄位。指定用於初始GB/T XXXX.1分組標題或初始GB/T AAAA.1分組標題中的填滿位元組數。

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位元組為單位來度量緩衝區的大小。因此:

if ( P-STD_buffer_scale == 0)

BSn=                                        BSn

P -STD_buffer_size

×1024                                           (2-17)當此欄位被GB/T XXXX.1系統目標解碼器收到後,其編碼值則立即生效。 PES

擴充欄位長度欄位  PES_extension_field_length 

7位元欄位。指出了跟在該欄位之後在PES擴充欄位中直到且包含任何保留位元組的資料的位元組長度。 填充位元組字段  stuffing_byte 

8位元字段,其值恆定為'1111 1111'。可以由編碼器插入以滿足通道的需求等。解碼器丟棄該欄位。一個PES分組標題中只能出現32個填充位元組。

PES

分組資料位元組欄位  PES_packet_data_byte 

此欄位應該是來自於分組的stream_id或PID所指定的基本流的連續資料位元組。當基本流資料符合GB/T XXXX.2或GB/T XXXX.3時,該欄位應該是與本標準的位元組相對齊的位元組。基本流的位元組序應保持。此欄位的位元組數N由PES_packet_length欄位規定。 N應等於PES_packet_length減去在PES_packet_length欄位的最後一個位元組與第一個 PES_packet_data_byte間的位元組數。 填料位元組字段  padding_byte 

8位元字段,其值恆定為'1111 1111'。此欄位被解碼器丟棄。 

更多PS流的格式與解析總結 相關文章請關注PHP中文網!  

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn