Search code examples
c++gstreamerrtsp

gstreamer rtsp tee appsink can't emit signal new-sample


I am using gstreamer to play and slove the rtsp stream.

rtspsrc location=rtspt://admin:[email protected]:554/Streaming/Channels/1 ! tee name=t ! queue ! decodebin ! videoconvert ! autovideosink t. ! queue ! rtph264depay ! h264parse ! appsink name=mysink

and i write in c++ code like this :

#include <gst/gst.h>

void printIt(GList *p) {
  if(!p) {
    g_print("p null\n");
    return ;
  }
  while(p) {
    GstPad *pad = (GstPad*)p->data;
    g_print("[%s]", pad->object.name);
    p = p->next;
  }
  g_print("\n");
}

GstFlowReturn new_sample_cb (GstElement * appsink, gpointer udata) {
  g_print("new-sample cb\n");
  return GST_FLOW_OK;
}

GstFlowReturn new_preroll_cb (GstElement* appsink, gpointer udata) {
  g_print("new_preroll_cb cb\n");
  return GST_FLOW_OK;
}

int
main (int argc, char *argv[]) {
  GstElement *pipeline;
  GstBus *bus;
  GstMessage *msg;

  /* Initialize GStreamer */
  gst_init (&argc, &argv);

  /* Build the pipeline */
  pipeline = gst_parse_launch("rtspsrc location=rtspt://admin:[email protected]:554/Streaming/Channels/1 ! tee name=t ! queue ! decodebin ! videoconvert ! autovideosink t. ! queue ! rtph264depay ! h264parse ! appsink name=mysink", NULL);

  GstElement *appsink = gst_bin_get_by_name(GST_BIN(pipeline), "mysink"); 
  printIt(appsink->pads);

  g_signal_connect(appsink, "new-sample", G_CALLBACK(new_sample_cb), pipeline);
  g_print("sig conn new-sample\n");

  g_signal_connect(appsink, "new-preroll", G_CALLBACK(new_preroll_cb), pipeline);
  g_print("sig conn new-preroll\n");

  /* Start playing */
  gst_element_set_state (pipeline, GST_STATE_PLAYING);

  /* Wait until error or EOS */
  bus = gst_element_get_bus (pipeline);
  msg =
      gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE,
      GstMessageType(GST_MESSAGE_ERROR | GST_MESSAGE_EOS));

  /* Free resources */
  if (msg != NULL)
    gst_message_unref (msg);
  gst_object_unref (bus);
  gst_element_set_state (pipeline, GST_STATE_NULL);
  gst_object_unref (pipeline);
  return 0;
}

when i compile and run it. it has output video in the autovideosink but the appsink's signal new-sample is not be callbacked. what should i do if i what to slove a frame in appsink ?

enter image description here thanks.


Solution

  • By default appsink favors to use callbacks instead of signals for performance reasons (but I wouldn't consider your use case as a performance problem). For appsink to emit signals you will need to set the emit-signals property of the appsink to true. It defaults to false.

    P.S. Apart from the above, I think you will need a GMainLoop for the event processing as demonstrated in the GStreamer examples.