Получить длину видео FLV

В то время как я пытаюсь получить длину видеофайла FLV, я получаю 0 секунд, где, как это происходит только с некоторыми видео, в противном случае моя функция работает нормально.

ниже мой код.

<?php
function mbmGetFLVDuration($file){
    // read file
  if (file_exists($file)){
    $handle = fopen($file, "r");
    $contents = fread($handle, filesize($file));
    fclose($handle);
    //
    if (strlen($contents) > 3){
      if (substr($contents,0,3) == "FLV"){
        $taglen = hexdec(bin2hex(substr($contents,strlen($contents)-3)));
        if (strlen($contents) > $taglen){
          $duration = hexdec(bin2hex(substr($contents,strlen($contents)-$taglen,3)))  ;
          return $duration;
        }
      }
    }
  }
}
// not working video file
$result = ceil(mbmGetFLVDuration('not_working_copy.flv')/1000);
// working video file
//$result = ceil(mbmGetFLVDuration('working_copy.flv')/1000);
echo date('H:i:s',mktime(0,0,$result))
?>

я приложил как работающие, так и не работающие FLV видео в ссылке ниже:

рабочее видео: http://blog.developeronhire.com/wp-content/uploads/downloads/2011/06/working_copy.flv

не работает видео: http://blog.developeronhire.com/wp-content/uploads/downloads/2011/06/not_working_copy.flv

любая идея будет оценена.

Спасибо

3 ответа

Решение

Этот тип проблемы возникает, когда метаинформация видео частично или полностью искажена. Чтобы решить эту проблему, используйте инструмент FFMPEG commnad line, чтобы восстановить такой поврежденный файл при загрузке. ниже приведен фрагмент кода, который извлекает длительность видео с помощью FFMPEG.

<?php
     ob_start();
     passthru("ffmpeg -i working_copy.flv  2>&1");
     $duration = ob_get_contents();
     $full = ob_get_contents();
     ob_end_clean();
     $search = "/duration.*?([0-9]{1,})/";
     print_r($duration);
     $duration = preg_match($search, $duration, $matches, PREG_OFFSET_CAPTURE, 3);
     print_r('<pre>');
 print_r($matches[1][0]);
 print_r($full);
?>

чтобы скачать FFMPEG перейдите на http://www.ffmpeg.org/

Прежде всего, я боюсь, что ваша функция может вообще перестать работать, учитывая достаточно большой FLV-видеофайл и попадание PHP в memory_limit

$contents = fread($handle, filesize($file));

потому что вы фактически загружаете весь файл в память.

Тогда нерабочий файл также кажется поврежденным для меня. flvmeta дает следующий вывод:

$ flvmeta --check not_working_copy.flv
0x00488473: error E30013: unknown tag type 250
0x00488477: error E40023: timestamps are decreasing from 130543 to 0
2 error(s), 0 warning(s)

Если вам нужно эффективно получить длительность из файла, который может быть поврежден или содержит нестандартные теги, я рекомендую вам использовать MediaInfo, который отлично справляется с обработкой даже самых экзотических видеофайлов, не изменяя их, как это делает ffmpeg,

Он может быть вызван из PHP как любая программа командной строки, а его вывод контролируется аргументами командной строки:

$ MediaInfo --Inform="Video;%Duration%" not_working_copy.flv
130000

который отображает продолжительность видео в миллисекундах.

Вы можете извлечь метаданные FLV-видео, найти всю информацию, такую ​​как длина, размер и т. Д. См. Ссылку http://code.google.com/p/flv4php/ Удачи sujeet

Другие вопросы по тегам