2011-06-02 13 views
5

Mientras trato de obtener la longitud de un archivo de video flv obtengo 0 segundos donde como solo ocurre con algunos videos, de lo contrario mi función funciona bien.obtener longitud de video flv

a continuación es mi código.

<?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)) 
?> 

He adjuntado tanto trabajo y no trabajo de video FLV en el siguiente enlace:

de vídeo de trabajo: http://blog.developeronhire.com/wp-content/uploads/downloads/2011/06/working_copy.flv

no de vídeo de trabajo: http://blog.developeronhire.com/wp-content/uploads/downloads/2011/06/not_working_copy.flv

se observará ninguna idea.

Gracias

+0

posible duplicado http://stackoverflow.com/questions/3282273/calculate-flv-video-file-length-using-pure-php –

+0

@Mr. Negro: lo siento, no está duplicado. por favor lea mi problema primero y coméntelo. – Sujeet

+1

trabajando en un archivo y en otro no funciona, ¿es esa pregunta duplicada para obtener la longitud de video del archivo flv? –

Respuesta

7

Este tipo de problema se produce cuando la metainformación de un video se corruga parcial o totalmente. Para resolver este problema, utilice la herramienta de línea FFMPEG commnad, para reparar dicho archivo corrupto durante la carga. a continuación se muestra un fragmento de código que extrae la duración del video usando 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); 
?> 

para descargar FFMPEG ir a http://www.ffmpeg.org

0

Puede extraer metadatos de vídeo FLV, encontrará toda la información, como la longitud, tamaño, etc. Ver enlace http://code.google.com/p/flv4php/ Buena Suerte sujeet

+0

pero es eso para todo tipo de archivos de video? –

1

En primer lugar, me temo que su función podría dejar de funcionar en absoluto, dado suficientemente grande archivo de vídeo FLV, y golpear memory_limit de PHP

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

porque en realidad está cargando todo el archivo en la memoria.

Luego, el archivo que no funciona también parece estar dañado. flvmeta da el siguiente resultado:

$ 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) 

Si usted necesita para obtener de manera eficiente la duración de un archivo que podría estar dañado, o que contengan etiquetas no estándar, recomiendo que uses MediaInfo, lo que hace un gran trabajo en manejar incluso los archivos de video más exóticos, sin alterarlos como lo haría ffmpeg.

Puede ser llamado desde PHP como cualquier programa de línea de comando, y su salida controlada a través de argumentos de línea de comando:

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

que muestra la duración del vídeo en milisegundos.

+0

muchas gracias por el tiempo. Ya tu solución funciona bien. Gracias de nuevo – Sujeet

Cuestiones relacionadas