出现在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
============================================================================== 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() } ... } ==============================================================================
============================================================================== 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"的PCR计算如下: 03:02:29.012 = ((3 * 60) + 2) * 60 + 29.012 = 10949.012s PCR_ext = ((27 000 000 * 10949.012) / 1 ) % 300 = 0 PCR = 98 541 080 * 300 + 0 = 295 623 324 000 |
============================================================================== 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 } ... } ... } ==============================================================================VBV_delay: