2014-06-05 5 views
8

मैं FileReader readAsArrayBuffer प्रॉपर्टी का उपयोग कर स्थानीय फ़ाइल पढ़ने की कोशिश कर रहा हूं। पढ़ना सफलता है और "ऑनलोड" कॉलबैक में, मुझे रीडर.रेसल्ट में ऐरे बफर ऑब्जेक्ट दिखाई देता है। लेकिन ऐरे बफर बस खाली है। लंबाई सेट है, लेकिन डेटा नहीं है। मैं यह डेटा कैसे प्राप्त करूं?जावास्क्रिप्ट readAsArrayBuffer खाली रिटर्न देता है Array Buffer

यहाँ मेरी कोड

<!DOCTYPE html> 
<html> 

<body> 
    <input type="file" id="file" /> 
</body> 

<script> 
    function handleFileSelect(evt) { 

     var files = evt.target.files; // FileList object 

     var selFile = files[0]; 
     var reader = new FileReader(); 
     reader.onload = function(e) { 
      console.log(e.target.result); 
     }; 

     reader.onerror = function(e) { 
      console.log(e); 
     }; 
     reader.readAsArrayBuffer(selFile); 
    } 


    document.getElementById('file').addEventListener('change', handleFileSelect, false); 
</script> 

</html> 

reader.result

के लिए कंसोल आउटपुट है
e.target.result 
ArrayBuffer {} 
e.target.result.byteLength 
25312 

किसी को मुझे बताओ कि इस डेटा प्राप्त करने के लिए कर सकते हैं? क्या कोई सुरक्षा समस्या है? कोई त्रुटि नहीं है, आतंक निष्पादित नहीं किया गया है।

टिप्पणियों से: क्या आप कृपया मुझे बफर सामग्री तक पहुंचने के बारे में बता सकते हैं? मैं वास्तव में AudioContext का उपयोग कर एक ऑडियो फ़ाइल चलाने की कोशिश कर रहा हूं ... इसके लिए मुझे बफर डेटा की आवश्यकता होगी ...

+1

क्यों आपको लगता है कि बफर खाली है? आपका कोड वास्तव में बफर सामग्री का उपयोग/निरीक्षण नहीं करता है। शायद आप 'console.log' आउटपुट से उलझन में हैं? 'console.log()' बफर की सामग्री मुद्रित नहीं करेगा। – nmaier

+0

धन्यवाद nmaier, मैंने वही सोचा ... लेकिन मुझे नहीं पता कि बफर सामग्री का उपयोग कैसे करें ... क्या आप कृपया मुझे बफर सामग्री तक पहुंचने के बारे में बता सकते हैं? मैं वास्तव में ऑडियोकॉन्टेक्स्ट का उपयोग कर ऑडियो फ़ाइल चलाने की कोशिश कर रहा हूं ... इसके लिए मुझे बफर डेटा की आवश्यकता होगी ... आपकी मदद के लिए बहुत धन्यवाद –

+1

आप ऑनलोडेंड ईवेंट की बजाय ऑनलोड ईवेंट का उपयोग कर रहे हैं। यदि आप अधिभार ईवेंट को ऑनलोड द्वारा प्रतिस्थापित करते हैं तो आपका कोड काम करेगा। देखें: https://developer.mozilla.org/en-US/docs/Web/API/FileReader – seb

उत्तर

4

ठीक है, AudioContext सामान का उपयोग करके ध्वनि बजाना वास्तव में कठिन नहीं है।

  1. संदर्भ सेट अप करें।
  2. किसी भी डेटा को बफर में लोड करें (उदाहरण के लिए FileReader स्थानीय फ़ाइलों के लिए, XHR दूरस्थ सामग्री के लिए)।
  3. नया स्रोत सेट अप करें, और इसे शुरू करें।
सभी में

सभी, कुछ इस तरह:

var context = new(window.AudioContext || window.webkitAudioContext)(); 

