knowledge base/practices

In Chrome, a media element's captureStream() carries its audio whatever the element's muted or volume

Fact

HTMLMediaElement.captureStream() in Chrome captures the media's audio before the element's own output stage: setting the element's muted = true or volume = 0 silences it locally, but the captured audio track stays at full level. (Verified in Chrome by measuring the received track with an AnalyserNode while toggling both.)

Why it matters

A page that streams a video it plays (a broadcast station, a screen-share preview) can play it silently for the operator without silencing every viewer — or, assuming the opposite, offers a volume control that looks like it turns everyone down and does nothing for them.

How to apply

  • Start the local player muted; the viewers still hear it.
  • Do not present the local volume as a broadcast volume. To change what viewers hear, route the audio through Web Audio (createMediaElementSource → GainNode → createMediaStreamDestination) and send that track.
  • Check other browsers before relying on it: Firefox's mozCaptureStream() behaves differently.