2010-07-19 12 views
6

fppege जैसे बाह्य निर्भरताओं के साथ php का उपयोग करके FLV फ़ाइल की लंबाई की गणना करने का सबसे अच्छा तरीका क्या है क्योंकि क्लाइंट साइट साझा होस्टिंग, itry http://code.google.com/p/flv4php/ पर चलती है, लेकिन यह मेटाडेटा निकालती है और सभी वीडियो में मेटा डेटा नहीं होता है?FLV वीडियो फ़ाइल की लंबाई की गणना करें? शुद्ध php

+0

क्या आपका मतलब मिनटों/सेकंड में वीडियो की लंबाई है? –

+0

हां, मेरा मतलब है .. – shox

+0

spec यहां है: http://www.adobe.com/devnet/flv/pdf/video_file_format_spec_v10.pdf इसके माध्यम से wade करने के लिए पूर्ववत नहीं है, लेकिन कोई मामूली कार्य नहीं है। – Wrikken

उत्तर

0

गणना प्राप्त करने के लिए एक फिल्म की अवधि लगभग यह है:

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

+0

मैं कोशिश करूंगा .... – shox

+0

अधिकांश फाइलों में यह मेटा डेटा में कोई बिटरेट नहीं है, और बिटकडेट निकालने का दूसरा तरीका है? – shox

7

कि करने के लिए एक नहीं बहुत जटिल तरीके से नहीं है।

एफएलवी फाइलों में एक विशिष्ट डेटा संरचना है जो उन्हें रिवर्स ऑर्डर में पार्स करने की अनुमति देती है, यह मानते हुए कि फ़ाइल अच्छी तरह से बनाई गई है।

बस फ़ाइल को खोलें और फ़ाइल के अंत से पहले 4 बाइट्स खोजें।

आपको एक बड़ा एंडियन 32 बिट मान मिलेगा जो कि इन बाइट्स (एफएलवी फाइलों टैग से बने हैं) से पहले टैग के आकार का प्रतिनिधित्व करता है। आप 'एन' प्रारूप विनिर्देश के साथ unpack फ़ंक्शन का उपयोग कर सकते हैं।

फिर, आप बाइट्स की संख्या पर वापस जा सकते हैं जो आपको अभी मिला है, जिससे आप फ़ाइल में अंतिम टैग की शुरुआत कर सकते हैं।

टैग निम्नलिखित क्षेत्रों में शामिल हैं:

  • एक बाइट टैग
  • एक बड़ा endian 24 बिट पूर्णांक इस टैग के लिए शरीर की लंबाई का प्रतिनिधित्व करने के प्रकार के संकेत (इससे पहले कि आप पाया मूल्य होना चाहिए, शून्य 11 ... यदि नहीं, तो कुछ गलत है)
  • फ़ाइल में टैग के टाइमस्टैम्प का प्रतिनिधित्व करने वाला एक बड़ा एंडियन 24 बिट पूर्णांक, मिलीसेकंड में, साथ ही साथ 8 बिट पूर्णांक 32 बिट्स तक टाइमस्टैम्प का विस्तार करता है।

तो आपको बस इतना करना है कि पहले 32 बिट्स को छोड़ दें, और अनपैक ('एन', ...) आपके द्वारा पढ़े गए टाइमस्टैम्प मान को छोड़ दें।

जैसे कि एफएलवी टैग अवधि आमतौर पर बहुत छोटी होती है, इसे फ़ाइल के लिए काफी सटीक अवधि देनी चाहिए।

यहां कुछ नमूना कोड है:

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

दो पिछले fseek factorized जा सकता है, लेकिन मैं उन दोनों को स्पष्टता के लिए छोड़ दिया है।

संपादित करें: कुछ परीक्षण के बाद कोड को फिक्स्ड

+0

मैं आपके उत्तर का अध्ययन करूंगा, धन्यवाद – shox

संबंधित मुद्दे