RecordRTC is a server-less (entire client-side) JavaScript library can be used to record WebRTC audio/video media streams. It supports cross-browser audio/video recording.
npm install recordrtc
To use it:
<script src="./node_modules/recordrtc/RecordRTC.js"></script>
There are some other NPM packages regarding RecordRTC:
=
How RecordRTC encodes wav/webm?
Media File | Bitrate/Framerate | encoders | Framesize | additional info |
---|
Audio File (WAV) | 1411 kbps | pcm_s16le | 44100 Hz | stereo, s16 |
Video File (WebM) | 60 kb/s | (whammy) vp8 codec yuv420p | -- | SAR 1:1 DAR 4:3, 1k tbr, 1k tbn, 1k tbc (default) |
=
- RecordRTC to Node.js
- RecordRTC to PHP
- RecordRTC to ASP.NET MVC
- RecordRTC & HTML-2-Canvas i.e. Canvas/HTML Recording!
- MRecordRTC i.e. Multi-RecordRTC!
- RecordRTC on Ruby!
- RecordRTC over Socket.io
- ffmpeg-asm.js and RecordRTC! Audio/Video Merging & Transcoding!
- RecordRTC / PHP / FFmpeg
- Record Audio and upload to Nodejs server
=
<script src="//cdn.WebRTC-Experiment.com/RecordRTC.js"></script>
=
How to record audio+video on Firefox >= 29?
You'll be recording both audio/video in single WebM container. Though you can edit RecordRTC.js to record in mp4.
var session = {
audio: true,
video: true
};
navigator.getUserMedia(session, function (mediaStream) {
window.recordRTC = RecordRTC(MediaStream);
recordRTC.startRecording();
}, onError);
btnStopRecording.onclick = function () {
recordRTC.stopRecording(function (audioVideoWebMURL) {
window.open(audioVideoWebMURL);
});
};
Demo: https://www.webrtc-experiment.com/RecordRTC/AudioVideo-on-Firefox.html
=
How to record audio?
var recordRTC = RecordRTC(mediaStream);
recordRTC.startRecording();
recordRTC.stopRecording(function(audioURL) {
mediaElement.src = audioURL;
});
Remember, you need to invoke navigator.getUserMedia
method yourself; it is too easy to use!
navigator.getUserMedia({audio: true}, function(mediaStream) {
window.recordRTC = RecordRTC(MediaStream);
recordRTC.startRecording();
});
btnStopRecording.onclick = function() {
recordRTC.stopRecording(function(audioURL) {
window.open(audioURL);
});
};
Also, you don't need to use prefixed versions of getUserMedia
and URL
objects. RecordRTC auto handles such things for you! Just use non-prefixed version:
navigator.getUserMedia(media_constraints, onsuccess, onfailure);
URL.createObjectURL(MediaStream);
How to fix audio echo issues?
Simply set volume=0
or muted=true
:
navigator.getUserMedia({audio: true}, function(mediaStream) {
audioElement.volume = 0;
audioElement.src = URL.createObjectURL(mediaStream);
audioElement.play();
});
Or otherwise use googEchoCancellation
and other experimental constraints from here.
=
How to record video?
Everything is optional except type:'video'
:
var options = {
type: 'video'
};
var recordRTC = RecordRTC(mediaStream, options);
recordRTC.startRecording();
recordRTC.stopRecording(function(videoURL) {
mediaElement.src = videoURL;
});
=
How to fix audio/video sync issues on chrome?
recordAudio = RecordRTC( stream, {
onAudioProcessStarted: function( ) {
recordVideo.startRecording();
}
});
recordVideo = RecordRTC(stream, {
type: 'video'
});
recordAudio.startRecording();
onAudioProcessStarted
fixes shared/exclusive audio gap (a little bit). Because shared audio sometimes causes 100ms delay...
sometime about 400-to-500 ms delay.
Delay depends upon number of applications concurrently requesting same audio devices and CPU/Memory available.
Shared mode is the only mode currently available on 90% of windows systems especially on windows 7.
=
How to record animated GIF image?
Everything is optional except type:'gif'
:
var options = {
type: 'gif',
frameRate: 200,
quality: 10
};
var recordRTC = RecordRTC(mediaStream, options);
recordRTC.startRecording();
recordRTC.stopRecording(function(gifURL) {
mediaElement.src = gifURL;
});
=
How to record HTML2Canvas?
You can say it: "HTML/Canvas Recording using RecordRTC"!
<script src="//www.WebRTC-Experiment.com/RecordRTC.js"></script>
<script src="//www.webrtc-experiment.com/screenshot.js"></script>
<div id="elementToShare" style="width:100%;height:100%;background:green;"></div>
<script>
var elementToShare = document.getElementById('elementToShare');
var recordRTC = RecordRTC(elementToShare, {
type: 'canvas'
});
recordRTC.startRecording();
recordRTC.stopRecording(function(url) {
window.open(url);
});
</script>
See a demo: https://www.webrtc-experiment.com/RecordRTC/Canvas-Recording/
=
autoWriteToDisk
Using autoWriteToDisk
; you can suggest RecordRTC to auto-write to indexed-db as soon as you call stopRecording
method.
var recordRTC = RecordRTC(MediaStream, {
autoWriteToDisk: true
});
autoWriteToDisk
is helpful for single stream recording and writing to disk; however for MRecordRTC
; writeToDisk
is preferred one.
=
writeToDisk
You can write recorded blob to disk using writeToDisk
method:
recordRTC.stopRecording();
recordRTC.writeToDisk();
=
getFromDisk
You can get recorded blob from disk using getFromDisk
method:
RecordRTC.getFromDisk('all', function(dataURL, type) {
type == 'audio'
type == 'video'
type == 'gif'
});
RecordRTC.getFromDisk('audio', function(dataURL) {
});
For MRecordRTC; you can use word MRecordRTC
instead of RecordRTC
!
Another possible situation!
var recordRTC = RecordRTC(mediaStream);
recordRTC.startRecording();
recordRTC.stopRecording(function(audioURL) {
mediaElement.src = audioURL;
});
recordRTC.getFromDisk(function(dataURL) {
});
In the above example; you can see that recordRTC
instance object is used instead of global RecordRTC
object.
=
How to set video width/height?
var options = {
type: 'video',
video: {
width: 320,
height: 240
},
canvas: {
width: 320,
height: 240
}
};
=
How to get DataURL?
recordRTC.getDataURL(function(dataURL) {
mediaElement.src = dataURL;
});
=
How to get Blob
object?
blob = recordRTC.getBlob();
=
How to get Virtual-URL?
window.open( recordRTC.toURL() );
=
How to invoke save-to-disk dialog?
recordRTC.save();
=
How to customize Buffer-Size for audio recording?
var options = {
bufferSize: 16384
};
var recordRTC = RecordRTC(audioStream, options);
Following values are allowed for buffer-size:
You can write like this:
var options = {
'buffer-size': 16384
};
=
How to customize Sample-Rate for audio recording?
var options = {
sampleRate: 96000
};
var recordRTC = RecordRTC(audioStream, options);
Values for sample-rate must be greater than or equal to 22050 and less than or equal to 96000.
You can write like this:
var options = {
'sample-rate': 16384
};
=
Is WinXP supported?
No WinXP SP2 support. However, RecordRTC works on WinXP Service Pack 3.
=
Is Chrome on Android supported?
RecordRTC uses WebAudio API for stereo-audio recording. AFAIK, WebAudio is not supported on android chrome releases, yet.
=
Stereo or Mono?
Audio recording fails for mono
audio. So, try stereo
audio only.
=
Possible issues/failures:
Do you know "RecordRTC" fails recording audio because following conditions fails:
- Sample rate and channel configuration must be the same for input and output sides on Windows i.e. audio input/output devices mismatch
- Only the Default microphone device can be used for capturing.
- The requesting scheme is none of the following: http, https, chrome, extension's, or file (only works with
--allow-file-access-from-files
) - The browser cannot create/initialize the metadata database for the API under the profile directory
If you see this error message: Uncaught Error: SecurityError: DOM Exception 18
; it means that you're using HTTP
; whilst your webpage is loading worker file (i.e. audio-recorder.js
) from HTTPS
. Both files's (i.e. RecordRTC.js
and audio-recorder.js
) scheme MUST be same!
=
Web Audio APIs requirements
- If you're on Windows, you have to be running WinXP SP3, Windows Vista or better (will not work on Windows XP SP2 or earlier).
- On Windows, audio input hardware must be set to the same sample rate as audio output hardware.
- On Mac and Windows, the audio input device must be at least stereo (i.e. a mono/single-channel USB microphone WILL NOT work).
=
Why stereo?
If you explorer chromium code; you'll see that some APIs can only be successfully called for WAV
files with stereo
audio.
Stereo audio is only supported for WAV files.
...still investigating the actual issue of failure with mono
audio.
=
Media Stream Recording API (MediaRecorder object) is being implemented by both Firefox and Chrome. RecordRTC is also using MediaRecorder API for Firefox (nightly).
RecordRTC is unable to record "mono" audio on chrome; however it seems that we can covert channels from "stereo" to "mono" using WebAudio API, though. MediaRecorder API's encoder only support 48k/16k mono audio channel (on Firefox Nightly).
=
Browser Support
RecordRTC Demo works fine on following web-browsers:
=
Credits
- Recorderjs for audio recording
- whammy for video recording
- jsGif for gif recording
=
Spec & Reference
- Web Audio API
- MediaRecorder
- Canvas2D
- MediaStream Recording
- Media Capture and Streams
=
License
RecordRTC.js is released under MIT licence . Copyright (c) Muaz Khan.