首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从PTS生成PCR

从PTS生成PCR
EN

Stack Overflow用户
提问于 2011-06-01 18:48:26
回答 3查看 17.8K关注 0票数 7

我尝试从PTS创建PCR,如下所示。

代码语言:javascript
复制
        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; 

但问题是VLC只播放第一帧,而不播放任何其他帧。我收到了“早期图片被跳过”的警告。

有人能帮我把PTS转换成PCR吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-01 21:28:34

首先,PCR位为33+9位,PTS位为33位。33位部分(称为PCR_base)的频率为90 The,PTS也是如此。其余9位称为PCR_ext,运行频率为27 The。

因此,下面是计算PCR的方法:

代码语言:javascript
复制
S64 nPcr = (S64)nPts << 9;

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

相应的解码器需要一些时间来解码数据,并在相应的PTS给定的时间准备好呈现,这就是为什么PTS总是在PCR之前。ISO-13818和一些DVB规范提供了关于缓冲和(解)多路复用的细节。

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

代码语言:javascript
复制
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;
票数 16
EN

Stack Overflow用户

发布于 2011-11-27 19:37:14

@schieferstapel的答案是正确的。我在这里只添加了一个引用异常的注释。

有时B帧在(谁的PTS小于)P帧之后到达。因此,如果每个图片都用PTS值标记,则PTS可以是非线性的。然而,PCR必须是增量线性的。

因此,在上述情况下,您必须尝试在放置PCR值时忽略B帧或进行相关计算。此外,如果这是硬件播放,则建议PCR应该比相应I帧的PTS稍微领先(小于400ms左右)。

票数 3
EN

Stack Overflow用户

发布于 2016-10-12 15:44:41

PCR包含33(PCR_Base)+6(PCR_const)+9(PCR_Ext)个比特,并且它还声明前33个比特基于90 kHz时钟,而最后9个比特基于27 MHz clock.PCR_const = 0x3F PCR_Ext=0 PCR_Base=pt/dts

下面的代码很容易理解。

代码语言:javascript
复制
    PCR_Ext = 0;
    PCR_Const = 0x3F;
    int64_t pcrv = PCR_Ext & 0x1ff;
    pcrv |= (PCR_Const << 9) & 0x7E00;
    pcrv |= (PCR_Base << 15) & 0xFFFFFFFF8000LL;

    pp = (char*)&pcrv;
    data[ 6] = pp[5];
    data[ 7] = pp[4];
    data[ 8] = pp[3];
    data[ 9] = pp[2];
    data[10] = pp[1];
    data[11] = pp[0];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6199940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档