2010-07-19 16 views
6

¿Cuál es la mejor manera de calcular la longitud del archivo flv usando php sin dependencias externas como ffmpege porque el sitio del cliente se ejecuta en el alojamiento compartido, itry http://code.google.com/p/flv4php/, pero extrae metadatos y no todos los videos contienen metadatos?calcular la longitud del archivo de video flv? usando php puro

+0

¿Te refieres a la duración del video en minutos/segundos? –

+0

sí, eso es lo que quiero decir .. – shox

+0

La especificación está aquí: http://www.adobe.com/devnet/flv/pdf/video_file_format_spec_v10.pdf No se puede deshacer a través de ella, pero no es una tarea trivial. – Wrikken

Respuesta

0

El cálculo para obtener la duración de una película es más o menos esto:

size of file in bytes/(bitrate in kilobits per second/8)

+0

intentaré ... – shox

+0

la mayoría de los archivos itry no contiene bitrate en sus metadatos, y otra forma de extraer bitdate? – shox

7

Hay una forma no demasiado complicado de hacer eso.

Los archivos FLV tienen una estructura de datos específica que les permite ser analizados en orden inverso, suponiendo que el archivo está bien formado.

Simplemente abre el archivo y busca 4 bytes antes del final del archivo.

Obtendrá un gran valor endian de 32 bits que representa el tamaño de la etiqueta justo antes de estos bytes (los archivos FLV están hechos de etiquetas). Puede usar la función unpack con la especificación de formato 'N'.

Luego, puede buscar la cantidad de bytes que acaba de encontrar, lo que le lleva al comienzo de la última etiqueta del archivo.

La etiqueta contiene los siguientes campos:

de señalización del tipo de la etiqueta
  • un gran número entero endian 24 bits que representa la longitud del cuerpo para esta etiqueta (debe ser el valor que encontraste antes
    • un byte, menos 11 ... si no, algo está mal)
    • un número entero grande de 24 bits que representa la marca de tiempo de la etiqueta en el archivo, en milisegundos, más un entero de 8 bits que extiende la marca de tiempo a 32 bits.

    Así que todo lo que tiene que hacer es omitir los primeros 32 bits y descomprimir ('N', ...) el valor de la marca de tiempo que lea.

    Como la duración de la etiqueta de FLV suele ser muy corta, debería dar una duración bastante precisa para el archivo.

    Aquí hay un código de ejemplo:

    $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]; 
    

    Los dos últimos fseek puede factorizar, pero ambos dejaron para mayor claridad.

    Editar: Se corrigió el código después de algunas pruebas

  • +0

    estudiaré su respuesta, gracias – shox

    Cuestiones relacionadas