Gstreamer hello world

On this page there are two simple GStreamer examples. The first uses only one element, playbin which does all the work. The second uses multiple elements to show how elements are linked.

Gstreamer hello world with single element

This example plays a sound file given as parameter with GStreamer. It uses playbin element so it can play any sound file that can be decoded with installed GStreamer plugins.

Compiling:

gcc -Wall $(pkg-config --cflags --libs gstreamer-0.10) filename.c -o filename
#include <gst/gst.h>
#include <glib.h>
#include <string.h>
 
static gboolean
bus_call (GstBus     *bus,
          GstMessage *msg,
          gpointer    data)
{
  GMainLoop *loop = (GMainLoop *) data;
 
  switch (GST_MESSAGE_TYPE (msg)) {
 
    case GST_MESSAGE_EOS:
      g_print ("End of stream\n");
      g_main_loop_quit (loop);
      break;
 
    case GST_MESSAGE_ERROR: {
      gchar  *debug;
      GError *error;
 
      gst_message_parse_error (msg, &error, &debug);
      g_free (debug);
 
      g_printerr ("Error: %s\n", error->message);
      g_error_free (error);
 
      g_main_loop_quit (loop);
      break;
    }
    default:
      break;
  }
 
  return TRUE;
}
 
int
main (int   argc,
      char *argv[])
{
  GMainLoop *loop;
 
  GstElement *pipeline, *bin;
  GstBus *bus;
 
	gchar path[100];
 
  /* Initialisation */
  gst_init (&argc, &argv);
 
  loop = g_main_loop_new (NULL, FALSE);
 
 
  /* Check input arguments */
  if (argc != 2) {
    g_printerr ("Usage: %s <filename>\n", argv[0]);
    return -1;
  }
 
 
  /* Create gstreamer elements */
  pipeline = gst_pipeline_new ("audio-player");
  bin   = gst_element_factory_make ("playbin",       "file-source");
 
  if (!pipeline || !bin) {
    g_printerr ("One element could not be created. Exiting.\n");
    return -1;
  }
 
  /* Set up the pipeline */
 
  /* we set the input filename to the source element */
	/* string functions can be removed. then the parameter has to contain
        file:/// in the beginning to play a file */
  strcpy(path, "file:///");
  strcat(path, argv[1]);
  g_object_set (G_OBJECT (bin), "uri", path, NULL);
 
  /* we add a message handler */
  bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
  gst_bus_add_watch (bus, bus_call, loop);
  gst_object_unref (bus);
 
  /* we add all elements into the pipeline */
  gst_bin_add_many (GST_BIN (pipeline),
                    bin, NULL);
 
  /* Set the pipeline to "playing" state*/
  g_print ("Now playing: %s\n", argv[1]);
  gst_element_set_state (pipeline, GST_STATE_PLAYING);
 
  /* Iterate */
  g_print ("Running...\n");
  g_main_loop_run (loop);
 
  /* Out of the main loop, clean up nicely */
  g_print ("Returned, stopping playback\n");
  gst_element_set_state (pipeline, GST_STATE_NULL);
 
  g_print ("Deleting pipeline\n");
  gst_object_unref (GST_OBJECT (pipeline));
 
  return 0;
}

Gstreamer hello world with multiple elements

This example plays a sound file given as parameter with GStreamer. It uses decodebin element so it can play any sound file that can be decoded with installed GStreamer plugins. Used elements are filesrc, decodebin and autoaudiosink. Elements are linked and file is played.

Compiling:

gcc -Wall $(pkg-config --cflags --libs gstreamer-0.10) filename.c -o filename
#include <gst/gst.h>
#include <glib.h>
 
 
static gboolean
bus_call (GstBus     *bus,
          GstMessage *msg,
          gpointer    data)
{
  GMainLoop *loop = (GMainLoop *) data;
 
  switch (GST_MESSAGE_TYPE (msg)) {
 
    case GST_MESSAGE_EOS:
      g_print ("End of stream\n");
      g_main_loop_quit (loop);
      break;
 
    case GST_MESSAGE_ERROR: {
      gchar  *debug;
      GError *error;
 
      gst_message_parse_error (msg, &error, &debug);
      g_free (debug);
 
      g_printerr ("Error: %s\n", error->message);
      g_error_free (error);
 
      g_main_loop_quit (loop);
      break;
    }
    default:
      break;
  }
 
  return TRUE;
}
 
 
static void
on_pad_added (GstElement *element,
              GstPad     *pad,
              gpointer    data)
{
  GstPad *sinkpad;
  GstElement *decoder = (GstElement *) data;
 
  g_print ("Dynamic pad created, linking \n");
 
  sinkpad = gst_element_get_static_pad (decoder, "sink");
 
  gst_pad_link (pad, sinkpad);
 
  gst_object_unref (sinkpad);
}
 
 
 
int
main (int   argc,
      char *argv[])
{
  GMainLoop *loop;
 
  GstElement *pipeline, *source, *decoder, *conv, *sink;
  GstBus *bus;
 
  /* Initialisation */
  gst_init (&argc, &argv);
 
  loop = g_main_loop_new (NULL, FALSE);
 
 
  /* Check input arguments */
  if (argc != 2) {
    g_printerr ("Usage: %s <filename>\n", argv[0]);
    return -1;
  }
 
 
  /* Create gstreamer elements */
  pipeline = gst_pipeline_new ("audio-player");
  source   = gst_element_factory_make ("filesrc",       "file-source");
  decoder  = gst_element_factory_make ("decodebin",     "decoder");
  conv     = gst_element_factory_make ("audioconvert",  "converter");
  sink     = gst_element_factory_make ("autoaudiosink", "audio-output");
 
  if (!pipeline || !source || !decoder || !conv || !sink) {
    g_printerr ("One element could not be created. Exiting.\n");
    return -1;
  }
 
  /* Set up the pipeline */
 
  /* we set the input filename to the source element */
  g_object_set (G_OBJECT (source), "location", argv[1], NULL);
 
  /* we add a message handler */
  bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
  gst_bus_add_watch (bus, bus_call, loop);
  gst_object_unref (bus);
 
  /* we add all elements into the pipeline */
  /* file-source | decoder | converter | output */
  gst_bin_add_many (GST_BIN (pipeline),
                    source, decoder, conv, sink, NULL);
 
  /* we link the elements together */
  /* file-source -> decodebin ~> converter -> output */
  gst_element_link (source, decoder);
  gst_element_link_many (conv, sink, NULL);
	/* dynamic linking */
  g_signal_connect (decoder, "pad-added", G_CALLBACK (on_pad_added), conv);
 
  /* Set the pipeline to "playing" state*/
  g_print ("Now playing: %s\n", argv[1]);
  gst_element_set_state (pipeline, GST_STATE_PLAYING);
 
  /* Iterate */
  g_print ("Running...\n");
  g_main_loop_run (loop);
 
  /* Out of the main loop, clean up nicely */
  g_print ("Returned, stopping playback\n");
  gst_element_set_state (pipeline, GST_STATE_NULL);
 
  g_print ("Deleting pipeline\n");
  gst_object_unref (GST_OBJECT (pipeline));
 
  return 0;
}