JavaScript MediaStream removetrack Event

Beginner
⏱️ 10 min read
📚 Updated: Jul 2026
🎯 5 Examples
🚀 5 Try-it labs
Baseline Widely available
Instance event

What You’ll Learn

The removetrack event on MediaStream fires when a MediaStreamTrack is removed from the stream. Learn MDN’s addEventListener and onremovetrack patterns, the MediaStreamTrackEvent.track property, pairing with removeTrack(), and how this differs from the addtrack event—with five examples and try-it labs.

01

Kind

Instance event

02

Type

TrackEvent

03

Property

event.track

04

Bubble

no

05

Trigger

removeTrack

06

Status

Baseline Jul 2020

Introduction

Streams change over time—tracks leave when peers disconnect, screen shares end, or you call removeTrack() on a composed stream. The removetrack event tells you when a track left the stream so you can update UI, detach from a <video> element, or log diagnostics.

MDN: the event is a MediaStreamTrackEvent with a read-only track property for the removed track. It is not cancelable and does not bubble. Listen with stream.addEventListener("removetrack", handler) or stream.onremovetrack = handler.

💡
Beginner tip

Register the listener before calling removeTrack() so you do not miss the event.

Understanding the removetrack Event

An instance event on MediaStream that signals a track was removed from the stream’s track set.

  • Event name"removetrack" (lowercase, one word).
  • Event typeMediaStreamTrackEvent (inherits Event).
  • Key propertyevent.track: the MediaStreamTrack that was removed.
  • Cancelable — no (MDN).
  • Bubbles — no (MDN).
  • Common triggerremoveTrack() on the same stream.
  • Baseline Widely available on MDN (since July 2020).

📝 Syntax

JavaScript
stream.addEventListener("removetrack", (event) => { })

stream.onremovetrack = (event) => { }

Event object

MediaStreamTrackEvent — use event.track to access the removed MediaStreamTrack (read-only).

Typical pattern (MDN idea)

JavaScript
const stream = new MediaStream();

stream.addEventListener("removetrack", (event) => {
  console.log(`${event.track.kind} track removed`);
});

⚡ Quick Reference

GoalCode / note
Listen with addEventListenerstream.addEventListener("removetrack", fn)
Listen with propertystream.onremovetrack = fn
Get removed trackevent.track
Log track kindevent.track.kind"audio" or "video"
Trigger manuallystream.removeTrack(someTrack)
MDN statusBaseline Widely available (since July 2020)

🔍 At a Glance

Four facts to remember about the removetrack event.

Name
removetrack

Event

Type
TrackEvent

Object

Track
event.track

Removed

Baseline
Jul 2020

Widely

Examples Gallery

Examples follow MDN MediaStream: removetrack event. Demos use new MediaStream() plus removeTrack() to trigger the event predictably.

📚 Getting Started

MDN pattern: listen on a MediaStream before removing tracks.

Example 1 — MDN: addEventListener("removetrack")

Log the kind of each track when it is removed.

JavaScript
const stream = new MediaStream();

stream.addEventListener("removetrack", (event) => {
  console.log(`${event.track.kind} track removed`);
});

// Later: stream.removeTrack(someTrack) fires the event
Try It Yourself

How It Works

MDN: event.track.kind is "audio" or "video".

Example 2 — MDN: onremovetrack Handler Property

Same behavior using the event handler property.

JavaScript
const stream = new MediaStream();

stream.onremovetrack = (event) => {
  console.log(`${event.track.kind} track removed`);
};
Try It Yourself

How It Works

Only one onremovetrack handler per stream; addEventListener allows multiple listeners.

📈 removeTrack() & Multiple Tracks

Trigger removetrack by detaching tracks.

Example 3 — Listen, Then Call removeTrack()

Register listener first, then remove a track from a composed stream.

JavaScript
const composed = new MediaStream();
const log = [];

composed.addEventListener("removetrack", (event) => {
  log.push(event.track.kind);
});

navigator.mediaDevices
  .getUserMedia({ video: true })
  .then((source) => {
    const track = source.getVideoTracks()[0];
    composed.addTrack(track);
    composed.removeTrack(track);
    console.log(log);
  });
Try It Yourself

How It Works

removeTrack() detaches the track and fires removetrack on that stream.

Example 4 — Two removetrack Events (Audio + Video)

Remove audio and video tracks separately—two events fire.

JavaScript
const composed = new MediaStream();
const kinds = [];

composed.addEventListener("removetrack", (event) => {
  kinds.push(event.track.kind);
});

navigator.mediaDevices
  .getUserMedia({ audio: true, video: true })
  .then((source) => {
    const audio = source.getAudioTracks()[0];
    const video = source.getVideoTracks()[0];
    composed.addTrack(audio);
    composed.addTrack(video);
    composed.removeTrack(audio);
    composed.removeTrack(video);
    console.log(kinds.join(", "));
  });
Try It Yourself

How It Works

One removetrack event per successful removeTrack() call.

Example 5 — Count removetrack Events

Increment a counter each time a track is removed.

