# MediaStreamRecorder
**Repository Path**: mhyf/MediaStreamRecorder
## Basic Information
- **Project Name**: MediaStreamRecorder
- **Description**: Cross browser audio/video/screen recording. It supports Chrome, Firefox, Opera and Microsoft Edge. It even works on Android browsers. It follows latest MediaRecorder API standards and provides similar APIs.
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2025-08-05
- **Last Updated**: 2025-08-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# [MediaStreamRecorder.js](https://github.com/streamproc/MediaStreamRecorder) - [Demos](https://www.webrtc-experiment.com/msr/)
[](https://npmjs.org/package/msr) [](https://npmjs.org/package/msr) [](https://travis-ci.org/streamproc/MediaStreamRecorder)
## [Demos](https://www.webrtc-experiment.com/msr/) using [MediaStreamRecorder.js](https://github.com/streamproc/MediaStreamRecorder) library
| Experiment Name | Demo | Source Code |
| ------------- |-------------|-------------|
| **Audio Recording** | [Demo](https://www.webrtc-experiment.com/msr/audio-recorder.html) | [Source](https://github.com/streamproc/MediaStreamRecorder/tree/master/demos/audio-recorder.html) |
| **Video Recording** | [Demo](https://www.webrtc-experiment.com/msr/video-recorder.html) | [Source](https://github.com/streamproc/MediaStreamRecorder/tree/master/demos/video-recorder.html) |
| **Gif Recording** | [Demo](https://www.webrtc-experiment.com/msr/gif-recorder.html) | [Source](https://github.com/streamproc/MediaStreamRecorder/tree/master/demos/gif-recorder.html) |
| **MultiStreamRecorder Demo** | [Demo](https://www.webrtc-experiment.com/msr/MultiStreamRecorder.html) | [Source](https://github.com/streamproc/MediaStreamRecorder/tree/master/demos/MultiStreamRecorder.html) |
A cross-browser implementation to record
1. Camera
2. Microphone
3. Screen (full screen, apps' screens, tab, HTML elements)
4. Canvas 2D as well as 3D animations (gaming/etc.)
You can record above four options altogether (in single container).
MediaStreamRecorder is useful in scenarios where you're planning to submit/upload recorded blobs in realtime to the server! You can get blobs after specific time-intervals.
## Browser Support
| Browser | Support | Features |
| ------------- |-------------|-------------|
| Firefox | [Stable](http://www.mozilla.org/en-US/firefox/new/) / [Aurora](http://www.mozilla.org/en-US/firefox/aurora/) / [Nightly](http://nightly.mozilla.org/) | Audio+Video (Both local/remote) |
| Google Chrome | [Stable](https://www.google.com/intl/en_uk/chrome/browser/) / [Canary](https://www.google.com/intl/en/chrome/browser/canary.html) / [Beta](https://www.google.com/intl/en/chrome/browser/beta.html) / [Dev](https://www.google.com/intl/en/chrome/browser/index.html?extra=devchannel#eula) | Audio+Video (Both local/remote) |
| Opera | [Stable](http://www.opera.com/) / [NEXT](http://www.opera.com/computer/next) | Audio+Video (Both local/remote) |
| Android | [Chrome](https://play.google.com/store/apps/details?id=com.chrome.beta&hl=en) / [Firefox](https://play.google.com/store/apps/details?id=org.mozilla.firefox) / [Opera](https://play.google.com/store/apps/details?id=com.opera.browser) | Audio+Video (Both local/remote) |
| Microsoft Edge | [Normal Build](https://www.microsoft.com/en-us/windows/microsoft-edge) | **Only Audio** - No Video - No Canvas - No Screen |
| Safari 11 | preview | **Only Audio** - No Video - No Canvas - No Screen |
> There is a similar project: **RecordRTC**! [Demo](https://www.webrtc-experiment.com/RecordRTC/) - [Documentation](https://github.com/muaz-khan/RecordRTC)
## How to link scripts?
You can [install scripts using NPM](https://www.npmjs.org/package/msr):
```javascript
npm install msr
# or via "bower"
bower install msr
```
Now try `node server.js` and open `https://localhost:9001/`
# Test on NPM
```javascript
var MediaStreamRecorder = require('msr');
console.log('require-msr', MediaStreamRecorder);
console.log('\n\n-------\n\n');
var recorder = new MediaStreamRecorder({});
console.log('MediaStreamRecorder', recorder);
console.log('\n\n-------\n\n');
var multiStreamRecorder = new MediaStreamRecorder.MultiStreamRecorder([]);
console.log('MultiStreamRecorder', multiStreamRecorder);
```
* Live NPM test: https://tonicdev.com/npm/msr
Or try `npm-test.js`:
```
cd node_modules
cd msr
node npm-test.js
```
Then link single/standalone "MediaStreamRecorder.js" file:
```html
```
## Record audio+video
```html
```
## Record Multiple Videos
> Record multiple videos in single WebM file.
```javascript
var arrayOfStreams = [yourVideo, screen, remoteVideo1, remoteVideo2];
var multiStreamRecorder = new MultiStreamRecorder( arrayOfStreams );
```
You can add additional streams at runtime:
```javascript
multiStreamRecorder.addStream( anotherStream );
```
Currently, you can only record 4-maximum videos in single WebM container.
## Record audio/wav
```html
```
## How to manually stop recordings?
```javascript
mediaRecorder.stop();
```
## How to pause recordings?
```javascript
mediaRecorder.pause();
```
## How to resume recordings?
```javascript
mediaRecorder.resume();
```
## How to save recordings?
```javascript
// invoke save-as dialog for all recorded blobs
mediaRecorder.save();
// or pass external blob/file
mediaRecorder.save(YourExternalBlob, 'FileName.webm');
```
## Upload to PHP Server
Your HTML file:
```javascript
mediaRecorder.ondataavailable = function(blob) {
// upload each blob to PHP server
uploadToPHPServer(blob);
};
function uploadToPHPServer(blob) {
var file = new File([blob], 'msr-' + (new Date).toISOString().replace(/:|\./g, '-') + '.webm', {
type: 'video/webm'
});
// create FormData
var formData = new FormData();
formData.append('video-filename', file.name);
formData.append('video-blob', file);
makeXMLHttpRequest('https://path-to-your-server/save.php', formData, function() {
var downloadURL = 'https://path-to-your-server/uploads/' + file.name;
console.log('File uploaded to this path:', downloadURL);
});
}
function makeXMLHttpRequest(url, data, callback) {
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if (request.readyState == 4 && request.status == 200) {
callback();
}
};
request.open('POST', url);
request.send(data);
}
```
Save.php file:
```php
```
Regarding PHP upload issues:
* https://github.com/muaz-khan/RecordRTC/wiki/PHP-Upload-Issues
Don't forget to create uploads directory here:
```
https://path-to-your-server/uploads/ ----- inside same directory as "save.php"
```
# API Documentation
## `recorderType`
You can force StereoAudioRecorder or WhammyRecorder or similar recorders on Firefox or Edge; even on Chrome and Opera.
All browsers will be using your specified recorder:
```javascript
// force WebAudio API on all browsers
// it allows you record remote audio-streams in Firefox
// it also works in Microsoft Edge
mediaRecorder.recorderType = StereoAudioRecorder;
// force webp based webm encoder on all browsers
mediaRecorder.recorderType = WhammyRecorder;
// force MediaRecorder API on all browsers
// Chrome Canary/Dev already implemented MediaRecorder API however it is still behind a flag.
// so this property allows you force MediaRecorder in Chrome.
mediaRecorder.recorderType = MediaRecorderWrapper;
// force GifRecorder in all browsers. Both WhammyRecorder and MediaRecorder API will be ignored.
mediaRecorder.recorderType = GifRecorder;
```
## `audioChannels`
> To choose between Stereo or Mono audio.
It is an integer value that accepts either 1 or 2. "1" means record only left-channel and skip right-one. The default value is "2".
```javascript
mediaRecorder.audioChannels = 1;
```
Note: It requires following recorderType:
```javascript
mediaRecorder.recorderType = StereoAudioRecorder;
```
## `bufferSize`
You can set following audio-bufferSize values: 0, 256, 512, 1024, 2048, 4096, 8192, and 16384. "0" means: let chrome decide the device's default bufferSize. Default value is "2048".
```javascript
mediaRecorder.bufferSize = 0;
```
## `sampleRate`
Default "sampleRate" value is "44100". Currently you can't modify sample-rate in windows that's why this property isn't yet exposed to public API.
It accepts values only in range: 22050 to 96000
```javascript
// set sampleRate for NON-windows systems
mediaRecorder.sampleRate = 96000;
```
## `video`
It is recommended to pass your HTMLVideoElement to get most accurate result.
```javascript
videoRecorder.video = yourHTMLVideoElement;
videoRecorder.onStartedDrawingNonBlankFrames = function() {
// record audio here to fix sync issues
videoRecorder.clearOldRecordedFrames(); // clear all blank frames
audioRecorder.start(interval);
};
```
## `stop`
This method allows you stop recording.
```javascript
mediaRecorder.stop();
```
## `pause`
This method allows you pause recording.
```javascript
mediaRecorder.pause();
```
## `resume`
This method allows you resume recording.
```javascript
mediaRecorder.resume();
```
## `save`
This method allows you save recording to disk (via save-as dialog).
```javascript
// invoke save-as dialog for all recorded blobs
mediaRecorder.save();
// or pass external blob/file
mediaRecorder.save(YourExternalBlob, 'FileName.webm');
```
## canvas
Using this property, you can pass video resolutions:
```javascript
mediaRecorder.canvas = {
width: 1280,
height: 720
};
```
## videoWidth and videoHeight
You can stretch video to specific width/height:
```javascript
mediaRecorder.videoWidth = 1280;
mediaRecorder.videoHeight = 720;
```
## clearOldRecordedFrames
This method allows you clear current video-frames. You can use it to remove blank-frames.
```javascript
videoRecorder.video = yourHTMLVideoElement;
videoRecorder.onStartedDrawingNonBlankFrames = function() {
videoRecorder.clearOldRecordedFrames(); // clear all blank frames
audioRecorder.start(interval);
};
```
## stop
This method allows you stop entire recording process.
```javascript
mediaRecorder.stop();
```
## start
This method takes "interval" as the only argument and it starts recording process:
```javascript
mediaRecorder.start(5 * 1000); // it takes milliseconds
```
## ondataavailable
This event is fired according to your interval and "stop" method.
```javascript
mediaRecorder.ondataavailable = function(blob) {
POST_to_Server(blob);
};
```
## onstop
This event is fired when recording is stopped, either by invoking "stop" method or in case of any unexpected error:
```javascript
mediaRecorder.onstop = function() {
// recording has been stopped.
};
```
## mimeType
This property allows you set output media type:
```javascript
// video:
videoRecorder.mimeType = 'video/webm';
videoRecorder.mimeType = 'video/mp4';
// audio:
audioRecorder.mimeType = 'audio/webm'; // MediaRecorderWrapper
audioRecorder.mimeType = 'audio/ogg'; // MediaRecorderWrapper
audioRecorder.mimeType = 'audio/wav'; // StereoAudioRecorder
audioRecorder.mimeType = 'audio/pcm'; // StereoAudioRecorder
// gif:
gifRecorder.mimeType = 'image/gif'; // GifRecorder
```
## bitsPerSecond
```javascript
// currently supported only in Firefox
videoRecorder.bitsPerSecond = 12800;
```
## quality
```javascript
// only chrome---whilst using WhammyRecorder
videoRecorder.quality = .8;
```
## speed
```javascript
// only chrome---whilst using WhammyRecorder
videoRecorder.speed = 100;
```
## Contributors
1. [Muaz Khan](https://github.com/muaz-khan)
2. [neizerth](https://github.com/neizerth)
3. [andersaloof](https://github.com/andersaloof)
## License
[MediaStreamRecorder.js](https://github.com/streamproc/MediaStreamRecorder) library is released under [MIT licence](https://github.com/streamproc/MediaStreamRecorder/blob/master/LICENSE).