Как генерировать метки времени из ПЦР в Hex - PullRequest
0 голосов
/ 05 ноября 2019

При проверке транспортного потока с использованием tsduck я вижу, что некоторые пакеты содержат значение PCR в шестнадцатеричном формате. Я не уверен, как преобразовать их в метки времени.

Например, в пакете ниже значение PCR равно 0x000002014CE

* Packet 179
  ---- TS Header ----
  PID: 481 (0x01E1), header size: 25, sync: 0x47
  Error: 0, unit start: 1, priority: 0
  Scrambling: 0, continuity counter: 4
  Adaptation field: yes (21 bytes), payload: yes (163 bytes)
  Discontinuity: 0, random access: 0, ES priority: 0
  PCR: 0x000002014CE
  ---- PES Header ----
  Stream id: 0xE0 (Video 0)
  PES packet length: 0 (unbounded)
  ---- Full TS Packet Content ----
  47 41 E1 34 14 12 00 00 0D B0 7E 4E 0C 02 0A 22 8E 00 00 D1 2D 03 64 00
  29 00 00 01 E0 00 00 84 C0 0A 31 00 07 44 B7 11 00 05 D4 37 00 00 00 01
  09 30 00 00 01 06 01 03 03 84 19 80 00 00 01 41 9A 84 93 D1 13 7F F0 28
  2C 26 B5 35 90 10 B7 32 8C FF 00 D3 47 BE 4C 9A 83 AE CD B8 9C 09 5A 60
  07 BE C4 F2 2C 5D D3 24 6C 7F A0 E1 C4 7B BC FA 37 CA C5 C0 B0 C4 2C 91
  96 09 07 22 C4 A8 55 FF C2 BF 0E 7E 10 74 6D 84 F2 08 9D D0 29 52 7F 2B
  F6 3E C8 23 1F BC 4E 80 C3 AE FD AC F4 96 08 E5 13 C8 A7 41 20 B4 F6 F8
  E1 14 4A 03 4C 8E 98 00 04 73 2D AE 83 31 0B C8 61 03 3A A1

То, что я пробовал, смотрит на первые несколько экземпляров пакетовкоторые имели значения ПЦР в них, затем преобразовывали их в десятичную и затем делили на 90000, что является тактовой частотой тактовой частоты ПЦР (т. е. временной базы).

Table with PCR in seconds

Но, глядя на последний столбец, он выглядит неправильно. Казалось бы, интервалы слишком велики. Я думал, что ПЦР должен вставлять ПЦР-штампы, по крайней мере, каждые 100 мс или около того, но это кажется слишком редким ...

1 Ответ

1 голос
/ 05 ноября 2019

Вы не используете правильную временную базу. Если вы посмотрите на приведенный вами пример, tsduck показывает PCR как 0x000002014CE Но это шестнадцатеричное значение вообще не отображается в этом пакете. Причина в том, что ПЦР - это больше, чем просто отметка времени, это две отметки времени. ПЦР в гексе на самом деле 00 00 0D B0 7E 4E Итак, как нам получить от 0xDB07E4E до 0x2014CE? Мы извлекаем компонент 90 кГц, сдвигая 0xDB07E4E вправо на 15 бит, затем извлекаем компонент 27 МГц, маскируя верхние 39 бит. Затем умножьте компонент 90 кГц на 300, чтобы преобразовать его в 27 МГц (300=27000000/90000) и сложите вместе два значения:

300*(0xDB07E4E>>15) + (0xDB07E4E&0x1ffff) = 0x2014CE

Теперь у нас есть метка времени 27 МГц. Чтобы преобразовать это в секунды, разделите на 27000000

0x2014CE/27000000=0.0779

Следовательно:

0x58e54 = 0.0135
0x78707 = 0.0183

TLDR: время составляет 27000000, а не 90000

...