- From: guest271314 via GitHub <sysbot+gh@w3.org>
- Date: Thu, 23 Apr 2020 06:29:34 +0000
- To: public-webrtc-logs@w3.org
Attempted to use the same code at Firefox and Chromium to 1) determine what is a minimum requirement for a _remote_ `MediaStreamTrack` from `canvas.captureStream()` to fire `unmute` event; 2) for `HTMLVideoElement` to fire `loadedmetadata` event; 3) for `HTMLVideoElement` to fire `timeupdate` event. **Observations** Chromium fires `unmute` irrespective of whether or not a method of the specific context set at the source `canvas` is executed or the canvas is otherwise changed. Firefox does not fire `unmute` event when no canvas context method is executed and the canvas is not changed. Two canvas `2d` context method to execute for `unmute` of remote track to fire are `clearRect()` or `fillRect()`. `loadedmetadata` of `HTMLVideoElement` also fires following `unmute` for each browser. At Firefox `<video>` `timeupdate` is fired and `currentTime` progresses when `autoplay` is set, continues streams content ("black frames"), theoretically, infinitely. At Chromium `timeupdate` is not fired and `currentTime` does not progress, similar to the behaviour described at https://bugs.chromium.org/p/chromium/issues/detail?id=1045832. The video display is a "black frame". If the play control is pressed `0` is alerted from `timeupdate` event. Given `unmute` will not be fired at browsers under current specifications and implementations without some value being set or method being called on the remote source canvas a `RTCDataChannel` can be used to signal the remote peer to perform the required task for the stream to be unmuted. That does not solve the Chromium issue of `unmute` being fired on the remote track without any change to thesource canvas however not progressing `currentTime` or firing `timeupdate` event at `HTMLVideoElement` when a change is made to the canvas. One option would be to update the canvas capture stream specification to stream the contents of the canvas regardless of whether or not a new image was painted onto or modification was made to the canvas. Alternatively, adjust `RTCPeerConnection` to _not_ await _content_ to stream "black frames" from a `<canvas>`, which is already an image, thus already content. This effectively provides a "paused" `MediaStreamTrack`, which could be useful for certain purposes, though the behaviour does not appear to be by design of at least `HTMLVideoElement` or `RTCPeerConnection`, if in fact `unmute` is based on networking, not content. ``` <!DOCTYPE html> <html> <head> <title> unmute remote RTCPeerConnection from canvas.captureStream(), fire HTMLVideoElement loadedmetadata and timeupdate events </title> <script src="RTCPeerConnection-helper.js"></script> </head> <body> <code> unmute remote RTCPeerConnection from canvas.captureStream(), fire HTMLVideoElement loadedmetadata and timeupdate </code> <script> (async _ => { const v = document.createElement('video'); v.width = v.height = 200; v.controls = v.autoplay = true; const pc1 = new RTCPeerConnection(); const pc2 = new RTCPeerConnection(); // not fired at Chromium for fillRect or clearRect v.ontimeupdate = e => { v.ontimeupdate = null; alert('currentTime:' + e.target.currentTime); }; const dc2 = pc2.createDataChannel('canvas-stream'); document.body.appendChild(v); const metadataToBeLoaded = new Promise( resolve => (v.onloadedmetadata = e => resolve(e.type)) ); const canvasStream = () => { const canvas = document.createElement('canvas'); canvas.width = canvas.height = v.width; const ctx = canvas.getContext('2d'); const stream = canvas.captureStream(); const [track] = stream.getVideoTracks(); const dc1 = pc1.createDataChannel('canvas-stream'); dc1.onopen = e => { dc1.onmessage = e => { ctx.clearRect(0, 0, canvas.width, canvas.height); dc1.close(); // do stuff }; }; return stream; }; let stream = canvasStream(); let [track] = stream.getVideoTracks(); const sender = pc1.addTrack(track); pc2.ontrack = async e => { e.track.onunmute = e => { alert(e.type); v.srcObject = new MediaStream([e.target]); }; pc2.ondatachannel = e => { e.channel.send(null); e.channel.close(); }; }; exchangeIceCandidates(pc1, pc2); doSignalingHandshake(pc1, pc2); let result = await metadataToBeLoaded; alert(result); // pc1.close(); // pc2.close(); })(); </script> </body> </html> ``` plnkr https://plnkr.co/edit/9XcS0fbCPfgvPBzd?preview -- GitHub Notification of comment by guest271314 Please view or discuss this issue at https://github.com/w3c/webrtc-pc/issues/2506#issuecomment-618206122 using your GitHub account
Received on Thursday, 23 April 2020 06:29:36 UTC