Actualmente estoy usando MediaRecorder para obtener fragmentos de una transmisión de video de la cámara web/micrófono del usuario de la siguiente manera:
navigator.mediaDevices .getUserMedia({audio: true, video: true}) .then((stream) => { var mediaRecorder = new MediaRecorder(stream); mediaRecorder.start(5000); mediaRecorder.ondataavailable = (blobEvent) => { console.log('got 5 seconds of stream', blobEvent); } })esto emite una parte de la transmisión de cada 5 segundos de video, sin embargo, quiero partes de un tamaño particular, en lugar de una duración. No parece haber una forma clara de hacer esto, ya que no puedo verificar el tamaño del fragmento actual sin comenzar uno nuevo, y no puedo combinarlos después del hecho. Este es el trabajo que se me ocurrió, usando 2 grabadoras de medios:
const MIN_BLOB_SIZE = 5000000; var partSize = 0; navigator.mediaDevices .getUserMedia({audio: true, video: true}) .then((stream) => { var mediaRecorder = new MediaRecorder(stream); var mediaRecorder2 = new MediaRecorder(stream) mediaRecorder.start(); mediaRecorder2.start(5000) mediaRecorder2.ondataavailable = (blobEvent) => { console.log('got 5 seconds of data', blobEvent) const blob = blobEvent.data partSize += blob.size; if (partSize >= MIN_BLOB_SIZE) { partSize = 0; mediaRecorder.requestData(); } } mediaRecorder.ondataavailable = (blobEvent) => { console.log('got a chunk at least 5mb', blobEvent); }; });pero esto se siente extraño, da fragmentos imprecisos, requiere que me asegure de que estas dos grabadoras estén perfectamente sincronizadas, complica el manejo de errores/casos extremos, y me preocupan las implicaciones de rendimiento del uso de 2 grabadoras de medios. Aceptaría una respuesta que haga esto con una grabadora de medios o, si eso no es posible, si alguien puede convencerme de que 2 grabadoras de medios tienen un buen rendimiento, también aceptaría eso y manejaría las complicaciones que crea.
Puede combinar fragmentos después del hecho con new Blob(blobArray) . Si es absolutamente necesario procesar blobs de cierto tamaño, puede usar Blob.slice . Podría verse algo como esto:
const MIN_BLOB_SIZE = 5000000; var partSize = 0, parts = []; navigator.mediaDevices .getUserMedia({audio: true, video: true}) .then((stream) => { var mediaRecorder = new MediaRecorder(stream); mediaRecorder.start(5000); mediaRecorder.ondataavailable = (blobEvent) => { console.log('got 5 seconds of data', blobEvent); const blob = blobEvent.data; partSize += blob.size; parts.push(blob); if (partSize >= MIN_BLOB_SIZE) { let bigBlob = new Blob(parts, { type: blob.type }); // if the blob size doesn't need to be precise: partSize = 0; parts = []; // do something with bigBlob // or if the blob size needs to be precise: // let sizedBlob = bigBlob.slice(0, MIN_BLOB_SIZE, blob.type); // parts = [ bigBlob.slice(MIN_BLOB_SIZE, bigBlob.size, blob.type) ]; // partSize = parts[0].size; // do something with sizedBlob } }; mediaRecorder.onstop = (blobEvent) => { console.log('Recording Stopped'); const blob = blobEvent.data; partSize += blob.size; parts.push(blob); let bigBlob = new Blob(parts, { type: blob.type }); // do something with bigBlob, which may be smaller than MIN_BLOB_SIZE }; }); También podría estar interesado en la bitsPerSecond (y también audioBitsPerSecond y videoBitsPerSecond ) en la API de MediaRecorder , que podría brindarle tamaños de blob más predecibles para una cantidad de tiempo registrada determinada. Sin embargo, esto puede afectar la calidad del video y el audio.