2010-07-19 9 views
6

Jaki jest najlepszy sposób obliczenia długości pliku flv za pomocą php bez zewnętrznych zależności, takich jak ffmpege, ponieważ strona klienta działa na współdzielonym hostingu, itry http://code.google.com/p/flv4php/, ale wyodrębnia metadane, a nie wszystkie wideo zawierają metadane?obliczyć długość pliku wideo flv? za pomocą czystego php

+0

Czy oznacza to długość wideo w minutach/sekundach? –

+0

tak, to właśnie mam na myśli .. – shox

+0

Spec jest tutaj: http://www.adobe.com/devnet/flv/pdf/video_file_format_spec_v10.pdf Nie można go przebrnąć, ale nie ma trywialnego zadania. – Wrikken

Odpowiedz

0

Obliczenia aby czas trwania filmu jest mniej więcej tak:

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

+0

Spróbuję .... – shox

+0

większość plików itry nie zawiera bitrate w swoich metadanych i inny sposób na wyodrębnienie bitdate? – shox

7

Jest niezbyt skomplikowany sposób, aby to zrobić.

Pliki FLV mają specyficzną strukturę danych, która umożliwia ich analizowanie w odwrotnej kolejności, zakładając, że plik jest dobrze sformułowany.

Po prostu otwórz plik i wyszukaj 4 bajty przed końcem pliku.

Otrzymasz dużą, 32-bitową wartość endianu, która reprezentuje rozmiar tagu tuż przed tymi bajtami (pliki FLV składają się z tagów). Możesz użyć funkcji unpack ze specyfikacją formatu "N".

Następnie możesz odszukać liczbę znalezionych bajtów, prowadząc do początku ostatniego znacznika w pliku.

Tag zawiera następujące pola:

  • jeden bajt sygnalizacji typ znacznika
  • duży endian 24 bitowa liczba całkowita reprezentująca długość ciała tego znacznika (powinna być wartość znalazłeś wcześniej, minus 11 ... jeśli nie, to coś jest nie tak)
  • duża endianowa 24-bitowa liczba całkowita reprezentująca znacznik czasu znacznika w pliku, w milisekundach plus 8-bitowa liczba całkowita wydłużająca znacznik czasu do 32 bitów.

Wszystko co musisz zrobić to pominąć pierwsze 32 bity i rozpakować ("N", ...) wartość znacznika czasu, którą przeczytałeś.

Ponieważ czas trwania tagu FLV jest zazwyczaj bardzo krótki, powinien dać dość dokładny czas trwania pliku.

Oto przykładowy kod:

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

Dwa ostatnie fseek można factorized, ale zostawiłem je zarówno dla jasności.

Edit: Poprawiono kod po pewnym testów

+0

Będę studiować twoją odpowiedź, dzięki – shox

Powiązane problemy