Webcam live-streaming solution using GStreamer and Node.js
To obtain this module, type in npm install livecam
. You also need GStreamer 1.3+ runtime installed on your machine.
Depending on your architecture, you may download the latest runtimes provided and maintained by the GStreamer project. They usually come in MSI installer format. You do not need the development installers. Naming of the runtime package follows the gstreamer-1.0-<arch>-<version>.msi
convention.
Make sure you select COMPLETE installation and NOT typical. If you go with typical, ksvideosrc
plugin will not be available for you, and livecam will not be able to use it.
After installation, make sure you have GSTREAMER_1_0_ROOT_<arch>
environment variable defined in your system. This is a variable created by the MSI installer, pointing to where you installed the runtime package. You might need to restart your computer after installation for this variable to show up.
GStreamer might be already available on your machine. You may verify its existence by typing gst-launch-1.0 --version
on your command line. If this command is not available, you can obtain GStreamer from your distro's package manager. For example on Ubuntu 16.04:
$ sudo apt install libgstreamer1.0-dev
$ sudo apt install libgstreamer-plugins-*1.0-dev
You may obtain GStreamer runtime via Homebrew.
$ brew install gstreamer # install gstreamer
$ brew install gst-plugins-good # general plugins
$ brew install gst-plugins-bad # mac video sources etc.
// npm install livecam
const LiveCam = require('livecam');
const webcam_server = new LiveCam({
'start' : function() {
console.log('WebCam server started!');
}
});
webcam_server.broadcast();
If all goes fine, you will see a message like this in your console: Open http://127.0.0.1:11000/ in your browser!
.
LiveCam
takes an object in as its launch configuration:
// npm install livecam
const LiveCam = require('livecam');
const webcam_server = new LiveCam
({
// address and port of the webcam UI
'ui_addr' : '127.0.0.1',
'ui_port' : 11000,
// address and port of the webcam Socket.IO server
// this server broadcasts GStreamer's video frames
// for consumption in browser side.
'broadcast_addr' : '127.0.0.1',
'broadcast_port' : 12000,
// address and port of GStreamer's tcp sink
'gst_tcp_addr' : '127.0.0.1',
'gst_tcp_port' : 10000,
// callback function called when server starts
'start' : function() {
console.log('WebCam server started!');
},
// webcam object holds configuration of webcam frames
'webcam' : {
// should frames be converted to grayscale (default : false)
'grayscale' : true,
// should width of the frame be resized (default : 0)
// provide 0 to match webcam input
'width' : 800,
// should height of the frame be resized (default : 0)
// provide 0 to match webcam input
'height' : 600,
// should a fake source be used instead of an actual webcam
// suitable for debugging and development (default : false)
'fake' : false,
// framerate of the feed (default : 0)
// provide 0 to match webcam input
'framerate' : 25,
// macos only: select the webcam via index
'deviceIndex' : 1
}
});
In the configuration above:
NOTE 1 broadcast address and UI address need to be visible to each other. NOTE 2 broadcast address and gst_tcp address need to be visible to each other. NOTE 3 UI address and gst_tcp address need NOT to be visible to each other.
That means you can hide gst_tcp address behind your firewall.
-
Q. What's the max resolution supported for broadcast? A. This is a very generic and broad question, and the answer to it is highly platform, network, and hardware dependent. If you are looking for a generic answer, I have successfully streamed 1920x1080@30fps in my home network to five different clients (including a Galaxy Edge) at once.
-
Q. Can this module stream a static file instead of a webcam? A. Yes. in
livecam.js
, look forgst_video_src
variable and assign the following value to it:// assuming you're on Windows and the file is on C:\videos\stream.mp4 // NOTE the four backslashes! var gst_video_src = 'filesrc location="C:\\\\videos\\\\stream.mp4"'