发送:send
gst-launch filesrc location=/root/Media/test.mp3 ! mad ! audioconvert !
audio/x-raw-int,channels=1,depth=16,width=16, rate=44100 ! rtpL16pay ! udpsink
host=127.0.0.1 port=5000
接收:recv
gst-launch-0.10 udpsrc port=5000 ! "application/x-rtp,media=(string)audio,
clock-rate=(int)44100, width=16, height=16,\
encoding-name=(string)L16, encoding-params=(string)1, channels=(int)1,
channel-positions=(int)1, payload=(int)96" ! gstrtpjitterbuffer do-lost=true ! rtpL16depay !
audioconvert ! alsasink sync=false
音乐文件你自己添加一个就可以了,快去试试吧!!!
C 语言编程文件会在后续慢慢添加,高手请指点吧!!!不知道可以参考一下!!!
C 语言编程终于实现了,我自己也不是很懂原理,如果有不合理的地方欢迎大家指正共同进步:
发送部分:
server-sender.c
#include
#include
#include
#define DEST_HOST "127.0.0.1"
#define AUDIO_CAPS "audio/x-raw-int,channels=1,depth=16,width=16, rate=44100"
int
main (int argc,char *argv[])
{
GstElement *source,*maddecoder,*audioconv;
GstElement *rtpbin,*rtpsink,*rtppay;
GstElement *pipeline;
GMainLoop *loop;
GstCaps *caps;
GstPad *srcpad,*sinkpad;
gst_init(&argc,&argv);
pipeline = gst_pipeline_new(NULL);
g_assert(pipeline);
source = gst_element_factory_make("filesrc","source");
g_assert (pipeline);
maddecoder=gst_element_factory_make("mad","maddecoder");
g_assert (maddecoder);
audioconv=gst_element_factory_make("audioconvert","audioconv");
g_assert (audioconv);
caps=gst_caps_new_simple("audio/x-raw-int",
"channels",G_TYPE_INT,1,
"depth",G_TYPE_INT,16,
"width",G_TYPE_INT,15,
"rate",GST_TYPE_LIST,44100,NULL);
/*
*/
rtppay=gst_element_factory_make("rtpL16pay","rtppay");
g_assert (rtppay);
g_object_set(G_OBJECT(source),"location","/root/Media/test.mp3",NULL);
gst_bin_add_many (GST_BIN (pipeline),source,maddecoder,audioconv,rtppay,NULL);
caps=gst_caps_from_string(AUDIO_CAPS);
if(!gst_element_link_many(source,maddecoder,audioconv,NULL)){
g_error("Failed to link ");
}
if(!gst_element_link_filtered(audioconv,rtppay,caps))
g_error("Failed to link caps");
{
}
gst_caps_unref(caps);
rtpbin=gst_element_factory_make("gstrtpbin","rtpbin");
g_assert(rtpbin);
gst_bin_add(GST_BIN(pipeline),rtpbin);
rtpsink=gst_element_factory_make ("udpsink","rtpsink");
g_assert(rtpsink);
g_object_set(rtpsink,"port",5000,"host","127.0.0.1",NULL);
gst_bin_add_many(GST_BIN(pipeline),rtpsink,NULL);
sinkpad = gst_element_get_request_pad (rtpbin, "send_rtp_sink_0");
srcpad = gst_element_get_static_pad (rtppay, "src");
if (gst_pad_link (srcpad, sinkpad) != GST_PAD_LINK_OK)
g_error ("Failed to link audio payloader to rtpbin");
gst_object_unref (srcpad);
srcpad = gst_element_get_static_pad (rtpbin, "send_rtp_src_0");
sinkpad = gst_element_get_static_pad (rtpsink, "sink");
if (gst_pad_link (srcpad, sinkpad) != GST_PAD_LINK_OK)
g_error ("Failed to link rtpbin to rtpsink");
gst_object_unref (srcpad);
gst_object_unref (sinkpad);
g_print("starting sender pipeline\n");
gst_element_set_state(pipeline,GST_STATE_PLAYING);
loop=g_main_loop_new(NULL,FALSE);
g_main_loop_run(loop);
g_print("stopping sender pipeline\n");
gst_element_set_state(pipeline,GST_STATE_NULL);
return 0;
}
接收部分:
client-recv.c
#include
#include
#include
#define AUDIO_CAPS "application/x-rtp,media=(string)audio, clock-rate=(int)44100,
width=16, height=16,encoding-name=(string)L16, encoding-params=(string)1,
channels=(int)1, channel-positions=(int)1, payload=(int)96"
//"application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)PCM
A"
static void
print_source_stats (GObject * source)
{
GstStructure *stats;
gchar *str;
g_return_if_fail (source != NULL);
/* get the source stats */
g_object_get (source, "stats", &stats, NULL);
/* simply dump the stats structure */
str = gst_structure_to_string (stats);
g_print ("source stats: %s\n", str);
gst_structure_free (stats);
g_free (str);
}
static void
on_ssrc_active_cb (GstElement * rtpbin, guint sessid, guint ssrc,
GstElement * depay)
{
GObject *session, *isrc, *osrc;
g_print ("got RTCP from session %u, SSRC %u\n", sessid, ssrc);
/* get the right session */
g_signal_emit_by_name (rtpbin, "get-internal-session", sessid, &session);
/* get the internal source (the SSRC allocated to us, the receiver */
g_object_get (session, "internal-source", &isrc, NULL);
print_source_stats (isrc);
/* get the remote source that sent us RTCP */
g_signal_emit_by_name (session, "get-source-by-ssrc", ssrc, &osrc);
print_source_stats (osrc);
}
static void
pad_added_cb (GstElement * rtpbin, GstPad * new_pad, GstElement * depay)
{
}
GstPad *sinkpad;
GstPadLinkReturn lres;
g_print ("new payload on pad: %s\n", GST_PAD_NAME (new_pad));
sinkpad = gst_element_get_static_pad (depay, "sink");
g_assert (sinkpad);
lres = gst_pad_link (new_pad, sinkpad);
g_assert (lres == GST_PAD_LINK_OK);
gst_object_unref (sinkpad);
int
main (int argc,char *argv[])
{
GstElement *rtpbin,*rtpsrc,*buffer,*rtppay,*audioconver, *audiosink;
GstElement *pipeline;
GMainLoop *loop;
GstCaps *caps;
GstPadLinkReturn lres;
GstPad *srcpad,*sinkpad;
gst_init(&argc,&argv);
pipeline=gst_pipeline_new(NULL);
g_assert (pipeline);
rtpsrc=gst_element_factory_make("udpsrc","rtpsrc");
g_assert (rtpsrc);
g_object_set (rtpsrc,"port",5000,NULL);
caps=gst_caps_from_string(AUDIO_CAPS);
g_object_set(rtpsrc,"caps",caps,NULL);
gst_caps_unref(caps);
gst_bin_add_many(GST_BIN (pipeline),rtpsrc,NULL);
rtppay=gst_element_factory_make("rtpL16depay","rtppay");
g_assert (rtppay);
audioconver=gst_element_factory_make("audioconvert","audioconver");
g_assert (audioconver);
audiosink=gst_element_factory_make("alsasink","audiosink");
g_assert (audiosink);
gst_bin_add_many (GST_BIN(pipeline),rtppay,audioconver,audiosink,NULL);
gboolean res=gst_element_link_many(rtppay,audioconver,audiosink,NULL);
g_assert(res==TRUE);
g_object_set (audiosink, "sync", FALSE, NULL);
rtpbin=gst_element_factory_make("gstrtpbin","rtpbin");
g_assert(rtpbin);
gst_bin_add(GST_BIN(pipeline),rtpbin);
srcpad = gst_element_get_static_pad (rtpsrc, "src");
sinkpad = gst_element_get_request_pad (rtpbin, "recv_rtp_sink_0");
lres = gst_pad_link (srcpad, sinkpad);
g_assert (lres == GST_PAD_LINK_OK);
gst_object_unref (srcpad);
g_signal_connect (rtpbin, "pad-added", G_CALLBACK (pad_added_cb), rtppay);
/* give some stats when we receive RTCP */
//
g_signal_connect (rtpbin, "on-ssrc-active", G_CALLBACK (on_ssrc_active_cb),
//
rtppay);
g_print ("starting receiver pipeline\n");
gst_element_set_state (pipeline, GST_STATE_PLAYING);
loop = g_main_loop_new (NULL, FALSE);