получить длину видео FLV - PullRequest
5 голосов
/ 02 июня 2011

Пока я пытаюсь получить длину видеофайла 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 ]

7 голосов
/ 06 июня 2011

Этот тип проблемы возникает, когда метаинформация видео частично или полностью искажена.Чтобы решить эту проблему, используйте инструмент 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

1 голос
/ 14 июня 2011

Прежде всего, я боюсь, что ваша функция может вообще перестать работать из-за достаточно большого 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

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

0 голосов
/ 02 июня 2011

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

...