Существует не слишком сложный способ сделать это.
FLV-файлы имеют особую структуру данных, которая позволяет анализировать их в обратном порядке, предполагая, что файл правильно сформирован.
Просто откройте файл и найдите 4 байта до конца файла.
Вы получите 32-битное значение с прямым порядком байтов, которое представляет размер тега непосредственно перед этими байтами (FLV-файлы состоят из тегов).Вы можете использовать функцию unpack
со спецификацией формата 'N'.
Затем вы можете вернуться к количеству байтов, которое вы только что нашли, что приведет вас к началу последнего тега в файле..
Тег содержит следующие поля:
- один байт, сигнализирующий о типе тега
- 24-разрядное целое число с прямым порядком байтов, представляющее длину тела для этого тега(должно быть значением, которое вы нашли ранее, минус 11 ... если нет, то что-то не так)
- 24-битное целое число с прямым порядком байтов, представляющее метку времени тега в файле в миллисекундах, плюс 8-битное целое числорасширение временной метки до 32 бит.
Итак, все, что вам нужно сделать, - это пропустить первые 32 бита и распаковать ('N', ...) прочитанное вами значение временной метки.
Поскольку длительность тега FLV обычно очень мала, она должна дать довольно точную продолжительность для файла.
Вот пример кода:
$flv = fopen("flvfile.flv", "rb");
fseek($flv, -4, SEEK_END);
$arr = unpack('N', fread($flv, 4));
$last_tag_offset = $arr[1];
fseek($flv, -($last_tag_offset + 4), SEEK_END);
fseek($flv, 4, SEEK_CUR);
$t0 = fread($flv, 3);
$t1 = fread($flv, 1);
$arr = unpack('N', $t1 . $t0);
$milliseconds_duration = $arr[1];
Два последних fseek могут бытьфакторизован, но я оставил их обоих для ясности.
Редактировать: Исправлен код после некоторого тестирования