एचटीएमएल 5 रिकॉर्ड करने के लिए ऑडियो


123

मैं आखिरकार क्या करना चाहता हूं उपयोगकर्ता के माइक्रोफ़ोन से रिकॉर्ड करें, और फ़ाइल को सर्वर पर अपलोड करें जब वे कर रहे हों। अब तक, मैं निम्नलिखित कोड के साथ एक तत्व के लिए एक धारा बनाने में कामयाब रहा हूं:

var audio = document.getElementById("audio_preview");

navigator.getUserMedia  = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
navigator.getUserMedia({video: false, audio: true}, function(stream) {
   audio.src = window.URL.createObjectURL(stream);
}, onRecordFail);

var onRecordFail = function (e) {
   console.log(e);
}

मैं उस से कैसे जाऊँ, एक फ़ाइल में रिकॉर्डिंग करने के लिए?


2
danml.com/js/recaudio.js इस ब्लॉग पोस्ट के आधार पर कोड से साफ़ की गई एक बहुत ही कम सिंगल-फाइल लिब (5kb) है: टाइप किए गए sarp.org/wp-content/projects/WebAnRecorder दूसरे के विपरीत जो मुझे मिला (कुछ) यहाँ से जुड़ा हुआ है) उपयोग काफी सरल है: रिकॉर्डर.स्टार्ट () और रिकॉर्डर.स्टॉप (fnCallbackToCatchWAV_URL)
dandavis

जवाबों:


105

Http://webaudiodemos.appspot.com/AudioRecorder/index.html पर पूर्ण रूप से पूर्ण रिकॉर्डिंग डेमो उपलब्ध है

यह आपको ब्राउज़र में ऑडियो रिकॉर्ड करने की अनुमति देता है, फिर आपको अपने द्वारा रिकॉर्ड किए गए निर्यात और डाउनलोड करने का विकल्प देता है।

आप जावास्क्रिप्ट को लिंक खोजने के लिए उस पेज के स्रोत को देख सकते हैं, लेकिन संक्षेप में, एक ऐसी Recorderवस्तु है जिसमें एक exportWAVविधि और एक forceDownloadविधि है।


