How to close GStreamer application automatic?

我与影子孤独终老i 提交于 2020-04-18 03:59:10

问题


I'm new in GStreamer. I do some applications follow tutorial and make my own application to write video. But my application can not close automatically after write video successfully and camera is still live (camera led is still light). I must do extra command is Ctrl + C to close.

So how can I know the flag or signal output get from video writer when finish and close my application ?

This is my code:

#include <gst/gst.h>
#include <stdio.h> 
#include <stdlib.h>


//static GMainLoop *loop;

int main(int argc, char *argv[]) {
  GstElement *pipeline, *source, *sink, *filesink, *enc;
  GstBus *bus;
  GstMessage *msg;
  GstStateChangeReturn ret;

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

  /* Create the elements */
  source = gst_element_factory_make ("v4l2src", "device=/dev/video0");
  sink = gst_element_factory_make ("autovideosink", "sink");
  // Elements for write video
  filesink = gst_element_factory_make("filesink",NULL);
  enc = gst_element_factory_make("x264enc",NULL);
  // Set parameters for some elements
  g_object_set(G_OBJECT(source), "num-buffers", 300, NULL);
  g_object_set(G_OBJECT(filesink), "location", "video-GStreamer-1280x720.mp4", "async", 0, NULL);
  /* Create the empty pipeline */
  pipeline = gst_pipeline_new ("test-pipeline");

  if (!pipeline || !source || !sink) {
    g_printerr ("Not all elements could be created.\n");
    return -1;
  }

  /* Build the pipeline */
  gst_bin_add_many (GST_BIN (pipeline), source, filesink, enc, sink, NULL);


  if (gst_element_link_many(source, enc, filesink, NULL) != TRUE){
    g_error("Failed to link save elements!");
    gst_object_unref (pipeline);
    return -1;
  }


  /* Start playing */
  ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
  if (ret == GST_STATE_CHANGE_FAILURE) {
    g_printerr ("Unable to set the pipeline to the playing state.\n");
    gst_object_unref (pipeline);
    return -1;
  }                

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

  /* Parse message */
  if (msg != NULL) {
    GError *err;
    gchar *debug_info;

    switch (GST_MESSAGE_TYPE (msg)) {
      case GST_MESSAGE_ERROR:
        gst_message_parse_error (msg, &err, &debug_info);
        g_printerr ("Error received from element %s: %s\n", GST_OBJECT_NAME (msg->src), err->message);
        g_printerr ("Debugging information: %s\n", debug_info ? debug_info : "none");
        g_clear_error (&err);
        g_free (debug_info);
        break;
      case GST_MESSAGE_EOS:
        g_print ("End-Of-Stream reached.\n");
        break;
      default:
        /* We should not reach here because we only asked for ERRORs and EOS */
        g_printerr ("Unexpected message received.\n");
        break;
    }
    gst_message_unref (msg);
  }

  /* Free resources */
  gst_object_unref (bus);
  gst_element_set_state (pipeline, GST_STATE_NULL);
  gst_object_unref (pipeline);
  //g_main_loop_unref(loop);
  return 0;
}

来源:https://stackoverflow.com/questions/60772967/how-to-close-gstreamer-application-automatic

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!