Каков наилучший способ рассчитать длину FLV-файла с помощью php с внешними зависимостями, такими как ffmpege, потому что клиентский сайт работает на общем хостинге, itry http://code.google.com/p/flv4php/ , но он извлекает метаданные, а не все видео содержат метаданные?
Это не слишком сложный способ сделать это.
Файлы FLV имеют определенную структуру данных, которые позволяют анализировать их в обратном порядке, предполагая, что файл хорошо сформирован.
Просто скопируйте файл и найдите 4 байта до конца файла.
Вы получите 32-значное значение большого конца, представляющее размер тега непосредственно перед этими байтами (FLV-файлы сделаны из тегов). Вы можете использовать функцию unpack
с спецификацией формата «N».
Затем вы можете вернуться к количеству найденных байтов, что приведет вас к началу последнего тега в файле.
Тег содержит следующие поля:
Итак, все, что вам нужно сделать, это пропустить первые 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 могут быть факторизованы, но я оставил их для ясности.
Изменить: исправлен код после некоторого тестирования
Расчет для получения продолжительности фильма примерно такой:
size of file in bytes / (bitrate in kilobits per second / 8)