w3c / mediacapture-record

MediaStream Recording
https://w3c.github.io/mediacapture-record/
Other
103 stars 22 forks source link

Integrate with ReadableStream #87

Open dontcallmedom opened 8 years ago

dontcallmedom commented 8 years ago

From TAG review:

This spec seems like the perfect target to re-use the ReadableStream concept and harmonize/unify the way that conversions are handled. Streams already have a model for how data is extracted/converted from them, which would potentially simplify this spec a lot.

As noted by @domenic in the discussion there:

Completely agreed on ReadableStream. I put up a draft of how that could work at https://domenic.github.io/streaming-mediastreams/ a while ago. @miguelao and I are definitely interested in exploring this, but my understanding is that given Firefox was already shipping this the priority was on just stabilizing that before exploring a "v2" that is properly layered on streams.

(still filing this as an issue, since I'm not sure how much the group has given thoughts to this topic)

yell0wd0g commented 7 years ago

FTR I played with wrapping MediaRecorder as a ReadableStream in Chromium, here's the codepen (spits to console), the secret sauce is the wrapper:

function makeMediaRecorderStream(mediaStream) {
   // Constructor throws.
  recorder = new MediaRecorder(mediaStream);

  return new ReadableStream({
    // Not implemented yet in Chrome.
    // type: "bytes",

    start(controller) {
      // Backpressure is not supported: if the client loses a single event.data,
      // the reconstructed recorded array of Blobs might not be playable.
      recorder.ondataavailable = (event) => { controller.enqueue(event.data); };
      recorder.onstop = () => controller.close();
      recorder.onerror = () => controller.error(new Error("The MediaRecorder errored!"));
      // We have also onstart, onpause and onresume events.
      recorder.start(100);
    },

    cancel() {
      if (recorder.state != 'inactive')
        recorder.stop();
    }
  });
}
travisleithead commented 7 years ago

Given that this has shipped in Firefox, I would expect any tighter integration into the API to happen in a v2 spec at this point--but appreciate the thoughts and continued design advancement here. ReadableStream (and WritableStream) are now shipping in the web platform, so this is no longer a theoretical integration, but something that should be done as the API is advanced :-)