рассчитать длину видео файла FLV?используя чистый php - PullRequest
6 голосов
/ 19 июля 2010

Каков наилучший способ рассчитать длину FLV-файла, используя php без внешних зависимостей, таких как ffmpege, потому что сайт клиента работает на виртуальном хостинге, все же http://code.google.com/p/flv4php/,, но он извлекает метаданные, а не все видео содержат метаданные?

Ответы [ 2 ]

7 голосов
/ 19 июля 2010

Существует не слишком сложный способ сделать это.

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 могут бытьфакторизован, но я оставил их обоих для ясности.

Редактировать: Исправлен код после некоторого тестирования

0 голосов
/ 19 июля 2010

Расчет продолжительности фильма примерно такой:

size of file in bytes / (bitrate in kilobits per second / 8)

...