Генерация ПЦР из ПТС
Я пытаюсь создать ПЦР из ПТС следующим образом.
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 воспроизводит только первый кадр и не воспроизводит другие кадры. и я получаю предупреждение "ранняя картинка пропущена".
Может ли кто-нибудь помочь мне в переходе от ПТС к ПЦР..
3 ответа
Во-первых, 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;
Ответ @schieferstapel правильный. Я только добавляю еще одну заметку, которая относится к исключению.
Есть моменты, когда B кадров приходит после (у кого PTS меньше) P кадров. таким образом, PTS может быть нелинейным, если каждое изображение помечено значением PTS. Принимая во внимание, что ПЦР должен быть постепенно линейным.
Таким образом, в описанной выше ситуации вы должны попытаться либо пропустить B-кадры, либо выполнить соответствующие вычисления при задании значений ПЦР. Кроме того, если это аппаратное воспроизведение, рекомендуется, чтобы PCR был немного впереди (меньше на 400 мс или около того), чем PTS соответствующих I-кадров.
PCR содержит 33(PCR_Base)+6(PCR_const)+9(PCR_Ext) количества битов, а также утверждает, что первые 33 бита основаны на тактовой частоте 90 кГц, в то время как последние 9 основаны на тактовой частоте 27 МГц.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];