2015-03-10 7 views
6
function floatTo16BitPCM(output, offset, input){ 
    for (var i = 0; i < input.length; i++, offset+=2){ 
    var s = Math.max(-1, Math.min(1, input[i])); 
    output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true); 
    } 
} 

function writeString(view, offset, string){ 
    for (var i = 0; i < string.length; i++){ 
    view.setUint8(offset + i, string.charCodeAt(i)); 
    } 
} 

function encodeWAV(samples){ 
    var buffer = new ArrayBuffer(44 + samples.length * 2); 
    var view = new DataView(buffer); 

    /* RIFF identifier */ 
    writeString(view, 0, 'RIFF'); 
    /* RIFF chunk length */ 
    view.setUint32(4, 36 + samples.length * 2, true); 
    /* RIFF type */ 
    writeString(view, 8, 'WAVE'); 
    /* format chunk identifier */ 
    writeString(view, 12, 'fmt '); 
    /* format chunk length */ 
    view.setUint32(16, 16, true); 
    /* sample format (raw) */ 
    view.setUint16(20, 1, true); 
    /* channel count */ 
    view.setUint16(22, 2, true); 
    /* sample rate */ 
    view.setUint32(24, sampleRate, true); 
    /* byte rate (sample rate * block align) */ 
    view.setUint32(28, sampleRate * 4, true); 
    /* block align (channel count * bytes per sample) */ 
    view.setUint16(32, 4, true); 
    /* bits per sample */ 
    view.setUint16(34, 16, true); 
    /* data chunk identifier */ 
    writeString(view, 36, 'data'); 
    /* data chunk length */ 
    view.setUint32(40, samples.length * 2, true); 

    floatTo16BitPCM(view, 44, samples); 

    return view; 
} 

हाय, मैं इस स्कूल कोड के लिए ऑडियो रिकॉर्ड करने के लिए इस स्रोत कोड का उपयोग कर रहा हूं। यह 44100Hz और 16 बिट में ऑडियो रिकॉर्ड करता है। मैं 16000 हर्ट्ज और 16 बिट में ऑडियो रिकॉर्ड करने के लिए रिकॉर्डिंग सेटिंग्स बदलना चाहता हूं। मैंने फ़ंक्शन एन्कोड WAV में 44 को संशोधित करने की कोशिश की लेकिन यह काम नहीं किया।वेब पर प्रीसेट ऑडियो, प्रीसेट: 16000Hz 16 बिट

