【问题标题】:How to convert GStreamer command line into c code with using GStreamer multimedia framework?如何使用 GStreamer 多媒体框架将 GStreamer 命令行转换为 c 代码?
【发布时间】:2020-06-21 01:34:39
【问题描述】:

gst-launch-1.0 --gst-debug-level=2 dvbsrc 调制="QAM 256" 频率=147000000! decodebin 名称=demux 解复用器。 !队列 ! 音频重采样!音频转换!呸!多路复用器。 mpegtsmux 名称=mux ! udpsink 主机=127.01.01.10 端口=22 解复用器。 !队列 !视频转换! 视频缩放! x264enc 比特率=1258 调=零延迟! video/x-h264,stream-format=byte-stream,profile=high,width=540,height=380,key-int-max=15 !多路复用器。

我正在尝试使用管道方式制作此命令行。但我面临许多类型的错误。我不能使用 Gstreamer 框架制作命令行。我想把它转换成代码。

 #include <gst/gst.h>

 #include <glib.h>

 int main(int argc, char * argv[]) {
   GstElement * pipeline, * filter, * audio_source, * tee, * audio_queue, * audio_convert, * audio_resample, * audio_sink;
   GstElement * video_queue, * visual, * video_convert, * video_sink;
   GstBus * bus;
   GstMessage * msg;
   GstCaps * filtercaps;
   GstPad * tee_audio_pad, * tee_video_pad;
   GstPad * queue_audio_pad, * queue_video_pad;
   /* Initialize GStreamer */
   gst_init( & argc, & argv);
   /* Create the elements */
   audio_source = gst_element_factory_make("audiotestsrc", "audio_source");
   tee = gst_element_factory_make("tee", "tee");
   audio_queue = gst_element_factory_make("queue", "audio_queue");
   audio_convert = gst_element_factory_make("audioconvert", "audio_convert");
   audio_resample = gst_element_factory_make("audioresample", "audio_resample");
   audio_sink = gst_element_factory_make("autoaudiosink", "audio_sink");
   video_queue = gst_element_factory_make("queue", "video_queue");
   visual = gst_element_factory_make("wavescope", "visual");
   video_convert = gst_element_factory_make("videoconvert", "csp");
   video_sink = gst_element_factory_make("autovideosink", "video_sink");
   filter = gst_element_factory_make("capsfilter", "filter");
   g_assert(filter != NULL); /* should always exist */

   /* Create the empty pipeline */
   pipeline = gst_pipeline_new("test-pipeline");
   if (!pipeline || !audio_source || !tee || !audio_queue || !audio_convert || !audio_resample || !audio_sink || !video_queue || !visual || !video_convert || !video_sink) {
     g_printerr("Not all elements could be created.\n");
     return -1;
   }
   /* Configure elements */
   g_object_set(audio_source, "freq", 215.0 f, NULL);
   g_object_set(visual, "shader", 0, "style", 1, NULL);
   /* Link all elements that can be automatically linked because they have "Always" pads */
   gst_bin_add_many(GST_BIN(pipeline), filter, audio_source, tee, audio_queue, audio_convert, audio_resample, audio_sink,
     video_queue, visual, video_convert, video_sink, NULL);
   if (gst_element_link_many(audio_source, tee, NULL) != TRUE ||
     gst_element_link_many(audio_queue, audio_convert, audio_resample, audio_sink, NULL) != TRUE ||
     gst_element_link_many(video_queue, visual, video_convert, video_sink, NULL) != TRUE) {
     g_printerr("Elements could not be linked.\n");
     gst_object_unref(pipeline);
     return -1;
   }
   /* Manually link the , which has "Request" pads */
   tee_audio_pad = gst_element_get_request_pad(tee, "src_%u");
   g_print("Obtained request pad %s for audio branch.\n", gst_pad_get_name(tee_audio_pad));
   queue_audio_pad = gst_element_get_static_pad(audio_queue, "sink");
   tee_video_pad = gst_element_get_request_pad(tee, "src_%u");
   g_print("Obtained request pad %s for video branch.\n", gst_pad_get_name(tee_video_pad));
   queue_video_pad = gst_element_get_static_pad(video_queue, "sink");
   if (gst_pad_link(tee_audio_pad, queue_audio_pad) != GST_PAD_LINK_OK ||
     gst_pad_link(tee_video_pad, queue_video_pad) != GST_PAD_LINK_OK) {
     g_printerr("Tee could not be linked.\n");
     gst_object_unref(pipeline);
     return -1;
   }
   filtercaps = gst_caps_new_simple("video/x-raw",
     "format", G_TYPE_STRING, "RGB16",
     "width", G_TYPE_INT, 640,
     "height", G_TYPE_INT, 480,
     "framerate", GST_TYPE_FRACTION, 25, 1,
     NULL);
   g_object_set(G_OBJECT(filter), "caps", filtercaps, NULL);
   gst_caps_unref(filtercaps);
   gst_object_unref(queue_audio_pad);
   gst_object_unref(queue_video_pad);
   /* Start playing the pipeline */
   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, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
   /* Release the request pads from the Tee, and unref them */
   gst_element_release_request_pad(tee, tee_audio_pad);
   gst_element_release_request_pad(tee, tee_video_pad);
   gst_object_unref(tee_audio_pad);
   gst_object_unref(tee_video_pad);
   /* 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;
 }

【问题讨论】:

    标签: c gstreamer


    【解决方案1】:

    您没有在代码中进行任何类型的错误检查。所以检查所有命令是否成功,哪些不成功。当您使用 gst_parse_launch() 函数并使用应该适合您的命令行版本时,您可以让您的生活更加轻松。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-13
      • 2022-08-05
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多