3
@Fibericon अब और नहीं: (स्थिर क्रोम अब भी करता है (संस्करण 28.0.1500.71 Mac)
JSmyth

6
विंडोज 8 पर ठीक से काम नहीं करता है, ऑडियो प्लेबैक चुप है। कोई विचार?
मार्क मर्फी

2
ऑनलाइन परीक्षण करने पर यह ठीक है। लेकिन अगर मैं सभी html फाइल्स (js, png, ...) को सेव करता हूं, तो यह स्थानीय रूप से काम नहीं करती है।
रैंडी टैंग

2
मैंने डेमो का परीक्षण किया है, यह क्रोम और ओपेरा में ठीक काम करता है लेकिन फ़ायरफ़ॉक्स के साथ समस्या है (माइक्रोफोन को मान्यता दी गई है लेकिन ध्वनि नहीं है) .. और सफारी और IE के लिए, वे नहीं जानते कि उस कोड को कैसे संभालना है
टोफंडेल

2
मेरे पास पूरा कोड कहां हो सकता है? मैंने इसे निकालने की कोशिश की लेकिन अपने स्थानीय सर्वर (xampp) में काम नहीं कर रहा
gadss

43

नीचे दिखाया गया कोड मैट डायमंड के लिए कॉपीराइट है और एमआईटी लाइसेंस के तहत उपयोग के लिए उपलब्ध है। मूल फाइलें यहां हैं:

इस फाइल को सेव करें और उपयोग करें

(function(window){

      var WORKER_PATH = 'recorderWorker.js';
      var Recorder = function(source, cfg){
        var config = cfg || {};
        var bufferLen = config.bufferLen || 4096;
        this.context = source.context;
        this.node = this.context.createScriptProcessor(bufferLen, 2, 2);
        var worker = new Worker(config.workerPath || WORKER_PATH);
        worker.postMessage({
          command: 'init',
          config: {
            sampleRate: this.context.sampleRate
          }
        });
        var recording = false,
          currCallback;

        this.node.onaudioprocess = function(e){
          if (!recording) return;
          worker.postMessage({
            command: 'record',
            buffer: [
              e.inputBuffer.getChannelData(0),
              e.inputBuffer.getChannelData(1)
            ]
          });
        }

        this.configure = function(cfg){
          for (var prop in cfg){
            if (cfg.hasOwnProperty(prop)){
              config[prop] = cfg[prop];
            }
          }
        }

        this.record = function(){
       
          recording = true;
        }

        this.stop = function(){
        
          recording = false;
        }

        this.clear = function(){
          worker.postMessage({ command: 'clear' });
        }

        this.getBuffer = function(cb) {
          currCallback = cb || config.callback;
          worker.postMessage({ command: 'getBuffer' })
        }

        this.exportWAV = function(cb, type){
          currCallback = cb || config.callback;
          type = type || config.type || 'audio/wav';
          if (!currCallback) throw new Error('Callback not set');
          worker.postMessage({
            command: 'exportWAV',
            type: type
          });
        }

        worker.onmessage = function(e){
          var blob = e.data;
          currCallback(blob);
        }

        source.connect(this.node);
        this.node.connect(this.context.destination);    //this should not be necessary
      };

      Recorder.forceDownload = function(blob, filename){
        var url = (window.URL || window.webkitURL).createObjectURL(blob);
        var link = window.document.createElement('a');
        link.href = url;
        link.download = filename || 'output.wav';
        var click = document.createEvent("Event");
        click.initEvent("click", true, true);
        link.dispatchEvent(click);
      }

      window.Recorder = Recorder;

    })(window);

    //ADDITIONAL JS recorderWorker.js
    var recLength = 0,
      recBuffersL = [],
      recBuffersR = [],
      sampleRate;
    this.onmessage = function(e){
      switch(e.data.command){
        case 'init':
          init(e.data.config);
          break;
        case 'record':
          record(e.data.buffer);
          break;
        case 'exportWAV':
          exportWAV(e.data.type);
          break;
        case 'getBuffer':
          getBuffer();
          break;
        case 'clear':
          clear();
          break;
      }
    };

    function init(config){
      sampleRate = config.sampleRate;
    }

    function record(inputBuffer){

      recBuffersL.push(inputBuffer[0]);
      recBuffersR.push(inputBuffer[1]);
      recLength += inputBuffer[0].length;
    }

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

      this.postMessage(audioBlob);
    }

    function getBuffer() {
      var buffers = [];
      buffers.push( mergeBuffers(recBuffersL, recLength) );
      buffers.push( mergeBuffers(recBuffersR, recLength) );
      this.postMessage(buffers);
    }

    function clear(){
      recLength = 0;
      recBuffersL = [];
      recBuffersR = [];
    }

    function mergeBuffers(recBuffers, recLength){
      var result = new Float32Array(recLength);
      var offset = 0;
      for (var i = 0; i < recBuffers.length; i++){
        result.set(recBuffers[i], offset);
        offset += recBuffers[i].length;
      }
      return result;
    }

    function interleave(inputL, inputR){
      var length = inputL.length + inputR.length;
      var result = new Float32Array(length);

      var index = 0,
        inputIndex = 0;

      while (index < length){
        result[index++] = inputL[inputIndex];
        result[index++] = inputR[inputIndex];
        inputIndex++;
      }
      return result;
    }

    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');
      /* file length */
      view.setUint32(4, 32 + 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;
    }
<html>
    	<body>
    		<audio controls autoplay></audio>
    		<script type="text/javascript" src="recorder.js"> </script>
                    <fieldset><legend>RECORD AUDIO</legend>
    		<input onclick="startRecording()" type="button" value="start recording" />
    		<input onclick="stopRecording()" type="button" value="stop recording and play" />
                    </fieldset>
    		<script>
    			var onFail = function(e) {
    				console.log('Rejected!', e);
    			};

    			var onSuccess = function(s) {
    				var context = new webkitAudioContext();
    				var mediaStreamSource = context.createMediaStreamSource(s);
    				recorder = new Recorder(mediaStreamSource);
    				recorder.record();

    				// audio loopback
    				// mediaStreamSource.connect(context.destination);
    			}

    			window.URL = window.URL || window.webkitURL;
    			navigator.getUserMedia  = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;

    			var recorder;
    			var audio = document.querySelector('audio');

    			function startRecording() {
    				if (navigator.getUserMedia) {
    					navigator.getUserMedia({audio: true}, onSuccess, onFail);
    				} else {
    					console.log('navigator.getUserMedia not present');
    				}
    			}

    			function stopRecording() {
    				recorder.stop();
    				recorder.exportWAV(function(s) {
                                
                                 	audio.src = window.URL.createObjectURL(s);
    				});
    			}
    		</script>
    	</body>
    </html>


