HTML5 রেকর্ড অডিও ফাইল করতে


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 এই ব্লগ পোস্টের উপর ভিত্তি করে কোড থেকে আমি পরিষ্কার করেছি: typedarray.org/wp- কনটেন্ট / প্রকল্পগুলি / ওয়েব অডিও রেকর্ডারটি আমি খুঁজে পাওয়া অন্যান্যগুলির চেয়ে আলাদা (কিছু এখানে লিঙ্কযুক্ত) ব্যবহারটি বেশ সহজ: রেকর্ডার.স্টার্ট () এবং রেকর্ডার.স্টপ (fnCallbackToCatchWAV_URL)
ডান্ডাভিস

উত্তর:


105

এখানে মোটামুটি সম্পূর্ণ রেকর্ডিং ডেমো পাওয়া যায়: http://webaudiodemos.appspot.com/AudioRecorder/index.html

এটি আপনাকে ব্রাউজারে অডিও রেকর্ড করতে দেয়, তারপরে আপনাকে রেকর্ড করা রফতানি এবং ডাউনলোড করার বিকল্প দেয়।

জাভাস্ক্রিপ্টের লিঙ্কগুলি খুঁজে পেতে আপনি এই পৃষ্ঠার উত্সটি দেখতে পারেন, তবে সংক্ষেপে বলতে গেলে এখানে Recorderএকটি exportWAVপদ্ধতি এবং একটি forceDownloadপদ্ধতি রয়েছে এমন একটি বস্তু রয়েছে ।


