まず、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;