How can I add predefined length to audio recorded from MediaRecorder in Chrome? How can I add predefined length to audio recorded from MediaRecorder in Chrome? google-chrome google-chrome

How can I add predefined length to audio recorded from MediaRecorder in Chrome?


This is a chrome bug.

FF does expose the duration of the recorded media, and if you do set the currentTimeof the recorded media to more than its actual duration, then the property is available in chrome...

var recorder,  chunks = [],  ctx = new AudioContext(),  aud = document.getElementById('aud');function exportAudio() {  var blob = new Blob(chunks);  aud.src = URL.createObjectURL(new Blob(chunks));  aud.onloadedmetadata = function() {    // it should already be available here    log.textContent = ' duration: ' + aud.duration;    // handle chrome's bug    if (aud.duration === Infinity) {      // set it to bigger than the actual duration      aud.currentTime = 1e101;      aud.ontimeupdate = function() {        this.ontimeupdate = () => {          return;        }        log.textContent += ' after workaround: ' + aud.duration;        aud.currentTime = 0;      }    }  }}function getData() {  var request = new XMLHttpRequest();  request.open('GET', 'https://upload.wikimedia.org/wikipedia/commons/4/4b/011229beowulf_grendel.ogg', true);  request.responseType = 'arraybuffer';  request.onload = decodeAudio;  request.send();}function decodeAudio(evt) {  var audioData = this.response;  ctx.decodeAudioData(audioData, startRecording);}function startRecording(buffer) {  var source = ctx.createBufferSource();  source.buffer = buffer;  var dest = ctx.createMediaStreamDestination();  source.connect(dest);  recorder = new MediaRecorder(dest.stream);  recorder.ondataavailable = saveChunks;  recorder.onstop = exportAudio;  source.start(0);  recorder.start();  log.innerHTML = 'recording...'  // record only 5 seconds  setTimeout(function() {    recorder.stop();  }, 5000);}function saveChunks(evt) {  if (evt.data.size > 0) {    chunks.push(evt.data);  }}// we need user-activationdocument.getElementById('button').onclick = function(evt){  getData();  this.remove();}
<button id="button">start</button><audio id="aud" controls></audio><span id="log"></span>