Во-первых, PCR имеет 33 + 9 битов, PTS 33 бита.33-битная часть (называемая PCR_base) работает на частоте 90 кГц, как и PTS.Оставшиеся 9 битов называются PCR_ext и работают на частоте 27 МГц.
Таким образом, вы можете рассчитать 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;