У меня есть файл MPEG2 TS, и теперь я заинтересован в извлечении информации PTS из каждого кадра изображения. Я знаю, что PTS описывается в 33 битах, включая 3 маркера. Но я не знаю, как это битовое поле может быть преобразовано в более понятную форму (секунды, миллисекунды). Кто-нибудь может мне помочь, пожалуйста
Все тактовые сигналы транспортного потока MPEG2 (PCR, PTS, DTS) имеют единицы 1/90000 секунды. У PTS и DTS есть три маркера, которые нужно пропустить. Шаблон всегда (от самого младшего до младшего разряда) 3 бита, маркер, 15 бит, маркер, 15 бит, маркер. Маркеры должны быть равны 1. В C удаление маркеров будет работать так:
uint64_t v; // this is a 64bit integer, lowest 36 bits contain a timestamp with markers
uint64_t pts = 0;
pts |= (v >> 3) & (0x0007 << 30); // top 3 bits, shifted left by 3, other bits zeroed out
pts |= (v >> 2) & (0x7fff << 15); // middle 15 bits
pts |= (v >> 1) & (0x7fff << 0); // bottom 15 bits
// pts now has correct timestamp without markers in lowest 33 bits
Они также имеют поле расширения 9 битов, образуя 42-битное целое число, в котором расширение является младшим значащим битом. Единицы для базового + удлинителя составляют 1/27000000 секунды. Многие реализации оставляют расширение как все нули.
24 часа / день * 60 минут / час * 60 секунд / мин * 90k / сек (часы) = 7962624000, для которого необходимо представить 33 бита; Вы можете извлечь свое время из часов, используя эту информацию;