简体   繁体   English

Gstreamer源代码不起作用

[英]Gstreamer source code doesnt work

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 我有以下管道,其中一个在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

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. 现在,我正在尝试使用Gstreamer SDK编写具有相同功能的源代码。 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. 我不知道为什么,但是当我将源代码分成两个单独的代码时,我将其中的代码包含到UDPsink元素中,然后将其余元素(即udpsrc,rtpdepay和audiosink )包含在另一个代码中源代码文件,并分别在两个工作的终端中分别编译它们。 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 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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