7

以下のように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; 

しかし問題は、VLC が最初のフレームのみを再生し、他のフレームを再生しないことです。「初期の画像がスキップされました」という警告が表示されます。

PTSからPCRへの変換を手伝ってくれる人はいますか..

4

3 に答える 3

16

まず、PCR は 33+9 ビット、PTS は 33 ビットです。33 ビット部分 (PCR_base と呼ばれる) は、PTS と同様に 90kHz で動作します。残りの 9 ビットは PCR_ext と呼ばれ、27MHz で動作します。

したがって、これは PCR を計算する方法です。

S64 nPcr = (S64)nPts << 9;

多重化されたストリームの PTS と PCR の間にタイム オフセットが必要であることに注意してください。ストリームによっては、通常、数百ミリ秒の範囲です。

それぞれのデコーダーは、データをデコードし、それぞれの PTS によって指定された時間にプレゼンテーションの準備を整えるのにある程度の時間を必要とします。そのため、PTS は常に PCR よりも「進んでいる」のです。ISO-13818 および一部の DVB 仕様では、バッファリングと (逆) 多重化に関する詳細が示されています。

あなたのビットシフトについてはわかりませんが、これは私のコードスニペットです。コメントは、ビットを正しい場所にシフトするのに役立つ場合があります。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;
于 2011-06-01T13:28:33.783 に答える
3

@schieferstapel の答えは正しいです。ここでは、例外に関するメモを 1 つだけ追加します。

B フレームが (誰の PTS より小さいか) P フレームの後に到着する場合があります。したがって、すべての画像にPTS値がスタンプされている場合、PTSは非線形になる可能性があります。一方、PCR は段階的に直線的でなければなりません。

したがって、上記の状況では、B フレームを省略するか、PCR 値を入れるときに関連する計算を行う必要があります。また、これがハードウェア プレイアウトである場合、対応する I フレームの PTS よりも PCR をわずかに進める (400 ミリ秒ほど少なくする) ことをお勧めします。

于 2011-11-27T11:37:13.710 に答える
0

PCR には 33(PCR_Base)+6(PCR_const)+9(PCR_Ext) のビット数が含まれており、最初の 33 ビットは 90 kHz クロックに基づいており、最後の 9 ビットは 27 MHz クロックに基づいていることも示しています。 PCR_const = 0x3F PCR_Ext=0 PCR_Base=pts/dts

以下のコードは簡単に理解できます。

    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];
于 2016-10-12T07:44:40.657 に答える