1
@ अंकित अरण्य आप इस ऑडियो रिकॉर्ड फ़ाइल के लिए डाउनलोड कोड प्रदान करते हैं।
इरेन पटेल

2
@ अर्कित अरण्य मेरे लिए यह मददगार है। मैं 3 दिनों से भारी गुगली के साथ इस समस्या पर डटा हुआ हूं
हशीर शेख

1
मुझे उस बूँद का नाम बदलने की आवश्यकता है जो बचत कर रही है। क्योंकि मैं फार्म डेटा के साथ ajax का उपयोग कर सर्वर को ब्लॉब भेज रहा हूं और फाइल नाम देते समय इसकी बूँद दे रहा हूं। क्या ऐसा कुछ है जो आप मेरी मदद कर सकते हैं
जेनिफर


1
मैं आज यहां एक डाउनवोट को छोड़ने के लिए इच्छुक हूं, क्योंकि ScriptProcessorNode मुख्य थ्रेड पर प्रसंस्करण करता है, और लेआउट संगणना, जीसी और इसी तरह के अन्य सामान द्वारा अवरुद्ध किया जाएगा, जिससे उच्च बफर आकार के साथ भी ग्लिट्स हो सकते हैं। यह एक मृत सरल डेमो में या अवधारणा के प्रमाण के रूप में ठीक है, लेकिन किसी भी यथोचित जटिल वास्तविक ऐप में नहीं।
जॉन वीज़

16

अद्यतन अब क्रोम भी समर्थन करता है MediaRecorder v47 से एपीआई। इसका उपयोग करने के लिए एक ही बात होगी (देशी रिकॉर्डिंग विधि का अनुमान है कि यह चारों ओर काम करने की तुलना में तेज है), एपीआई का उपयोग करना वास्तव में आसान है, और आपको सर्वर के लिए एक बूँद अपलोड करने के तरीके के रूप में बहुत सारे उत्तर मिलेंगे। ।

डेमो - क्रोम और फ़ायरफ़ॉक्स में काम करेगा, जानबूझकर सर्वर से ब्लॉब पुश करना ...

कोड स्रोत


वर्तमान में, इसे करने के तीन तरीके हैं:

  1. के रूप में wav[सभी कोड क्लाइंट-साइड, असम्पीडित रिकॉर्डिंग], आप देख सकते हैं -> Recorderjs । समस्या: फ़ाइल का आकार काफी बड़ा है, अधिक अपलोड बैंडविड्थ की आवश्यकता है।
  2. के रूप में mp3> - [सभी कोड क्लाइंट-साइड, संकुचित रिकॉर्डिंग], आप देख सकते हैं mp3Recorder । समस्या: व्यक्तिगत रूप से, मुझे गुणवत्ता खराब लगती है, यह लाइसेंसिंग समस्या भी है।
  3. के रूप में ogg[+ ग्राहक सर्वर ( node.js) कोड, संकुचित रिकॉर्डिंग, ब्राउज़र क्रैश बिना रिकॉर्डिंग के अनंत घंटे], आप देख सकते हैं -> recordOpus , या तो केवल क्लाइंट-साइड रिकॉर्डिंग, या क्लाइंट-सर्वर बंडलिंग, पसंद आपकी है।

    ओग रिकॉर्डिंग उदाहरण (केवल फ़ायरफ़ॉक्स):

    var mediaRecorder = new MediaRecorder(stream);
    mediaRecorder.start();  // to start recording.    
    ...
    mediaRecorder.stop();   // to stop recording.
    mediaRecorder.ondataavailable = function(e) {
        // do something with the data.
    }

    ओग रिकॉर्डिंग के लिए फिडेल डेमो


1
क्रोमियम "script.js: 33
अनकैप्ड टाइपरर

@dikirill आपको एक सर्वर का उपयोग करना चाहिए (यह स्थानीय रूप से काम करता है), यह फ़ाइलों के साथ काम नहीं करेगा, यह भी श्रमिकों पर काम नहीं करता है (मुझे इसमें बहुत सिरदर्द था), यदि आप नहीं जानते कि आपको सर्वर कैसे बनाना है chrome.google.com/webstore/detail/web-server-for-chrome/…
John Balvin Arias

