Чтение временного кода 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.