2012-03-09 21 views
5

से परोसा जाता है। समस्या यह है कि सफारी में, ऑडियो.duration टैग काम नहीं करता है और अनंतता देता है। अगर मैं सीधे ऑडियो पर ऑडियो का स्रोत सेट करता हूं तो सब कुछ ठीक काम करता है। लेकिन मैं नहीं चाहता कि मेरे उपयोगकर्ता फ़ाइल के पथ को देखें।audio.duration सफारी पर इन्फिनिटी लौटाता है जब एमपी 3 तो, मैं एक PHP स्क्रिप्ट है कि एचटीएमएल 5 के ऑडियो टैग करने के लिए अपने एमपी 3 फ़ाइल भेजता है पीएचपी

फिर भी, यह कैसे मैं PHP से मेरी हेडर भेज रहा है।

मैं पहले से ही सामग्री पर्वतमाला होने की कोशिश की है। इससे मदद नहीं मिली।

if (file_exists($filename)) { 
    $fp = fopen($filename, 'r'); 
    $etag = md5(serialize(fstat($fp))); 
    fclose($fp); 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-Type: audio/mpeg"); 
    header('Content-Length: ' . (string)(filesize($filename))); 
    header('Content-Disposition: inline; filename="' . $filename . '"'); 
    header('X-Pad: avoid browser bug'); 
    header('Cache-Control: no-cache'); 
    header('Etag: ' . $etag); 

    //GetContentRange($filelength); 

    readfile($filename); 
    exit; 
} 
else { 
    header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found', true, 404); 
    echo "no file"; 
} 

उत्तर

4

मुझे एक ही समस्या थी और कुछ शीर्षलेख जोड़े गए। मेरे लिए काम करने लगता है -

header("Pragma: public"); 
header("Expires: 0"); 
header("Content-Type: audio/mpeg"); 
header('Content-Length: ' . $fsize); 
header('Content-Disposition: inline; filename="' . $track2play . '"'); 
header('Content-Range: bytes 0-'.$shortlen.'/'.$fsize); 
header('Accept-Ranges: bytes'); 
header('X-Pad: avoid browser bug'); 
header('Cache-Control: no-cache'); 
header('Etag: ' . $etag); 

$ fsize फ़ाइल आकार है और $ shortlen = $ फ़ाइल आकार-1 ... सफारी 5.1.4 पर और नए iPad पर परीक्षण किया ...

1

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

विफलता कुछ एचटीएमएल 5 ब्राउज़रों पर समस्याएं होंगी। अक्सर अवधि फ़ाइल से पढ़ा नहीं जा सकता के रूप में कुछ प्रारूपों की आवश्यकता है कि शुरू करने और फ़ाइल के अंत को पढ़ा जाता है उसकी अवधि पता है। क्रोम ब्राउज़र होने लगता है जिसमें सर्वर पर रेंज अनुरोध सक्षम नहीं है, तो समस्याएं हैं, लेकिन सभी ब्राउज़र में कुछ समस्या होगी, भले ही आपको केवल को सभी मीडिया को बंद करने से पहले लोड करना होगा अंत की ओर।

this post देखें, उदाहरण के लिए रेंज अनुरोध सक्षम मीडिया के साथ मीडिया की सेवा कैसे करें।

इसके अलावा, मैं तुम्हें No-Cache उपयोग कर रहे हैं ..

सर्वर प्रतिक्रिया का उपयोग करते हुए मीडिया के स्थानीय कैश निष्क्रिय करने के लिए देखा कुछ एचटीएमएल 5 ब्राउज़रों के साथ कारण समस्याओं कर सकते हैं। यह अज्ञात होने के लिए मीडिया के की अवधि का कारण बन सकता है।

1
  • आज मैं इस मुद्दे को देखने में मेरा अधिकांश समय बर्बाद हो गया और अंततः एक समाधान के साथ बाहर आया। इन्फिनिटी के रूप में सफारी अवधि क्यों सुरक्षित है, इसका कारण है: ऐसा लगता है कि सफारी फ़ाइलों को चलाने के लिए सर्वर से दो बार अनुरोध करता है। सबसे पहले यह श्रेणी इस तरह के रेंज हेडर वाले सर्वर से अनुरोध भेजता है: (बाइट्स: 0-1)।
  • यदि सर्वर आंशिक सामग्री के रूप में प्रतिक्रिया वापस नहीं करता है और यदि यह पूरी स्ट्रीम देता है तो सफारी ब्राउज़र ऑडियो.duration टैग सेट नहीं करेगा और जिसके परिणामस्वरूप फ़ाइल केवल एक बार और हो सकती है। टी फिर से खेला जा सकता है।
  • मैंने इसे एक त्वरित फिक्स किया, सर्वर पक्ष में बस शीर्षलेख की जांच करें और यदि इसमें कोई श्रेणी हैडर है तो उसे वापस करें।

    String rangeHeader = request.getHeader("Range"); if(rangeHeader != null) { //just return it }

+0

हाय @smurf मैं भी ऑडियो लिंक करने के लिए पहली कॉल को देखने के साथ रेंज शीर्षक में "0-1 बाइट्स"। लेकिन क्या आप "वापसी" द्वारा इसका मतलब अधिक विशिष्ट हो सकते हैं? यह क्या है, इस मामले में? मैं प्रतिक्रिया में सामग्री-रेंज हेडर का उपयोग करके एक बाइट वापस कर सकता हूं। क्या यही मतलब है तुम्हारा? – Hewins