function playsound(raw) { 
    console.log("now playing a sound, that starts with", new Uint8Array(raw.slice(0, 10))); 
    context.decodeAudioData(raw, function (buffer) { 
     if (!buffer) { 
      console.error("failed to decode:", "buffer null"); 
      return; 
     } 
     var source = context.createBufferSource(); 
     source.buffer = buffer; 
     source.connect(context.destination); 
     source.start(0); 
     console.log("started..."); 
    }, function (error) { 
     console.error("failed to decode:", error); 
    }); 
} 

function onfilechange(then, evt) { 
    var reader = new FileReader(); 
    reader.onload = function (e) { 
     console.log(e); 
     then(e.target.result); 
    }; 
    reader.onerror = function (e) { 
     console.error(e); 
    }; 
    reader.readAsArrayBuffer(evt.target.files[0]); 
} 


document.getElementById('file') 
    .addEventListener('change', onfilechange.bind(null, playsound), false); 

एक jsfiddle, जो फ़ायरफ़ॉक्स और क्रोम में मेरे लिए काम करता में इस लाइव देखें।

मैंने अच्छे उपाय के लिए console.log(new Uint8Array()) में फेंक दिया, क्योंकि ब्राउज़र आमतौर पर सामग्री को सीधे लॉग करेगा (यदि बफर बड़ा नहीं है)। अन्य सामानों के लिए जो आप ArrayBuffer एस के साथ कर सकते हैं, उदाहरण के लिए देखें corresponding MDN documentation

+0

से नीचे nmaier के लिए मेरे उत्तरों की जांच करें, मैंने भी वही किया, लेकिन ध्वनि बजाने में त्रुटि हो रही थी ... जो पहेली आपने मुझे दिया है वह भी वही त्रुटि देता है। नीचे है ** सांत्वना उत्पादन ** 'ProgressEvent अब एक ध्वनि, कि Uint8Array साथ शुरू होता है खेल रहे हैं [10] को डिकोड करने में विफल रहा है: null' –

+0

हो सकता है कि आप कुछ फ़ाइल स्वरूप isn लोड करने के लिए कोशिश कर रहे हैं समर्थित नहीं है? सभी ब्राउज़रों (सभी प्लेटफार्मों पर) सभी ऑडियो प्रारूपों का समर्थन नहीं करते हैं। जैसा कि मैंने कहा: मैंने ओएसएक्स 10.9 पर क्रोम और फ़ायरफ़ॉक्स (2 9 और नाइटली) में इस पहेली का परीक्षण किया और यह मेरे लिए काम करता है। – nmaier

+0

ओह नहीं, मुझे समस्या मिलती है, मैंने एक एमपी 3 फ़ाइल और ओजीजी फ़ाइल चलाने की कोशिश की। वे भ्रष्ट प्रतीत होते हैं। मैं उसी साइट से डाउनलोड करता हूं जहां मैं कुछ ऑडियो संदर्भ उदाहरण खोजने की कोशिश कर रहा था ... मैं कोड के साथ कुछ समस्या सोचने के कई विकल्पों की कोशिश कर रहा था, यह सिर्फ मेरा पूरा दिन बर्बाद कर रहा था ... मैं कुछ और खेलना चाहता हूं फ़ाइल करें और देखें कि यह काम करता है ... –

7

यहाँ कैसे सरणी बफर पढ़ सकते हैं और यह बाइनरी स्ट्रिंग में तब्दील,

function onfilechange(evt) { 
var reader = new FileReader(); 
reader.onload = function(evt) { 
    var chars = new Uint8Array(evt.target.result); 
    var CHUNK_SIZE = 0x8000; 
    var index = 0; 
    var length = chars.length; 
    var result = ''; 
    var slice; 
    while (index < length) { 
    slice = chars.subarray(index, Math.min(index + CHUNK_SIZE, length)); 
    result += String.fromCharCode.apply(null, slice); 
    index += CHUNK_SIZE; 
    } 
    // Here you have file content as Binary String in result var 
}; 
reader.readAsArrayBuffer(evt.target.files[0]); 
} 

आप console.log आप हमेशा खाली वस्तु पाने के माध्यम से ArrayBuffer मुद्रित करने के लिए प्रयास करते हैं तो करने के लिए है {}

+0

आप बाइनरी स्ट्रिंग को सरणी बफर में कैसे परिवर्तित करेंगे –

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