繁体   English   中英

Gstreamer源代码不起作用

[英]Gstreamer source code doesnt work

我有以下管道,其中一个在udp端口上发送语音信号,另一个在接收器侧的相同端口号上接收语音信号

    gst-launch-1.0 -v  alsasrc ! audioconvert 
! audio/x-raw,channels=2,depth=16,width=16,rate=44100 ! 
    rtpL16pay ! udpsink 
    host=127.0.0.1 port=5000  //sender

gst-launch-1.0 udpsrc port=5000 ! "application/x-rtp,
media=(string)audio, clock-rate=(int)44100, 
encoding-name=(string)L16, channels=(int)2, 
payload=(int)96" ! rtpL16depay ! audioconvert
 ! alsasink    //receiver

现在,我正在尝试使用Gstreamer SDK编写具有相同功能的源代码。 我到目前为止:

#include <gst/gst.h>
#include <string.h>
int main(int argc, char *argv[]) {
  GstElement *pipeline, *source, *audiosink,*rtppay,*rtpdepay,*filter,*filter1,*conv,*conv1,*udpsink,*udpsrc,*receive_resample;
  GstBus *bus;
  GstMessage *msg;
  GstCaps *filtercaps;
  GstStateChangeReturn ret;

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

  /* Create the elements */
  source = gst_element_factory_make ("alsasrc", "source");
  conv= gst_element_factory_make ("audioconvert", "conv");
  conv1= gst_element_factory_make ("audioconvert", "conv1");
  filter=gst_element_factory_make("capsfilter","filter");
  rtppay=gst_element_factory_make("rtpL16pay","rtppay");
  rtpdepay=gst_element_factory_make("rtpL16depay","rtpdepay");
  udpsink=gst_element_factory_make("udpsink","udpsink");
  audiosink = gst_element_factory_make ("autoaudiosink", "audiosink");
receive_resample = gst_element_factory_make("audioresample", NULL);

 udpsrc=gst_element_factory_make("udpsrc",NULL);
  filter1=gst_element_factory_make("capsfilter","filter");
  g_object_set(udpsrc,"port",5000,NULL);
  g_object_set (G_OBJECT (udpsrc), "caps", gst_caps_from_string("application/x-rtp,media=audio,payload=96,clock-rate=44100,encoding-name=L16,channels=2"), NULL);

  /* Create the empty pipeline */
  pipeline = gst_pipeline_new ("test-pipeline");

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

g_object_set(G_OBJECT(udpsink),"host","127.0.0.1",NULL);
   g_object_set(G_OBJECT(udpsink),"port",5000,NULL);

 filtercaps = gst_caps_new_simple ("audio/x-raw",
     "channels", G_TYPE_INT, 2,
     "width", G_TYPE_INT, 16,
     "depth", G_TYPE_INT, 16,
     "rate", G_TYPE_INT, 44100,
     NULL);

g_object_set (G_OBJECT (filter), "caps", filtercaps, NULL);
  gst_caps_unref (filtercaps);


filtercaps = gst_caps_new_simple ("application/x-rtp",
     "media",G_TYPE_STRING,"audio",
     "clock-rate",G_TYPE_INT,44100,
     "encoding-name",G_TYPE_STRING,"L16",
     "channels", G_TYPE_INT, 2,
     "payload",G_TYPE_INT,96,
     NULL);

g_object_set (G_OBJECT (filter1), "caps", filtercaps, NULL);
 gst_caps_unref (filtercaps);

   /* Build the pipeline */
  gst_bin_add_many (GST_BIN (pipeline), source,filter,conv,rtppay,udpsink, NULL);
  if (gst_element_link_many (source,filter,conv,rtppay,udpsink, NULL) != TRUE) {
    g_printerr ("Elements could not be linked.\n");
    gst_object_unref (pipeline);
    return -1;
  }

gst_bin_add_many (GST_BIN (pipeline),udpsrc,rtpdepay,conv1,receive_resample,audiosink,NULL);
  if (gst_element_link_many (udpsrc,rtpdepay,conv1,receive_resample,audiosink,NULL) != TRUE) {
    g_printerr ("Elements could not be linked.\n");
    gst_object_unref (pipeline);
    return -1;
  }

  /* Modify the source's properties */
 // g_object_set (source, "pattern", 0, NULL);

  /* 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);
  return 0;
}

但不知何故我没有在接收器上收到任何声音。 我没有任何错误。 任何想法为什么会这样?

好吧,我想通了。 我不知道为什么,但是当我将源代码分成两个单独的代码时,我将其中的代码包含到UDPsink元素中,然后将其余元素(即udpsrc,rtpdepay和audiosink )包含在另一个代码中源代码文件,并分别在两个工作的终端中分别编译它们。 我仍然不知道为什么会这样,但是我很高兴它能起作用。

发送方和接收方应该是两个不同的进程,这就是为什么当您使用两个终端时它可以工作的原因。

在您的代码中,您要将两个不同的管道放入同一管道元素中,并将其设置为可播放。 不支持此功能,您需要为此创建其他管道。

 pipeline1 = gst_pipeline_new ("src-pipeline");
 pipeline2 = gst_pipeline_new ("sink-pipeline");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM