Comment puis-je ajouter une longueur prédéfinie à l'audio enregistré depuis MediaRecorder dans Chrome?

Je suis en train de remplacer RecordRTC par MediaRecorder intégré pour l'enregistrement d'audio en Chrome. L'audio enregistré est ensuite joué dans le programme avec audio api. J'ai du mal à obtenir la propriété audio.duration pour fonctionner. Ça dit

Si la vidéo (audio) est diffusée et n'a pas de longueur prédéfinie, "Inf" (Infinity) est renvoyé.

Avec RecordRTC, j'ai dû utiliser ffmpeg_asm.js pour convertir l'audio de wav à ogg. Ma supposition est quelque part dans le processus RecordRTC définit la longueur audio prédéfinie. Existe-t-il un moyen de définir la longueur prédéfinie à l'aide de MediaRecorder?

C'est un bug chromé .

FF expose la durée des médias enregistrés, et si vous définissez la currentTime des médias enregistrés à plus que sa duration réelle, la propriété est disponible en chrome …

 var recorder, chunks = [], ctx = new AudioContext(), aud = document.getElementById('aud'); function exportAudio() { var blob = new Blob(chunks, { type: 'audio/ogg' }); 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); } } getData(); 
 <audio id="aud" controls></audio><span id="log"></span>