उत्कृष्ट उत्तर, मुझे आपकी स्क्रिप्ट आसान और सरल लगती है। हालाँकि, मैं अनुरोध स्ट्रीम का काम करने के लिए स्टार्ट बटन को बदलने की कोशिश कर रहा था, कोई विचार? github.com/Mido22/MediaRecorder-sample/issues/6
एदो ईदो

13

यह एक साधारण जावास्क्रिप्ट साउंड रिकॉर्डर और एडिटर है। आप इसे आज़मा सकते हैं।

https://www.danieldemmel.me/JSSoundRecorder/

डाउनलोड कर सकते हैंयहां से हैं

https://github.com/daaain/JSSoundRecorder


15
ध्यान दें कि लिंक-केवल उत्तर हतोत्साहित किए जाते हैं, एसओ उत्तर एक समाधान के लिए खोज का अंतिम बिंदु होना चाहिए (बनाम संदर्भों का एक और ठहराव, जो समय के साथ बासी हो जाते हैं)। लिंक को संदर्भ के रूप में रखते हुए कृपया यहां एक स्टैंड-अलोन सिनोप्सिस जोड़ने पर विचार करें।
क्लेओपेट्रा

1
उचित रूप से प्रदान किया गया पहला लिंक मृत है - उपडोमेन रीरूटिंग समस्या। अद्यतन लिंक http://www.danieldemmel.me/JSSoundRecorder/ है, लेकिन उदाहरण वैसे भी (Chrome 60) काम नहीं करता है क्योंकि साइट HTTPS का समर्थन नहीं करती है। सुरक्षित संस्करण पर जा रहे हैं और सुरक्षा चेतावनी को दरकिनार करते हुए डेमो को काम करने की अनुमति देता है।
ब्रिचिन

6

यहाँ एक gitHub प्रोजेक्ट है जो बस यही करता है।

यह एमपी 3 प्रारूप में ब्राउज़र से ऑडियो रिकॉर्ड करता है, और यह स्वचालित रूप से इसे वेबसर्वर पर सहेजता है। https://github.com/Audior/Recordmp3js

आप कार्यान्वयन का विस्तृत विवरण भी देख सकते हैं: http://audior.ec/blog/recording-mp3-using-only-html5-and-javascript-recordmp3-js/


3
उस परियोजना और लेख के आधार पर मैंने एक और छोटा उपकरण लिखा, जिसने उपयोग किए गए कोड को फिर से लिखा और एक पृष्ठ पर कई रिकार्डर का उपयोग करने में सक्षम होने के लिए इसे बढ़ाया। इसके अंतर्गत पाया जा सकता है: github.com/icatcher-at/MP3RecorderJS
Vapire

6

आप Recordmp3js का उपयोग कर सकते हैं अपनी आवश्यकताओं को प्राप्त करने के लिए GitHub से । आप उपयोगकर्ता के माइक्रोफ़ोन से रिकॉर्ड कर सकते हैं और फिर एक एमपी 3 के रूप में फ़ाइल प्राप्त कर सकते हैं। अंत में इसे अपने सर्वर पर अपलोड करें।

मैंने अपने डेमो में इसका इस्तेमाल किया। इस स्थान पर लेखक द्वारा स्रोत कोड के साथ पहले से ही एक नमूना उपलब्ध है: https://github.com/Audior/Recill.com

डेमो यहाँ है: http://audior.ec/recordmp3js/

लेकिन वर्तमान में केवल क्रोम और फ़ायरफ़ॉक्स पर काम करता है।

ठीक और बहुत आसान काम करने लगता है। उम्मीद है की यह मदद करेगा।


1
आपका डेमो क्रोमियम में काम नहीं करता है, कंसोल चेतावनी दिखाता है: getUserMedia () अब असुरक्षित उत्पत्ति पर काम नहीं करता है।
डिकिरिल

HTTP पर, लोकलहोस्ट के माध्यम से या लाइव सर्वर पर इसे चलाने का प्रयास करें?
सैयद


डेमो लिंक टूट गया है।
हेक्टर

4

रिकॉर्डिंग समाप्त होने की प्रतीक्षा किए बिना वास्तविक समय में ऑडियो स्ट्रीम करें : https://github.com/noamtcohen/AudioStreamer

यह पीसीएम डेटा को स्ट्रीम करता है लेकिन आप एमपी 3 या स्पीक्स को स्ट्रीम करने के लिए कोड को संशोधित कर सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.