from:http://blog.chinaunix.net/uid-26000296-id-3478558.html
一、引言
MPEG2系统用于视音频同步以及系统时钟恢复的时间标签分别在ES,PES和TS这3个层次中。
在TS 层, TS头信息包含了节目时钟参考PCR(Program Clock Reference),
用于恢复出与编码端一致的系统时序时钟STC(System Time Clock)。
在PES层, 在PES头信息里包含有表示时间戳PTS(Presentation Time Stamp)和
解码时间戳DTS(Decoding Time Stamp);
在ES 层, 与同步有关的主要是视频缓冲验证VBV(Video Buffer Verifier),
用以防止解码器的缓冲器出现上溢或者下溢;
标准规定在原始音频和视频流中,
PTS的间隔不能超过0.7s,
出现在TS包头的PCR间隔不能超过0.1s。
图1 从ES到PES的示意图
MPEG-2对视频的压缩产生I帧、P帧、B帧.
将上图所示的帧顺序 "I1-P4-B2-B3-P7-B5-B6" 表示的ES帧,
通过打包并在每个帧中插入PTS/DTS标志,组成PES.
在插入PTS/DTS标志时,
对于B帧, 由于在B帧PTS和DTS是相等的,所以无须在B帧插入DTS(参见图1).
对于I帧和P帧, 由于经过复用后, 数据包的顺序会发生变化,
显示前一定要存储于视频解码器的排序缓存器中,经过从新排序后再显示,
所以一定要同时插入PTS和DTS作为从新排序的依据.
二、同步机制
编码器
系统时钟STC:
编码器中有一个系统时钟(其频率是27MHz),
此时钟用来产生指示音视频的正确显示和解码的时间戳,
同时可用来指示在采样过程中系统时钟本身的瞬时值。
PCR(Program Clock Reference):
指示系统时钟本身的瞬时值的时间标签称为节目参考时钟标签(PCR)。
PCR的插入必须在PCR字段的最后离开复用器的那一时刻,
同时把27MHz系统时钟的采样瞬时值作为PCR字段插入到相应的PCR域。
它是放在TS包头的自适应区中传送.
27MHz的系统时钟STC经波形整理后分成两路:
PCR_ext (9bits ), 由27MHz脉冲直接触发计数器生成扩展域.
PCR_base(33bits), 经300分频器分频成90kHz脉冲送入一个33位计数器生成90kHz基值,
用于和PTS/DTS比较,产生解码和显示所需要的同步信号.
这两部分被置入PCR域,共同组成42位的PCR.
Table 2-2 Transport packet of the Recommendation|International Standard
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
==============================================================================
syntax No.of bits Mnemonic
==============================================================================
transport_packet(){
sync_byte
...
adaptation_field_control 2 bslbf
continuity_counter 4 uimsbf
if
(adaptation_field_control ==
'10'
||
adaptation_field_control ==
'11'
){
adaptation_field()
}
...
}
==============================================================================
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
==============================================================================
syntax No.of bits Mnemonic
==============================================================================
adaptation_field(){
adaptation_field_length 8 uimsbf
if
(adaptation_field_length>0){
...
PCR_flag 1 bslbf
...
if
(PCR_flag ==
'1'
){
program_clock_reference_base 33 uimsbf
Reserved 6 bslbf
program_clock_reference_extension 9 uimsbf
...
}
}
}
==============================================================================
|
t(i): 字节i的编码时间.
03:02:29.012 = ((3 * 60) + 2) * 60 + 29.012 = 10949.012s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
==============================================================================
syntax No.of bits Mnemonic
==============================================================================
PES_packet(){
packet_start_code_prefix 24 bslbf
stream_id 8 uimsbf
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-T REc.H.222.1 type E stream){
'10'
2 bslbf
...
PTS_DTS_flags 2 bslbf
...
if
(PTS_DTS_flags ==
'10'
){
'0010'
4 bslbf
PTS[32..30] 3 bslbf
marker_bit 1 bslbf
PTS[29..15] 15 bslbf
marker_bit 1 bslbf
PTS[14..0] 15 bslbf
marker_bit 1 bslbf
}
if
(PTS_DTS_flag ==
'11'
){
'0011'
PTS[32..30] 3 bslbf
marker_bit 1 bslbf
PTS[29..15] 15 bslbf
marker_bit 1 bslbf
PTS[14..0] 15 bslbf
marker_bit 1 bslbf
'0001'
4 bslbf
DTS[32..30] 3 bslbf
marker_bit 1 bslbf
DTS[29..15] 15 bslbf
marker_bit 1 bslbf
DTS[14..0] 15 bslbf
marker_bit 1 bslbf
}
...
}
...
}
==============================================================================
|