вычислить flv длину видеофайла? использование чистого php

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

6
задан shox 19 July 2010 в 15:04
поделиться

2 ответа

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

Файлы 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 можно разложить на множители, но я оставил их оба для ясности.

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

7
ответ дан 17 December 2019 в 00:02
поделиться

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

размер файла в байтах / (битрейт в килобитах в секунду / 8)

0
ответ дан 17 December 2019 в 00:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: