문제

i have the following pipelines that one of them sends voice signals on udp port and the other receives them on the same port number on the receiver side

    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

and

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

now i am trying to write a source code using Gstreamer SDK that does the same thing. I have come so far:

#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;
}

but somehow i dont receive any voice on the receiver. i dont get any errors of any kind. Any ideas why this is happening?

도움이 되었습니까?

해결책

Well i figured it out. I don't know why but when i divided the source code into two separate ones and in one of them i included the code up until the UDPsink element and included the rest of the elements after that ( meaning udpsrc, rtpdepay and audiosink) in another source code file and compiled them separately in two separate Terminals it worked. I still don't know why it is like this , but i am happy that it works.

다른 팁

The sender and reciever are supposed to be two different processes, which is why it works when you use two terminals.

In your code, you're putting two different pipelines in the same pipeline element and setting it to playing. This is not supported, you need to create a different pipeline for that.

 pipeline1 = gst_pipeline_new ("src-pipeline");
 pipeline2 = gst_pipeline_new ("sink-pipeline");
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top