gstreamer rtsp tee appsink 无法发出信号新样本

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

我正在使用 gstreamer 播放和播放 rtsp 流。

rtspsrc location=rtspt://admin:scut123456@192.168.1.64:554/Streaming/Channels/1 ! tee name=t ! queue ! decodebin ! videoconvert ! autovideosink t. ! queue ! rtph264depay ! h264parse ! appsink name=mysink

我在 c++ 中这样写代码 :

#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:scut123456@192.168.1.64: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;
}

当我编译时 运行 它。它在 autovideosink 中有输出视频,但 appsink 的信号 new-sample 未被回调。如果我想在 appsink 中删除一个框架,我该怎么办?

谢谢。

默认情况下 appsink 出于性能原因倾向于使用回调而不是信号(但我不会将您的用例视为性能问题)。要使 appsink 发出信号,您需要将 appsinkemit-signals 属性 设置为 true。它默认为 false.

P.S。除了上述之外,我认为您将需要一个 GMainLoop 来进行事件处理,如 GStreamer 示例中所示。