问题
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