Gstreamer tutorial Part 1 as a node native addon.


Hello! I needed to call some GStreamer C++ code in my application from node, however there isn't a lot of information on how to do this so I thought I'd try it myself. Just leaving this to remind myself later of the basics and if it helps anyone else, Win-Win. :)

Also I am pretty new to creating native modules, so this was a good learning experience.

This sample basically takes the sample GStreamer application Basic Tutorial 1: Hello World source and enables it to be called via NodeJS.

Here I will be using the "node-addon-api"package for wrapping.


  • Gstreamer + GStreamer-Devel installed
  • PkgConfig
  • NodeJS

First we need to create the C++ file, open up "src/" and type/copy the following:

#include <gst/gst.h>
#include <napi.h>

using namespace Napi; 

Number Play (const CallbackInfo& info)
  GstElement *pipeline;
  GstBus *bus;
  GstMessage *message;

  gst_init(NULL, NULL);

  pipeline = gst_parse_launch(
    "playbin uri="
  , NULL);

  gst_element_set_state(pipeline, GST_STATE_PLAYING);

  bus = gst_element_get_bus(pipeline);
  message = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, (GstMessageType)(GST_MESSAGE_ERROR | GST_MESSAGE_EOS));

    g_error("An error occured");

  gst_element_set_state(pipeline, GST_STATE_NULL);

  return Number::New(info.Env(), 0);

Object Init (Env env, Object exports)
  exports.Set("play", Function::New(env, Play));

  return exports;

NODE_API_MODULE(addon, Init);

Next we need to create the "bindings.gyp" file which allows us to compile native addon modules for NodeJS. Open it up and add the following:

  "targets": [
      "target_name": "gstreamer",
      "sources": [
      "include_dirs": [
        "<!@(node -p \"require('node-addon-api').include\")",
        "<!@(pkg-config gstreamer-1.0 --cflags-only-I | sed s/-I//g)"
      "libraries": [
        "<!@(pkg-config gstreamer-1.0 --libs)"
      "cflags!": ["-fno-exceptions"],
      "cflags_cc!": ["-fno-exceptions"],
      "defines": ["NAPI_CPP_EXCEPTIONS"]

Here we basically include the needed libraries and header files, in this case we only need GStreamer.

Next we need to initialize the NodeJS Module.

npm init -y

Install the necessary packages:

npm i bindings node-addon-api

Now we need to build the native addon:

npm i

Now that the native module has been built we can create a test file to test it, open up "test.js" and add the following:

const addon = require('bindings')('gstreamer');;

Done now we just need to execute it:

node test.js

If done correctly you should now see the video playing in a new window.

Next I would like to pass the src to the native module and play that. Possibly an RTSP feed. :)

Github Repo:

Like me work? Any support is appreciated. :) "Buy Me A Coffee"