Как преобразовать командную строку GStreamer в код c с помощью мультимедийной среды GStreamer? - PullRequest
1 голос
/ 09 марта 2020

gst-launch-1.0 --gst-debug-level = 2 dvbsr c modulation = частота "QAM 256" = 147000000! имя декодера = demux demux. ! очередь ! аудиосэмпл! аудиоконвертировать! voaacen c! Мультиплексор. mpegtsmux name = mux! udpsink host = 127.01.01.10 port = 22 demux. ! очередь ! видеоконверт! видеомасштаб x264en c битрейт = 1258 мелодия = нулевая задержка! video / x-h264, stream-format = byte-stream, profile = high, width = 540, height = 380, key-int-max = 15! mux.

Я пытаюсь по конвейеру сделать эту командную строку. Но я сталкиваюсь со многими типами ошибок. Я не могу создавать командную строку, используя инфраструктуру 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;
 }

1 Ответ

0 голосов
/ 09 марта 2020

Вы не проводите никакой проверки ошибок в коде. Поэтому проверьте, все ли команды выполнены успешно, а какие нет. Более того, вы можете значительно облегчить себе жизнь, если используете функцию gst_parse_launch() и версию командной строки, которая должна работать на вас.

...