- From: Jamie Kyle via GitHub <sysbot+gh@w3.org>
- Date: Tue, 29 Oct 2024 17:40:11 +0000
- To: public-webrtc@w3.org
jamiebuilds has just created a new issue for https://github.com/w3c/mediacapture-transform:
== MediaStreamTrackGenerator/MediaStream should buffer the current frame ==
Right now, at least in [Chromium's implementation which they say is to spec](https://issues.chromium.org/issues/370546371):
If you write a frame to `MediaStreamTrackGenerator` and _then_ assign its container MediaStream to a `video.srcObject` you will never see that frame.
```ts
let track = new MediaStreamTrackGenerator({ kind: "video" });
let stream = new MediaStream([track]);
let writer = track.writable.getWriter();
// First write frame:
await writer.write(videoFrame);
// Then assign:
videoElement.srcObject = stream
// Result: Frame never appears
```
This is different than the behavior of a MediaStream created by `HTMLCanvasElement.captureStream()`
```ts
let stream = canvas.captureStream(0) // manually request frames
let track = stream.getVideoTracks().at(0)
// First write frame:
track.requestFrame();
// Then assign:
videoElement.srcObject = stream
// Result: Frame appears
```
Besides the behavior being different, it also makes using these streams inconvenient for using across multiple `<video>` elements which is common in a lot of video calling apps, and you end up needing to hold onto the current frame anyways.
```ts
// This will cause frames to be dropped every time you switch views/speakers/etc:
function onInAppPictureInPicture() {
let video = document.createElement("video")
video.srcObject = getCurrentSpeakerStream()
function onCurrentSpeakerChange() {
video.srcObject = getCurrentSpeakerStream()
}
// ...
}
```
Instead, if you want to avoid recreating the same stream again, you would have to hold onto the last frame and write it to the stream again when necessary:
```ts
let track = new MediaStreamTrackGenerator({ kind: "video" })
let writer = this.#trackGenerator.writable.getWriter()
let lastFrame
async function writeFrame(frame) {
lastFrame = frame
await writer.write(frame)
}
async function replayLastFrame() {
await writer.write(lastFrame)
}
```
This difference between `CanvasCaptureMediaStreamTrack` vs `MediaStreamTrackGenerator` caused a real regression in our app when attempting to use it.
Please view or discuss this issue at https://github.com/w3c/mediacapture-transform/issues/114 using your GitHub account
--
Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Tuesday, 29 October 2024 17:40:13 UTC