JavaScript MediaStream addtrack Event

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

What You’ll Learn

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

01

Kind

Instance event

02

Type

TrackEvent

03

Property

event.track

04

Bubble

no

05

Trigger

addTrack

06

Status

Baseline widely

Introduction

Streams change over time—tracks arrive from WebRTC peers, screen shares start, or you compose streams manually with addTrack(). The addtrack event tells you when a new track joined the stream so you can update UI, attach to a <video> element, or log diagnostics.

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

💡
Beginner tip

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

Understanding the addtrack Event

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

  • Event name"addtrack" (lowercase, one word).
  • Event typeMediaStreamTrackEvent (inherits Event).
  • Key propertyevent.track: the MediaStreamTrack that was added.
  • Cancelable — no (MDN).
  • Bubbles — no (MDN).
  • Common triggeraddTrack() on the same stream.
  • Baseline Widely available on MDN (since September 2017).

📝 Syntax

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

stream.onaddtrack = (event) => { }

Event object

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

Typical pattern (MDN idea)

JavaScript
const stream = new MediaStream();

stream.addEventListener("addtrack", (event) => {
  console.log(`New ${event.track.kind} track added`);
});

⚡ Quick Reference

GoalCode / note
Listen with addEventListenerstream.addEventListener("addtrack", fn)
Listen with propertystream.onaddtrack = fn
Get added trackevent.track
Log track kindevent.track.kind"audio" or "video"
Trigger manuallystream.addTrack(someTrack)
MDN statusBaseline Widely available (since September 2017)

🔍 At a Glance

Four facts to remember about the addtrack event.

Name
addtrack

Event

Type
TrackEvent

Object

Track
event.track

Added

Baseline
widely

Since Sep 2017

Examples Gallery

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

📚 Getting Started

MDN pattern: listen on an empty MediaStream.

Example 1 — MDN: addEventListener("addtrack")

Log the kind of each track when it is added.

JavaScript
const stream = new MediaStream();

stream.addEventListener("addtrack", (event) => {
  console.log(`New ${event.track.kind} track added`);
});

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

How It Works

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

Example 2 — MDN: onaddtrack Handler Property

Same behavior using the event handler property.

JavaScript
const stream = new MediaStream();

stream.onaddtrack = (event) => {
  console.log(`New ${event.track.kind} track added`);
};
Try It Yourself

How It Works

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

📈 addTrack() & Multiple Tracks

Trigger addtrack by composing streams.

Example 3 — Listen, Then Call addTrack()

Register listener first, then add a track from getUserMedia.

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

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

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

How It Works

addTrack() adds the track and fires addtrack on that stream.

Example 4 — Two addtrack Events (Audio + Video)

Add audio and video tracks separately—two events fire.

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

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

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

How It Works

One addtrack event per successful addTrack() call.

Example 5 — Count addtrack Events

Increment a counter each time a track is added.

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

composed.addEventListener("addtrack", () => {
  addCount += 1;
});

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

How It Works

Event count should match getTracks().length when adding distinct tracks.

🚀 Common Use Cases

  • Update UI when a WebRTC peer adds a new audio or video track.
  • Log track additions for debugging composed streams.
  • Attach new tracks to a recorder or processor when they arrive.
  • Sync stream state with getTracks() after dynamic changes.
  • Pair with removetrack for full add/remove lifecycle handling.

🔧 How It Works

1

Register listener

addEventListener("addtrack") or onaddtrack on the MediaStream.

Setup
2

Track is added

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

Trigger
3

Event dispatches

MediaStreamTrackEvent with track set to the new MediaStreamTrack.

Dispatch
4

Handler runs

Read event.track.kind, update UI, or forward to other APIs.

📝 Notes

  • MDN: Baseline Widely available (since September 2017) — no Deprecated / Experimental / Non-standard banner.
  • Not cancelable — you cannot prevent a track from being added via this event.
  • Does not bubble — listen on the MediaStream itself.
  • Register early — attach the listener before addTrack() to avoid missing events.
  • vs addTrack() — the method adds; the event notifies after addition.
  • Related learning: removetrack, addTrack(), removeTrack(), active / inactive.

Universal Browser Support

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

Baseline · Widely available

MediaStream addtrack event

Fires when a MediaStreamTrack is added to 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 addtrack
Not supported
MediaStream addtrack Excellent

Bottom line: Listen for addtrack to react when new tracks join a MediaStream.

Conclusion

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

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

💡 Best Practices

✅ Do

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

❌ Don’t

  • Expect the event to bubble to parent elements
  • Try to cancel or prevent track addition via this event
  • Confuse addtrack (event) with addTrack() (method)
  • Register the listener after tracks are already added
  • Forget to call track.stop() when cleaning up hardware

Key Takeaways

Knowledge Unlocked

Five things to remember about addtrack

React when tracks join a MediaStream.

5
Core concepts
🔗02

Type

TrackEvent

Object
📦03

Track

event.track

Property
📄04

No bubble

not cancel

Rules
🎯05

Baseline

since Sep 2017

Status

❓ Frequently Asked Questions

When a new MediaStreamTrack is added to a MediaStream—for example after calling addTrack(track) on that stream.
No. MDN marks the addtrack event as Baseline Widely available (since September 2017). 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 added.
No. MDN says the event is not cancelable and does not bubble.
addTrack() is the method that adds a track to the stream. addtrack is the event that fires after a track has been added—you listen with addEventListener or onaddtrack.
removetrack fires when a track is removed from a MediaStream—for example after removeTrack(track). It is the counterpart to addtrack.
Did you know?

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

Track removed events

Learn removetrack—react when a MediaStreamTrack leaves a stream.

removetrack event →

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