2013-08-21 8 views
7

के साथ ऑडियो रिकॉर्डिंग ऑडियो मैंने getUserMedia() का उपयोग कर एक ऑडियो रिकॉर्डर किया। और Recorder.jsएचटीएमएल 5 कम केबीपीएस

लेकिन आउटपुट फ़ाइल का उपयोग कर फ़ाइल को सहेजने दूर भारी मेरी सोच से यह किया गया है।

एक 4 मिनट के ऑडियो रिकॉर्ड 40mb की तरह कुछ है। और मैं इसे अपने सर्वर पर नहीं भेज सकता। यदि ऐसा है, तो यह दुर्घटनाग्रस्त हो जाएगा।

तो, मैं खोज कैसे रिकॉर्डिंग केबीपीएस कम करने के लिए। लेकिन मुझे कुछ नहीं मिला। बस कुछ फ्लैश समाधान। लेकिन ये मेरी परियोजना के लिए उपयुक्त नहीं है।

तो, मेरे सवाल है, getUserMedia() का उपयोग कर एक ऑडियो रिकॉर्ड की केबीपीएस कम करने के लिए संभव है?

उत्तर

1

आपके पास कुछ विकल्प हैं।

सबसे पहले, छोटे आकार में कटौती के लिए, आप हमेशा recorderWorker.js फ़ाइल RecorderJS में एक कम नमूना दर और बिट गहराई का उपयोग करने के संशोधित कर सकते हैं। इसके लिए डिजिटल ऑडियो कैसे काम करता है, और टाइप किए गए सरणी के साथ काम करने वाले कुछ स्तर के बारे में थोड़ी सी जानकारी की आवश्यकता होगी - लेकिन बहुत कठिन नहीं होना चाहिए। यदि आप उस सड़क पर जाते हैं, तो this page में WAVE प्रारूप का एक सभ्य स्पष्टीकरण है। बिट गहराई को कम करना काफी सीधे होना चाहिए। Downsampling थोड़ा और जटिल हो सकता है, लेकिन अभी भी थोड़ा सा शोध के साथ काफी कामयाब होना चाहिए। एक बार जब आपको थोड़ा गहराई और नमूना दर मिल जाए, तो रिकॉर्डरजेएस के encodeWAV फ़ंक्शन में हेडर को बदलना बहुत छोटा होना चाहिए।

अन्य विकल्प के लिए एक हानिपूर्ण प्रारूप (जैसे एमपी 3) में बदलने के लिए किया जाएगा। This एकमात्र लाइब्रेरी है जिसे मैं अभी जानता हूं जो ऐसा करेगा, हालांकि और भी हो सकता है। मैंने वास्तव में इसका उपयोग नहीं किया है, और सुना है कि यह थोड़ा धीमा है - लेकिन यदि आप कोई समस्या है तो आप शायद इसे वेब कार्यकर्ता में चला सकते हैं।

10

मेरे मामले में क्रोम 96kHz पर ऑडियो रिकॉर्ड करता है और फ़ायरफ़ॉक्स 44.1kHz पर रिकॉर्ड करता है, जो WAV फ़ाइलों को बड़ा बनाता है। मैं 16000.

function downsampleBuffer(buffer, rate) { 
    if (rate == sampleRate) { 
     return buffer; 
    } 
    if (rate > sampleRate) { 
     throw "downsampling rate show be smaller than original sample rate"; 
    } 
    var sampleRateRatio = sampleRate/rate; 
    var newLength = Math.round(buffer.length/sampleRateRatio); 
    var result = new Float32Array(newLength); 
    var offsetResult = 0; 
    var offsetBuffer = 0; 
    while (offsetResult < result.length) { 
     var nextOffsetBuffer = Math.round((offsetResult + 1) * sampleRateRatio); 
     var accum = 0, count = 0; 
     for (var i = offsetBuffer; i < nextOffsetBuffer && i < buffer.length; i++) { 
      accum += buffer[i]; 
      count++; 
     } 
     result[offsetResult] = accum/count; 
     offsetResult++; 
     offsetBuffer = nextOffsetBuffer; 
    } 
    return result; 
} 

तरह recorderWorker.js अंदर एक downsampling समारोह जहां नमूना अनुपात आप चाहते हैं का चयन कर सकते लागू किया, और मैं इसे कहते हैं जब wav फ़ाइल निर्यात:

function exportWAV(rate, type) { 
    var bufferL = mergeBuffers(recBuffersL, recLength); 
    var bufferR = mergeBuffers(recBuffersR, recLength); 
    var interleaved = interleave(bufferL, bufferR); 
    var downsampledBuffer = downsampleBuffer(interleaved, rate); 
    var dataview = encodeWAV(rate, downsampledBuffer, false); 
    var audioBlob = new Blob([ dataview ], { 
     type : type 
    }); 

    this.postMessage(audioBlob); 
} 
+0

अच्छा! मैं जितनी जल्दी हो सके इसका परीक्षण करूंगा! –

+0

एक और रणनीति औसत बिटरेट की गणना नहीं कर सकती है और केवल प्रति चरण एक नमूना पर विचार कर सकती है: 'परिणाम [ऑफसेट रीसेट] = बफर [ऑफसेट बफर]; ' –

+0

ऐसा लगता है कि यह ठीक काम करता है। – Knelis