Estoy grabando el lienzo animado (WebGL) y la salida de Web Audio API juntos como un video usando la clase MediaRecorder JS. Todo funciona como se esperaba si se está reproduciendo algo de audio, pero cuando no, aparece un blob vacío al detener la instancia de MediaRecorder .
A continuación se muestra parte de mi código:
const chunks = []; var recorder = null, captureStream = null; function dataAvailable(event) { chunks.push(event.data); } function startCapture() { const streamDestination = audio.context.createMediaStreamDestination(); masterGain.connect(streamDestination); captureStream = canvas.captureStream(); // This line adds audio to the recording if audio is playing // but if audio isn't playing at the moment, I get empty chunks // at the end of recording captureStream.addTrack(streamDestination.stream.getAudioTracks()[0]); recorder = new MediaRecorder(captureStream); recorder.ondataavailable = dataAvailable; recorder.onstop = exportVideo; recorder.start(); } function exportVideo() { // Here chunks will be empty if Web Audio API // didn't played anything during recording new Blob(chunks, {'type': 'video/webm'}); ... }¿Cómo obtener una grabación adecuada cuando Web Audio está en silencio?
Usando Chrome v92 en Windows 10.
Creo que este es https://crbug.com/1223382 que abrí hace un mes, pero que no tuvo mucha tracción desde entonces.
Básicamente, todavía tienen muchos problemas para lidiar con pistas silenciadas.
Como solución temporal, podría obligar a que su pista nunca se silencie conectando un oscilador a un GainNode cuya ganancia esté configurada en 0 y conecte este GainNode a su flujo de destino.
const streamDestination = audio.context.createMediaStreamDestination(); const osc = audio.context.createOscillator(); const gainNode = audio.context.createGain(); gainNode.gain.value = 0; osc.connect(gainNode); gainNode.connect(streamDestination); // then your current code masterGain.connect(streamDestination); captureStream = canvas.captureStream(); ...Un violín con este fragmento , arreglando mi caso de reproducción del informe de error .
Advertencias :
Ps: es posible que también desee pasar un segmento de tiempo (relativamente pequeño) en MediaRecorder.start(timeslice) para solucionar este otro error relacionado , lo que podría suceder si, por alguna razón, uno de sus lienzos o flujo de audio se silenciara (por ejemplo, si deja de dibujar en su lienzo por más de 5s).