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>