function encodeWAV(samples){ 
    var buffer = new ArrayBuffer(44 + samples.length * 2); 
    var view = new DataView(buffer) 

इसके अलावा, मैं floadRToBitPCM बदलने की कोशिश की है। मैंने 44 से 16 बदलने की कोशिश की लेकिन यह भी काम नहीं किया।

floatTo16BitPCM(view, 44, samples); 

आप मुझे इस मुद्दे के साथ मदद कर सकते हैं ?? मुझे नहीं पता कि इस स्रोत कोड को कैसे संशोधित करें।

+0

आपका नमूनाRate चर सेट किया जा रहा है? –

उत्तर

3

मुझे विश्वास नहीं है कि आप वेब ऑडियो एपीआई का उपयोग करके नमूना दर को नियंत्रित कर सकते हैं ... यह ब्राउज़र के बाहर परिभाषित सिस्टम डिफ़ॉल्ट नमूना दर को चुनता है ... निश्चित रूप से रिकॉर्डिंग के बाद, आप प्रोग्रामिंग रूप से अपने ऑडियो को बदल सकते हैं किसी भी नमूना दर के लिए अनुकरण करें ... अधिकांश ऑडियो प्लेयर केवल मानक नमूना दरों के मीडिया को चला सकते हैं ... 16 केएचजेज़ की नमूना दर प्रस्तुत करने में सक्षम होने से 44 से पुन: शुरू होने से अधिक चुनौतीपूर्ण हो सकता है।1 से 16 केएचजे

1

आप गलत फ़ील्ड को संशोधित कर रहे हैं। एक लहर फ़ाइल डेटा के बाद एक शीर्षलेख है। तरंग हेडर आमतौर पर 44 बाइट लंबा है। 44 का मान आप नमूना कोड में देख रहे हैं उससे संबंधित है और 44100 पर नहीं है।

कोड में कहीं न कहीं आप पोस्ट नहीं किया है, sampleRate 44100. होने के लिए आपको लगता है कि परिभाषा पता लगाने और अपने कोड के बाकी और नमूने के स्रोत यह काफी नहीं हो सकता है पर निर्भर करता है 16000. करने के लिए इसे बदलने की जरूरत है परिभाषित किया गया है हालांकि यह आसान है। उदाहरण के लिए, यदि किसी डिवाइस से नमूने रिकॉर्ड किए जा रहे हैं और डिवाइस को 44100 पर रिकॉर्ड करने के लिए कॉन्फ़िगर किया गया है तो सहेजे गए तरंगों को 16000 के रूप में चिह्नित करना वांछित प्रभाव नहीं होगा। यह बैरी व्हाइट प्रभाव प्लेबैक 2.75x बहुत धीमी उर्फ ​​बनाने जा रहा है।

7

संपादित करें:

एक अन्य विकल्प (ज्यादा बेहतर एक IMO) सिर्फ .ogg प्रारूप, demo में HTML के MediaRecorder और रिकार्ड के लिए जाना है, और यह git repo


मुझे लगता है कि यह सोचते रहा है आप स्रोत के रूप में this का उपयोग कर रहे हैं, और जैकेट ने कहा, लाइन floatTo16BitPCM(view, 44, samples); में नमूना दर के साथ कुछ लेना देना नहीं है ...

function exportWAV(type){ 
    var buffers = []; 
    for (var channel = 0; channel < numChannels; channel++){ 
     buffers.push(mergeBuffers(recBuffers[channel], recLength)); 
    } 
    if (numChannels === 2){ 
     var interleaved = interleave(buffers[0], buffers[1]); 
    } else { 
     var interleaved = buffers[0]; 
    } 
    var dataview = encodeWAV(interleaved); 
    var audioBlob = new Blob([dataview], { type: type }); 
    this.postMessage(audioBlob); 
} 
इस में

:यदि आप डेटा resample करना चाहते हैं, तो आप इस संशोधित है

function exportWAV(type, desiredSamplingRate){ 
    var buffers = []; 
    for (var channel = 0; channel < numChannels; channel++){ 
     var buffer = mergeBuffers(recBuffers[channel], recLength); 
     buffer = interpolateArray(buffer, desiredSamplingRate, sampleRate); 
     buffers.push(buffer); 
    } 
    sampleRate = desiredSamplingRate; 
    if (numChannels === 2){ 
     var interleaved = interleave(buffers[0], buffers[1]); 
    } else { 
     var interleaved = buffers[0]; 
    } 
    var dataview = encodeWAV(interleaved); 
    var audioBlob = new Blob([dataview], { type: type }); 
    this.postMessage(audioBlob); 
} 

फिर से नमूना डेटा के लिए कोड,

// for changing the sampling rate, data, 
function interpolateArray(data, newSampleRate, oldSampleRate) { 
    var fitCount = Math.round(data.length*(newSampleRate/oldSampleRate)); 
    var newData = new Array(); 
    var springFactor = new Number((data.length - 1)/(fitCount - 1)); 
    newData[0] = data[0]; // for new allocation 
    for (var i = 1; i < fitCount - 1; i++) { 
    var tmp = i * springFactor; 
    var before = new Number(Math.floor(tmp)).toFixed(); 
    var after = new Number(Math.ceil(tmp)).toFixed(); 
    var atPoint = tmp - before; 
    newData[i] = this.linearInterpolate(data[before], data[after], atPoint); 
    } 
    newData[fitCount - 1] = data[data.length - 1]; // for new allocation 
    return newData; 
}; 
function linearInterpolate(before, after, atPoint) { 
    return before + (after - before) * atPoint; 
}; 

संपादित करें: अगर आप इसे बहुत ज्यादा नहीं बदलेंगे, आप इसे

पर कड़ी मेहनत कर सकते हैं
+0

हां, आप सही हैं, मैं इस स्रोत कोड का उपयोग github.com से करता हूं। जैसा आपने ऊपर लिखा है, मैंने आपके निर्देश के अनुसार कोड को संशोधित करने का प्रयास किया है। सबकुछ अच्छा काम करता है, लेकिन जब मैं पीसी पर रिकॉर्ड की गई ध्वनि डाउनलोड करता हूं तो यह खुला नहीं हो सकता है। खोलने के दौरान एक त्रुटि है कि ऑडियो समर्थित प्रारूप नहीं है। ऐसा लगता है कि ऑडियो क्षतिग्रस्त या प्रारूप में दर्ज किया गया है जो पीसी में समर्थित नहीं है। – Nikolaus

+0

इस कोड को चेक करें, https://github.com/Mido22/tmp1, मेरे लिए, यह लिनक्स env में 'फ़ायरफ़ॉक्स' और 'क्रोम' दोनों पर काम करता है ... – mido

+0

ध्यान दें कि एक sinc interpolation का उपयोग बिना sinc के महत्वपूर्ण रूप से डाउनसमूल करने के लिए फ़िल्टर ("ईंटवॉल" कम-पास फ़िल्टर) उच्च आवृत्ति सामग्री में कुछ गंभीर एलियासिंग मुद्दों का कारण बन सकता है। – cwilso

0

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

function init(config) { 
      //sampleRate = config.sampleRate; 
      sampleRate = 16000; 
      debugger; 
      //numChannels = config.numChannels; 
      numChannels = 1; 
      initBuffers(); 
     } 
संबंधित मुद्दे