标签:disp 视频 gst GStreamer tee element queue 采集 pad
参考博客:https://blog.csdn.net/qq_41320692/article/details/116525939 task.json"args": [ "-fdiagnostics-color=always", "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}", "-I", "/usr/include/glib-2.0", "-I", "/usr/lib/x86_64-linux-gnu/glib-2.0/include", "-I", "/usr/include/gstreamer-1.0", "-L", "/usr/lib/x86_64-linux-gnu", "-l", "gstreamer-1.0", "-l", "gobject-2.0", "-l", "glib-2.0" ]
#include <gst/gst.h> static gboolean bus_call(GstBus *bus, GstMessage *msg, gpointer data) { GMainLoop *loop = (GMainLoop *)data; switch (GST_MESSAGE_TYPE(msg)) { case GST_MESSAGE_EOS: g_print("End of stream\n"); g_main_loop_quit(loop); break; case GST_MESSAGE_ERROR: { gchar *debug; GError *error; gst_message_parse_error(msg, &error, &debug); g_printerr("ERROR from element %s: %s\n", GST_OBJECT_NAME(msg->src), error->message); if (debug) g_printerr("Error details: %s\n", debug); g_free(debug); g_error_free(error); g_main_loop_quit(loop); break; } default: break; } return TRUE; } int main(int argc, char *argv[]) { GstElement *pipeline, *v4l2_src, *video_convert, *tee, *disp_queue, *xvimage_sink; GstElement *record_queue, *video_rate, *jpeg_enc, *avi_mux, *file_sink; GstPad *tee_disp_pad, *tee_record_pad; GstPad *queue_disp_pad, *queue_record_pad; // Initialize GStreamer gst_init(&argc, &argv); // Create the elements v4l2_src = gst_element_factory_make("v4l2src", "v4l2_src"); video_convert = gst_element_factory_make("videoconvert", "video_convert"); tee = gst_element_factory_make("tee", "tee"); disp_queue = gst_element_factory_make("queue", "disp_queue"); xvimage_sink = gst_element_factory_make("xvimagesink", "xvimage_sink"); record_queue = gst_element_factory_make("queue", "record_queue"); video_rate = gst_element_factory_make("videorate", "video_rate"); jpeg_enc = gst_element_factory_make("jpegenc", "jpeg_enc"); avi_mux = gst_element_factory_make("avimux", "avi_mux"); file_sink = gst_element_factory_make("filesink", "file_sink"); // Create the empty pipeline pipeline = gst_pipeline_new("test-pipeline"); if (!pipeline || !v4l2_src || !video_convert || !tee || !disp_queue || !xvimage_sink || !record_queue || !video_rate || !jpeg_enc || !avi_mux || !file_sink) { g_printerr("Not all elements could be created.\n"); return -1; } // Configure elements // Link all elements that can be automatically linked because they have "Always" pads gst_bin_add_many(GST_BIN(pipeline), v4l2_src, video_convert, tee, disp_queue, xvimage_sink, record_queue, video_rate, jpeg_enc, avi_mux, file_sink, NULL); if (gst_element_link_many(v4l2_src, video_convert, tee, NULL) != TRUE || gst_element_link_many(disp_queue, xvimage_sink, NULL) != TRUE || gst_element_link_many(record_queue, video_rate, jpeg_enc, avi_mux, file_sink, NULL) != TRUE) { g_printerr("Elements could not be linked.\n"); gst_object_unref(pipeline); return -1; } g_object_set(G_OBJECT(file_sink), "location", "video21.avi", NULL); // Manually link the Tee, which has "Request" pads tee_disp_pad = gst_element_get_request_pad(tee, "src_%u"); g_print("Obtained request pad %s for disp branch.\n", gst_pad_get_name(tee_disp_pad)); queue_disp_pad = gst_element_get_static_pad(disp_queue, "sink"); tee_record_pad = gst_element_get_request_pad(tee, "src_%u"); g_print("Obtained request pad %s for record branch.\n", gst_pad_get_name(tee_record_pad)); queue_record_pad = gst_element_get_static_pad(record_queue, "sink"); if (gst_pad_link(tee_disp_pad, queue_disp_pad) != GST_PAD_LINK_OK || gst_pad_link(tee_record_pad, queue_record_pad) != GST_PAD_LINK_OK) { g_printerr("Tee could not be linked.\n"); gst_object_unref(pipeline); return -1; } g_object_set(G_OBJECT(disp_queue), "max-size-buffers", 0, NULL); g_object_set(G_OBJECT(disp_queue), "max-size-time", 0, NULL); g_object_set(G_OBJECT(disp_queue), "max-size-bytes", 512000000, NULL); g_object_set(G_OBJECT(record_queue), "max-size-buffers", 0, NULL); g_object_set(G_OBJECT(record_queue), "max-size-time", 0, NULL); g_object_set(G_OBJECT(record_queue), "max-size-bytes", 512000000, NULL); gst_object_unref(queue_disp_pad); gst_object_unref(queue_record_pad); // Start playing the pipeline gst_element_set_state(pipeline, GST_STATE_PLAYING); GstBus *bus = NULL; GMainLoop *loop = NULL; guint bus_watch_id; loop = g_main_loop_new(NULL, FALSE); bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); bus_watch_id = gst_bus_add_watch(bus, bus_call, loop); gst_object_unref(bus); g_main_loop_run(loop); gst_element_release_request_pad(tee, tee_disp_pad); gst_element_release_request_pad(tee, tee_record_pad); gst_object_unref(tee_disp_pad); gst_object_unref(tee_record_pad); gst_element_set_state(pipeline, GST_STATE_NULL); gst_object_unref(pipeline); return 0; }
标签:disp,视频,gst,GStreamer,tee,element,queue,采集,pad 来源: https://www.cnblogs.com/agui2022/p/16288181.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。