Генерация ПЦР из ПТС - PullRequest
       53

Генерация ПЦР из ПТС

7 голосов
/ 01 июня 2011

Я пытаюсь создать ПЦР из PTS следующим образом.

        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 ..

Ответы [ 3 ]

16 голосов
/ 01 июня 2011

Во-первых, 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;
3 голосов
/ 27 ноября 2011

Ответ @schieferstapel правильный.Я только добавляю еще одну заметку, которая ссылается на исключение.

Бывают случаи, когда B-кадры приходят после (у кого PTS меньше) P-кадров.таким образом, PTS может быть нелинейным, если каждое изображение помечено значением PTS.Принимая во внимание, что ПЦР должен быть постепенно линейным.

Таким образом, в описанной выше ситуации вы должны попытаться либо пропустить B-кадры, либо выполнить соответствующие вычисления при задании значений ПЦР.Кроме того, если это аппаратное воспроизведение, рекомендуется, чтобы PCR был немного впереди (меньше на 400 мс или около того), чем PTS соответствующих I-кадров.

0 голосов
/ 12 октября 2016

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];
...