node package manager
Love JavaScript? Your insights can make it even better. Take the 2017 JavaScript Ecosystem Survey »


mediasource travis npm downloads

MediaSource API as a node.js Writable stream

Sauce Test Status

Stream video/audio into a <video> or <audio> tag by attaching node.js Writable streams.

This package is used by WebTorrent (along with other approaches) to support media streaming.


npm install mediasource


var MediaElementWrapper = require('mediasource')
function createElem (tagName) {
  var elem = document.createElement(tagName)
  elem.controls = true
  elem.autoplay = true // for chrome // for firefox 
  return elem
var elem = createElem('video')
var readable = // ... get a readable stream from somewhere 
var wrapper = new MediaElementWrapper(elem)
// The correct mime type, including codecs, must be provided 
var writable = wrapper.createWriteStream('video/webm; codecs="vorbis, vp8"')
elem.addEventListener('error', function () {
  // listen for errors on the video/audio element directly 
  var errorCode = elem.error
  var detailedError = wrapper.detailedError
  // wrapper.detailedError will often have a more detailed error message 
writable.on('error', function (err) {
  // listening to the stream 'error' event is optional 
// media should start playing now! 

advanced usage

wrapper.createWriteStream() can be called multiple times if different tracks (e.g. audio and video) need to be passed in separate streams. Each call should be made with the correct mime type.

Instead of a mime type, an existing MediaSourceStream (as returned by wrapper.createWriteStream()) can be passed as the single argument to wrapper.createWriteStream(), which will cause the existing stream to be replaced by the newly returned stream. This is useful when you want to cancel the existing stream and replace it with a new one, e.g. when seeking.



Specify how many seconds of media should be put into the browser's buffer before applying backpressure.


Handle errors by listening to the 'error' event on the <video> or <audio> tag.

Some (but not all) errors will also cause wrapper.detailedError to be set to an error value that has a more informative error message.


MIT. Copyright (c) Feross Aboukhadijeh.