Чтение временного кода MPEG-2

Я использую старый код много лет назад, чтобы вычислить продолжительность видео в формате MPEG-2. Кажется, что-то изменилось, поскольку я получаю 1 час 49 секунд за 49 секундное видео.

Последний заголовок GOP найден в файле, и 4-байтовый временной код извлекается "040E2AC0". В 32-битном LongWord это выглядит как little-endian как 3223981572.

Затем порядок байтов меняется с помощью функции ассемблера bswap eax. В результате получается 68037312. Затем некоторый код на Паскале извлекает длительность следующим образом...

Hours   := (TimeCode shr 26) and $1F;
Minutes := (TimeCode shr 20) and $3F;
Seconds := (TimeCode shr 13) and $3F;

Часы равны 1, но должны быть 0. Минуты верны в 0. Секунды верны в 49.

Я не умею немного манипулировать, чтобы отладить проблему. Что-то не так с этим? Я мог бы организовать ссылку на видео, если это поможет.

Большое спасибо, Росс.

1 ответ

Решение

Размещение вашего файла было хорошей идеей.

Если вы посмотрите на первую GOP в файле, она имеет байтовые значения 04 08 00 40 (и последняя Республиканская партия 04 0E 2A C0 как вы сказали)

Когда в вашей процедуре выполняется первая GOP, результатом будет 01:00:00, то есть ровно 1 час.

Я не нашел никакой спецификации для этого, но, очевидно, длина - это разница между первым и последним GOP.

Другие вопросы по тегам