3
@ ফাইবারিকন আর নেই (: স্থিতিশীল ক্রোম এখন খুব বেশি করে (সংস্করণ 28.0.1500.71 ম্যাক)
জেএসমিথ

6
উইন্ডোজ 8 এ সঠিকভাবে কাজ করছে বলে মনে হচ্ছে না, অডিও প্লেব্যাকটি নীরব। কোন ধারনা?
মার্ফি মার্ফি

2
অনলাইনে পরীক্ষা করার সময় এটি ঠিক আছে। তবে আমি যদি সমস্ত এইচটিএমএল ফাইলগুলি (জেএস, পিএনজি, ...) সংরক্ষণ করি তবে এটি স্থানীয়ভাবে কাজ করে না।
রেন্ডি তাং

2
আমি ডেমোটি পরীক্ষা করেছি, এটি ক্রোম এবং অপেরাতে সূক্ষ্মভাবে কাজ করে তবে ফায়ারফক্সের সাথে সমস্যা আছে (মাইক্রোফোনটি স্বীকৃত তবে শব্দটি নয়) .. এবং সাফারি এবং
আইআইয়ের

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
@ অঙ্কিত আরেন্যা আমার পক্ষে এটি সহায়ক। আমি ভারী
গুগল

1
আমার সংরক্ষণ করা ব্লবের নাম পরিবর্তন করা দরকার। কারণ আমি ফর্ম ডেটা সহ অজ্যাক্স ব্যবহার করে সার্ভারে ব্লব পাঠাচ্ছি এবং ফাইলের নাম দেওয়ার সময় এটি দেওয়ার ব্লব। আপনি যে আমাকে সাহায্য করতে পারেন কিছু আছে?
জেনিফার

1
@ জেনিফার আপনি সার্ভারের দিক থেকে নামটি পরিবর্তন করতে পারেন
ইয়াসাইন সেদরানি

1
আমি আজ এখানে ডাউন ডাউনকে বাদ দিতে চাইছি, কারণ স্ক্রিপ্টপ্রসেসরনোড মূল থ্রেডে প্রসেসিং করছে, এবং লেআউট কম্পিউটেশন, জিসি এবং অন্যান্য অনুরূপ স্টাফ দ্বারা ব্লক করা হবে, এমনকি উচ্চ বাফার আকারের সাথেও গ্লিট করতে হবে। এটি একটি মৃত সাধারণ ডেমো বা ধারণার প্রমাণ হিসাবে ঠিক আছে, তবে কোনও যুক্তিসঙ্গত জটিল বাস্তব অ্যাপে নয়।
জন ওয়েইজ

16

এখনই আপডেট করুন ক্রোম v47 থেকে মিডিয়া রেকর্ডার এপিআই সমর্থন করে । একই জিনিসটি এটি ব্যবহার করা হবে (অনুমান করে নেটিভ রেকর্ডিং পদ্ধতিটি চারপাশের কাজের তুলনায় দ্রুত হতে বাধ্য), এপিআইটি ব্যবহার করা সত্যই সহজ এবং আপনি সার্ভারের জন্য কীভাবে ব্লব আপলোড করবেন সে সম্পর্কে অনেকগুলি উত্তর খুঁজে পাবেন how ।

ডেমো - ক্রোম এবং ফায়ারফক্সে কাজ করবে, ইচ্ছাকৃতভাবে সার্ভারে ব্লব ঠেকিয়ে রেখেছিল ...

কোড উত্স


বর্তমানে এটি করার জন্য তিনটি উপায় রয়েছে:

  1. যেমন wav[সমস্ত কোড ক্লায়েন্ট-সাইড, ডিকম্প্রেস রেকর্ডিং], আপনি চেক আউট করতে পারেন -> Recorderjs । সমস্যা: ফাইলের আকার বেশ বড়, আরও বেশি আপলোড ব্যান্ডউইথ প্রয়োজন।
  2. যেমন mp3> - [সমস্ত কোড ক্লায়েন্ট-সাইড, সংকুচিত রেকর্ডিং], আপনি চেক আউট করতে পারেন mp3Recorder । সমস্যা: ব্যক্তিগতভাবে, আমি মানটি খারাপ দেখতে পাই, এছাড়াও এই লাইসেন্সিংয়ের সমস্যা রয়েছে।
  3. যেমন ogg[ক্লায়েন্ট + + সার্ভার ( node.js) কোড, সংকুচিত রেকর্ডিং, ব্রাউজার বিফল ছাড়া রেকর্ডিং অসীম ঘণ্টা], আপনি চেক আউট করতে পারেন -> recordOpus , হয় শুধুমাত্র ক্লায়েন্ট-সাইড রেকর্ডিং, বা ক্লায়েন্ট-সার্ভার Bundling, সিদ্ধান্ত আপনার।

    ওজি রেকর্ডিংয়ের উদাহরণ (কেবল ফায়ারফক্স):

    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
ক্রোমিয়াম "স্ক্রিপ্ট.জেএস: 33 আনকচড প্রকারের ত্রুটি: নেভিগেটর.মিডিয়া ডিভাইসস.বেট ইউজারমিডিয়া কোনও ফাংশন নয়"
ডিকিরিল

@ ডিকিরিল আপনি অবশ্যই একটি সার্ভার ব্যবহার করবেন (এটি স্থানীয়ভাবে কাজ করে), এটি ফাইলগুলির সাথে কাজ করবে না, এটি শ্রমিকদের উপরও কাজ করে না (এতে আমার খুব মাথা ব্যাথা হয়েছিল), আপনি যদি সার্ভার তৈরি করতে না জানেন তবে আপনাকে chrome.google.com/webstore/detail/web-server-for-chrome/…
জন

দুর্দান্ত উত্তর, আমি আপনার স্ক্রিপ্টটি সহজ এবং সাধারণ বলে মনে করি। তবে, আমি অনুরোধের কাজটি করার জন্য স্টার্ট বোতামটি পরিবর্তন করার চেষ্টা করছিলাম, কোনও ধারণা? 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/ তবে উদাহরণটি কোনওভাবেই কাজ করে না (ক্রোম 60) কারণ সাইটটি এইচটিটিপিএস সমর্থন করে না। যাওয়া নিরাপদ সংস্করণ এবং নিরাপত্তা সতর্কতা বাইপাস কাজ ডেমো অনুমতি যদিও না।
brichins

6

এখানে একটি গিটহাব প্রকল্প রয়েছে যা কেবল এটি করে।

এটি এমপি 3 ফর্ম্যাটে ব্রাউজার থেকে অডিও রেকর্ড করে এবং এটি স্বয়ংক্রিয়ভাবে এটি ওয়েব সার্ভারে সংরক্ষণ করে। https://github.com/Audior/Recordmp3js

আপনি বাস্তবায়নের বিশদ বিবরণও দেখতে পারেন: http://audior.ec/blog/rec રેકોર્ડ-mp3- using-only-html5-and-javascript-recordmp3-js/


3
প্রকল্প এবং নিবন্ধের উপর ভিত্তি করে আমি আরেকটি ছোট সরঞ্জাম লিখেছিলাম যা ব্যবহৃত কোডটি রিফ্যাক্ট করে এবং এক পৃষ্ঠায় একাধিক রেকর্ডার ব্যবহার করতে সক্ষম হতে এটি বর্ধিত করে। এটি এর অধীনে পাওয়া যাবে: github.com/icatcher-at/MP3RecorderJS
Vapire

6

আপনার প্রয়োজনীয়তা অর্জন করতে আপনি গিটহাব থেকে রেকর্ড্প 3 জে ব্যবহার করতে পারেন । আপনি ব্যবহারকারীর মাইক্রোফোন থেকে রেকর্ড করতে পারেন এবং তারপরে ফাইলটি এমপি 3 হিসাবে পেতে পারেন। অবশেষে এটি আপনার সার্ভারে আপলোড করুন।

আমি আমার ডেমোতে এটি ব্যবহার করেছি। এই অবস্থানটিতে লেখকের উত্স কোডের সাথে ইতিমধ্যে একটি নমুনা পাওয়া গেছে: https://github.com/Audior/Recordmp3js

ডেমোটি এখানে: http://audior.ec/recordmp3js/

তবে বর্তমানে কেবল ক্রোম এবং ফায়ারফক্সে কাজ করে।

সূক্ষ্ম এবং বেশ সহজ কাজ বলে মনে হচ্ছে। আশাকরি এটা সাহায্য করবে.


1
আপনার ডেমোটি ক্রোমিয়ামে কাজ করে না, কনসোল সতর্কতা দেখায়: getUserMedia () আর নিরাপত্তাহীন উত্সে কাজ করে না।
ডিকিরিল

এটিকে HTTP, লোকালহোস্টের মাধ্যমে বা লাইভ সার্ভারে চালানোর চেষ্টা করবেন?
সৈয়দ

1
getUserMedia()ক্রোম 47
-র

ডেমো লিঙ্কটি নষ্ট হয়ে গেছে।
উত্তরাধিকারী

4

শেষের রেকর্ডিংয়ের জন্য অপেক্ষা না করে রিয়েলটাইমে অডিও স্ট্রিম করুন: https://github.com/noamtcohen/AudioStreamer

এটি পিসিএম ডেটা প্রবাহিত করে তবে আপনি এমপি 3 বা স্পেক্স প্রবাহিত করতে কোডটি পরিবর্তন করতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.