GstRtspSink - C Examples
This wiki provides serves as a guide on how to evaluate the C example applications provided in the project
Location
The C examples are provided in the project. You'll find the sources in
gst-rtsp-sink/src/examples/
The examples are built along with the the plug-in. All the examples will stream using the following configuration:
- Service
- 12345
- Mapping
- /ridgerun
Manual Link Example
This example shows an example application on how to manually create and link each element independently. For this gst_element_factory_make and gst_element_link_many are used.
/* * Copyright (C) 2016-2017 RidgeRun, LLC (http://www.ridgerun.com) * All Rights Reserved. * * The contents of this software are proprietary and confidential to RidgeRun, * LLC. No part of this program may be photocopied, reproduced, or translated * into another programming language without the prior written consent of * RidgeRun, LLC. The user is free to modify the source code after obtaining * a software license from RidgeRun. All source code changes must be provided * back to RidgeRun without any encumbrance. */ #include <gst/gst.h> #include <glib-unix.h> #define MAPPING "/ridgerun" #define SERVICE "12345" gboolean signal_handler (gpointer user_data) { GMainLoop * loop = (GMainLoop *)user_data; g_print ("Interrupt received, closing...\n"); g_main_loop_quit (loop); return TRUE; } int main (gint argc, gchar *argv[]) { GstElement * pipeline; GstElement * vts; GstElement * encoder; GstElement * capsfilter; GstElement * rtsp; GstCaps * caps; GMainLoop * loop; gint ret = -1; gst_init (&argc, &argv); pipeline = gst_pipeline_new ("GstRtspSink"); /* Creating the different elements in the pipeline */ vts = gst_element_factory_make ("videotestsrc", "videotestsrc"); if (!vts) { g_printerr ("Unable to create videotestsrc\n"); goto no_vts; } g_object_set (vts, "is-live", TRUE, NULL); encoder = gst_element_factory_make ("x264enc", "x264enc"); if (!encoder) { g_printerr ("Unable to create x264enc\n"); goto no_enc; } g_object_set (encoder, "speed-preset", 1, "key-int-max", 10, NULL); capsfilter = gst_element_factory_make ("capsfilter", "capsfilter"); if (!capsfilter) { g_printerr ("Unable to create capsfilter\n"); goto no_caps; } caps = gst_caps_from_string ("video/x-h264,mapping=" MAPPING); g_object_set (capsfilter, "caps", caps, NULL); gst_caps_unref (caps); rtsp = gst_element_factory_make ("rtspsink", "rtspsink"); if (!rtsp) { g_printerr ("Unable to create rtspsink\n"); goto no_rtsp; } g_object_set (rtsp, "service", SERVICE, NULL); /* Linking all the elements together */ gst_bin_add_many (GST_BIN (pipeline), vts, encoder, capsfilter, rtsp, NULL); gst_element_link_many (vts, encoder, capsfilter, rtsp, NULL); /* Playing the pipeline */ gst_element_set_state (pipeline, GST_STATE_PLAYING); g_print ("New RTSP stream started at rtsp://127.0.0.1:" SERVICE MAPPING "\n"); /* Block until CTRL+C is pressed */ loop = g_main_loop_new (NULL, TRUE); g_unix_signal_add (SIGINT, signal_handler, loop); g_main_loop_run (loop); g_main_loop_unref (loop); /* NULL the pipeline */ gst_element_set_state (pipeline, GST_STATE_NULL); /* Successful run */ g_print ("Successfully closed\n"); ret = 0; goto no_vts; no_rtsp: gst_object_unref (capsfilter); no_caps: gst_object_unref (encoder); no_enc: gst_object_unref (vts); no_vts: gst_object_unref (pipeline); gst_deinit (); return ret; }
Parse Launch Example
This example shows an example application on how to automatically build the pipeline. For this gst_parse_launch_full' is used.
/* * Copyright (C) 2016-2017 RidgeRun, LLC (http://www.ridgerun.com) * All Rights Reserved. * * The contents of this software are proprietary and confidential to RidgeRun, * LLC. No part of this program may be photocopied, reproduced or translated * into another programming language without prior written consent of * RidgeRun, LLC. The user is free to modify the source code after obtaining * a software license from RidgeRun. All source code changes must be provided * back to RidgeRun without any encumbrance. */ #include <gst/gst.h> #include <gst/rtsp-server/rtsp-server.h> #include <glib-unix.h> #define MAPPING "/ridgerun" #define SERVICE "12345" static gboolean signal_handler (gpointer user_data) { GMainLoop * loop = (GMainLoop *)user_data; g_print ("Interrupt received, closing...\n"); g_main_loop_quit (loop); return TRUE; } static void client_removed_cb(GstElement *rtspsink, GstRTSPUrl * url, gpointer data) { g_print("Removed Client: %s:%d\n", url->host, url->port); } static void client_added_cb(GstElement *rtspsink, GstRTSPUrl * url, gpointer data) { g_print("Added Client: %s:%d\n", url->host, url->port); } int main (gint argc, gchar *argv[]) { GstElement * pipeline; GstElement * rtspsink; GMainLoop * loop; gint ret = -1; const gchar * desc; GError *error = NULL; gst_init (&argc, &argv); desc = "videotestsrc is-live=true ! x264enc speed-preset=ultrafast key-int-max=10 ! " "video/x-h264,mapping=" MAPPING " ! rtspsink name=sink service=" SERVICE; pipeline = gst_parse_launch_full (desc, NULL, GST_PARSE_FLAG_FATAL_ERRORS, &error); if (!pipeline || error) { g_printerr ("Unable to build pipeline: %s", error->message ? error->message : "(no debug)"); goto out; } rtspsink = gst_bin_get_by_name(GST_BIN(pipeline), "sink"); g_signal_connect(rtspsink, "client-added", G_CALLBACK(client_added_cb), NULL); g_signal_connect(rtspsink, "client-removed", G_CALLBACK(client_removed_cb), NULL); /* Playing the pipeline */ gst_element_set_state (pipeline, GST_STATE_PLAYING); g_print ("New RTSP stream started at rtsp://127.0.0.1:" SERVICE MAPPING "\n"); /* Block until CTRL+C is pressed */ loop = g_main_loop_new (NULL, TRUE); g_unix_signal_add (SIGINT, signal_handler, loop); g_main_loop_run (loop); g_main_loop_unref (loop); /* NULL the pipeline */ gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); /* Successful run */ g_print ("Successfully closed\n"); ret = 0; out: gst_deinit (); return ret; }
RTSP Clients
VLC
IP_ADDRESS=127.0.0.1 PORT=12345 MAPPING=ridgerun vlc rtsp://${IP_ADDRESS}:${PORT}/${MAPPING}
GStreamer
IP_ADDRESS=127.0.0.1 PORT=12345 MAPPING=ridgerun gst-launch-1.0 playbin uri=rtsp://${IP_ADDRESS}:${PORT}/${MAPPING}
MPlayer
IP_ADDRESS=127.0.0.1 PORT=12345 MAPPING=ridgerun mplayer rtsp://${IP_ADDRESS}:${PORT}/${MAPPING}
Totem
IP_ADDRESS=127.0.0.1 PORT=12345 MAPPING=ridgerun totem rtsp://${IP_ADDRESS}:${PORT}/${MAPPING}