mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
add ts PCR analysis, the tool MPEG-2-ts-packet-analysis.2.4.5.0 decode PCR wrong
This commit is contained in:
parent
71015dc4a1
commit
37e53f3735
2 changed files with 158 additions and 36 deletions
105
trunk/doc/ts-PCR-analysis.txt
Normal file
105
trunk/doc/ts-PCR-analysis.txt
Normal file
|
@ -0,0 +1,105 @@
|
|||
packet#7:
|
||||
Adaptation fields
|
||||
Adaptation_field_length: 7
|
||||
discontinuity_indicator: False
|
||||
random_access_indicator: True
|
||||
ES_priority_indicator: False
|
||||
PCR_flag: True
|
||||
OPCR_flag: False
|
||||
splicing_point_flag: False
|
||||
transport_private_data_flag: False
|
||||
adaptation_field_extension_flag: False
|
||||
PCR: 50572350000
|
||||
PES header
|
||||
stream_id: E0 (video stream 224)
|
||||
PES_packet_length: 35808
|
||||
PES_scrambling: 0
|
||||
PES_priority: False
|
||||
data_alignment: False
|
||||
copyright: False
|
||||
original_or_copy: False
|
||||
PTS_flag: True
|
||||
DTS_flag: True
|
||||
ESCR_flag: False
|
||||
ES_rate_flag: False
|
||||
DSM_trick_mode_flag: False
|
||||
additional_copy_info_flag: False
|
||||
PES_CRC_flag: False
|
||||
PES_extension_flag: False
|
||||
PES_header_data_length: 10
|
||||
PTS: 168704280
|
||||
DTS: 168700500
|
||||
|
||||
|
||||
|
||||
packet#665:
|
||||
Adaptation fields
|
||||
Adaptation_field_length: 7
|
||||
discontinuity_indicator: False
|
||||
random_access_indicator: True
|
||||
ES_priority_indicator: False
|
||||
PCR_flag: True
|
||||
OPCR_flag: False
|
||||
splicing_point_flag: False
|
||||
transport_private_data_flag: False
|
||||
adaptation_field_extension_flag: False
|
||||
PCR: 50616225000
|
||||
PES header
|
||||
stream_id: E0 (video stream 224)
|
||||
PES_packet_length: 29213
|
||||
PES_scrambling: 0
|
||||
PES_priority: False
|
||||
data_alignment: False
|
||||
copyright: False
|
||||
original_or_copy: False
|
||||
PTS_flag: True
|
||||
DTS_flag: True
|
||||
ESCR_flag: False
|
||||
ES_rate_flag: False
|
||||
DSM_trick_mode_flag: False
|
||||
additional_copy_info_flag: False
|
||||
PES_CRC_flag: False
|
||||
PES_extension_flag: False
|
||||
PES_header_data_length: 10
|
||||
PTS: 168850530
|
||||
DTS: 168846750
|
||||
|
||||
参考nginx-rtmp函数:ngx_rtmp_mpegts_write_frame
|
||||
其中,nginx-rtmp写入PCR的逻辑如下:
|
||||
if (f->key) {
|
||||
packet[3] |= 0x20; /* adaptation */
|
||||
|
||||
*p++ = 7; /* size */
|
||||
*p++ = 0x50; /* random access + PCR */
|
||||
|
||||
p = ngx_rtmp_mpegts_write_pcr(p, f->dts - NGX_RTMP_HLS_DELAY);
|
||||
}
|
||||
只要碰到关键帧,就写入PCR。
|
||||
ngx_rtmp_mpegts_write_pcr(u_char *p, uint64_t pcr)
|
||||
{
|
||||
*p++ = (u_char) (pcr >> 25);
|
||||
*p++ = (u_char) (pcr >> 17);
|
||||
*p++ = (u_char) (pcr >> 9);
|
||||
*p++ = (u_char) (pcr >> 1);
|
||||
*p++ = (u_char) (pcr << 7 | 0x7e);
|
||||
*p++ = 0;
|
||||
|
||||
return p;
|
||||
}
|
||||
即将高9位置0,6个reserverd置1,低33位输出(little-endian)。
|
||||
|
||||
nginx-rtmp写入dts的逻辑如下:
|
||||
p = ngx_rtmp_mpegts_write_pts(p, 1, f->dts + NGX_RTMP_HLS_DELAY);
|
||||
也就是说,
|
||||
pcr = f->dts - NGX_RTMP_HLS_DELAY
|
||||
f->dts = dts - NGX_RTMP_HLS_DELAY
|
||||
计算出来的:
|
||||
pcr = program_clock_reference_base = 168574500
|
||||
dts = 168700500
|
||||
168574500 = 168700500 - 63000 - 63000
|
||||
可见,工具MPEG-2 TS packet analyser分析出来的pcr是不对的。
|
||||
|
||||
解码出来的结果:
|
||||
demuxer+read packet 0006 0001128 0x47 0x41 0x00 0x35 ... 0xb6 0x9f 0x89
|
||||
ts+af af flags parsed, discontinuity: 0 random: 1 priority: 0 PCR: 1 OPCR: 0 slicing: 0 private: 0 extension: 0 pcr: 168574500 opcr: 0
|
||||
ts+pes stream_id: 224 size: 35808 pts: 168704280 dts: 168700500 total: 35808 header: 13 packet_size: 35795 parsed_size: 157
|
Loading…
Add table
Add a link
Reference in a new issue