Hi,
I used the TS container to encapsulate my H264 and AAC. I want to use the PCR
value to control UDP sending. However, I found that the PCR value I got from
ffmpeg is very strange.
Firstly, some of the pcr value is super big and abnormal, such as
pcr_extention:475,pcr_base:2127168108,
pcr_extention:111,pcr_base:1162685276
------------------pcr_extention:0,------------------pcr_base:18590400
------------------pcr_extention:0,------------------pcr_base:18597600
------------------pcr_extention:0,------------------pcr_base:18604800
------------------pcr_extention:0,------------------pcr_base:18612000
------------------pcr_extention:227,------------------pcr_base:18446744073583863388
------------------pcr_extention:0,------------------pcr_base:18619200
------------------pcr_extention:0,------------------pcr_base:18626400
------------------pcr_extention:0,------------------pcr_base:18633600
------------------pcr_extention:0,------------------pcr_base:18640800
Secondly, I found the difference between two PCR value is 7200 or 3600, which
is 80ms or 40ms. And there are twenty-four 80ms and only two 40ms every 26
differences. According the standard, TS stream should have a pcr value at least
40ms. So I do not know why.
Here is the code I used to parse PCR value, I hope it is correct.
int i=0; //position pointer iterator
int buf_size = 0; //the length of data packet
uint8_t *buf = NULL; //data packet pointer
uint8_t *position = NULL; //starting point for each 188B
uint8_t adaption_field = 0; //adaption field existing flag
unsigned int pcr_flag; //pcr existing flag
uint8_t *pcr_field = NULL; //pcr field pointer
uint64_t pcr_base; //base part of pcr
unsigned int pcr_ext; //extentions part of pcr
for(i=0;i<buf_size;) {
position = &buf[i];
adaption_field = (position[3] & 0x30)>>4;
if(adaption_field > 1) {
pcr_flag = (position[5] & 0x10)>>4;
if(pcr_flag == 1) {
pcr_field = position + 6;
pcr_base = (pcr_field[0] * 0x2000000) +
(pcr_field[1] * 0x20000) + (pcr_field[2] * 0x200) + (pcr_field[3] * 0x02) +
((pcr_field[4] & 0x80) >> 7);
pcr_ext = ((pcr_field[4] & 0x01) *
0x100) + pcr_field[5];
printf("------------------pcr_extention:%u,",pcr_ext);
printf("------------------pcr_base:%llu
\n",pcr_base);
}
}
i += 188;
}
So does anyone can help me with that?
Thanks.
Best regards,
Li
_______________________________________________
Libav-user mailing list
[email protected]
http://ffmpeg.org/mailman/listinfo/libav-user