получить длину видео в формате 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

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

спасибо

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

 $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