JavaScript
const composed = new MediaStream();
let removeCount = 0;

composed.addEventListener("removetrack", () => {
  removeCount += 1;
});

navigator.mediaDevices
  .getUserMedia({ audio: true, video: true })
  .then((source) => {
    source.getTracks().forEach((track) => composed.addTrack(track));
    composed.getTracks().forEach((track) => composed.removeTrack(track));
    console.log(removeCount, composed.getTracks().length);
  });
Try It Yourself

How It Works

After removing all tracks, getTracks().length is 0.

🚀 Common Use Cases

  • Update UI when a WebRTC peer removes an audio or video track.
  • Log track removals for debugging composed streams.
  • Detach recorders or processors when a track leaves the stream.
  • Sync stream state with getTracks() after dynamic changes.
  • Pair with addtrack for full add/remove lifecycle handling.

🔧 How It Works

1

Register listener

addEventListener("removetrack") or onremovetrack on the MediaStream.

Setup
2

Track is removed

Via removeTrack(), WebRTC, or other APIs that modify the track set.

Trigger
3

Event dispatches

MediaStreamTrackEvent with track set to the removed MediaStreamTrack.

Dispatch
4

Handler runs

Read event.track.kind, update UI, or clean up related resources.

📝 Notes

  • MDN: Baseline Widely available (since July 2020) — no Deprecated / Experimental / Non-standard banner.
  • Not cancelable — you cannot prevent a track from being removed via this event.
  • Does not bubble — listen on the MediaStream itself.
  • Register early — attach the listener before removeTrack() to avoid missing events.
  • vs removeTrack() — the method removes; the event notifies after removal.
  • Track may still be liveremoveTrack() detaches from the stream; call track.stop() to end hardware.
  • Related learning: addtrack, removeTrack(), addTrack(), active / inactive.

Universal Browser Support

The MediaStream removetrack event is marked Baseline Widely available on MDN (since July 2020). Logos use the shared browser-image-sprite.png sprite from this project.

Baseline · Widely available

MediaStream removetrack event

Fires when a MediaStreamTrack is removed from a MediaStream.

Universal Widely available
Google Chrome Full support · Desktop & Mobile
Full support
Mozilla Firefox Full support · Desktop & Mobile
Full support
Apple Safari Full support · macOS & iOS
Full support
Microsoft Edge Full support · Chromium
Full support
Opera Full support · Modern versions
Full support
Internet Explorer No MediaStream removetrack
Not supported
MediaStream removetrack Excellent

Bottom line: Listen for removetrack to react when tracks leave a MediaStream.

Conclusion

The removetrack event fires on a MediaStream when a MediaStreamTrack is removed. Listen with addEventListener or onremovetrack, then read event.track in your handler. MDN: the event is not cancelable and does not bubble—pair it with removeTrack() for manual stream composition.

Continue with addtrack, removeTrack(), addTrack(), or the JavaScript hub.

💡 Best Practices

✅ Do

  • Register listeners before calling removeTrack()
  • Use event.track to inspect the removed track
  • Pair removetrack with addtrack for full lifecycle
  • Prefer addEventListener for multiple handlers
  • Update UI when tracks are removed dynamically

❌ Don’t

  • Expect the event to bubble to parent elements
  • Try to cancel or prevent track removal via this event
  • Confuse removetrack (event) with removeTrack() (method)
  • Assume removetrack calls track.stop() automatically
  • Register the listener after tracks are already removed

Key Takeaways

Knowledge Unlocked

Five things to remember about removetrack

React when tracks leave a MediaStream.

5
Core concepts
🔗02

Type

TrackEvent

Object
📦03

Track

event.track

Property
📄04

No bubble

not cancel

Rules
🎯05

Baseline

since Jul 2020

Status

❓ Frequently Asked Questions

When a MediaStreamTrack is removed from a MediaStream—for example after calling removeTrack(track) on that stream.
No. MDN marks the removetrack event as Baseline Widely available (since July 2020). It is not Deprecated, Experimental, or Non-standard.
A MediaStreamTrackEvent. It inherits from Event and includes a read-only track property with the MediaStreamTrack that was removed.
No. MDN says the event is not cancelable and does not bubble.
removeTrack() is the method that detaches a track from the stream. removetrack is the event that fires after a track has been removed—you listen with addEventListener or onremovetrack.
addtrack fires when a track is added to a MediaStream—for example after addTrack(track). It is the counterpart to removetrack.
Did you know?

MDN documents the same removetrack event name on AudioTrackList and VideoTrackList targets for HTML media elements—but on MediaStream it fires when tracks leave the stream’s track set.

Detach tracks

Learn removeTrack()—the method that triggers removetrack.

removeTrack() →

About the author

Mari Selvan M P
Mari Selvan M P 🔗

Developer, cloud engineer, and technical writer

  • Experience 12 years building web and cloud systems
  • Focus Full Stack Development, AWS, and Developer Education

I write practical tutorials so students and working developers can learn by doing—from databases and APIs to deployment on AWS.

5 people found this page helpful