从PTS生成PCR

Ven*_*Ven 7 mpeg-2 mpeg2-ts

我试图从PTS创建PCR如下.

        S64 nPcr = nPts * 9 / 100;  
        pTsBuf[4] = 7 + nStuffyingBytes;  
        pTsBuf[5] = 0x10;   /* flags */  
        pTsBuf[6] = ( nPcr >> 25 )&0xff;  
        pTsBuf[7] = ( nPcr >> 17 )&0xff;  
        pTsBuf[8] = ( nPcr >> 9  )&0xff;  
        pTsBuf[9] = ( nPcr >> 1  )&0xff;  
        pTsBuf[10]= ( nPcr << 7  )&0x80;  
        pTsBuf[11]= 0; 
Run Code Online (Sandbox Code Playgroud)

但问题是VLC只播放第一帧而不播放任何其他帧.我收到警告"早期图片被跳过".

任何人都可以帮助我从PTS转换为PCR ..

sch*_*pel 16

首先,PCR具有33 + 9位,PTS 33位.与PTS一样,33位部分(称为PCR_base)以90kHz运行.其余的9位称为PCR_ext,运行频率为27MHz.

因此,这就是你如何计算PCR:

S64 nPcr = (S64)nPts << 9;
Run Code Online (Sandbox Code Playgroud)

注意,在多路复用流的PTS和PCR之间应该存在时间偏移,它通常在几百毫秒的范围内,具体取决于流.

各个解码器需要一些时间来解码数据并使其准备好在各个PTS给出的时间进行呈现,这就是PTS始终"超前"PCR的原因.ISO-13818和一些DVB规范给出了关于缓冲和(解)多路复用的细节.

关于你的bithifting我不确定,这是我的代码片段.注释可能有助于将位移位到正确的位置,R代表保留.

data[4] = 7;
data[5] = 1 << 4;   // PCR_flag

// pcr has 33+9=42 bits

//        4           3          2          1          0
// 76543210 98765432 10987654 32109876 54321098 76543210
// xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xRRRRRRx xxxxxxxx
// 10987654 32109876 54321098 76543210 9      8 76543210
//  4          3          2          1                 0
// b6       b7       b8       b9       b10      b11

data[ 6] = (pcr >> 34) & 0xff;
data[ 7] = (pcr >> 26) & 0xff;
data[ 8] = (pcr >> 18) & 0xff;
data[ 9] = (pcr >> 10) & 0xff;
data[10] = 0x7e | ((pcr & (1 << 9)) >> 2) | ((pcr & (1 << 8)) >> 8);
data[11] = pcr & 0xff;
Run Code Online (Sandbox Code Playgroud)