<DIV>#include &lt;gst/gst.h&gt;<BR>#include &lt;glib.h&gt;<BR>static GstElement *a_queue,*v_queue,*audio,*pipeline=NULL; //volter<BR>GstBus *bus;<BR>GMainLoop *loop;<BR>gchar filepath[256]="test.ts";<BR>static GstState state = GST_STATE_NULL;</DIV>
<DIV>static int build_pipeline(gchar *location);<BR>static void play_cb (gchar * filepath);<BR>static void new_pad (GstElement *element, GstPad *pad, gpointer data);<BR>static void new_pad2 (GstElement *element, GstPad *pad, gpointer data);<BR>static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data);</DIV>
<DIV><BR>int main (int argc, char **argv)<BR>{<BR>&nbsp; gst_init (&amp;argc, &amp;argv);<BR>&nbsp; loop = g_main_loop_new (NULL, FALSE);</DIV>
<DIV>&nbsp; play_cb(filepath);</DIV>
<DIV>&nbsp; g_print ("Running\n");<BR>&nbsp; g_main_loop_run (loop);</DIV>
<DIV>&nbsp; gst_element_set_state (pipeline, GST_STATE_NULL);<BR>&nbsp;<BR>&nbsp; g_print("main-pipeline:%x\n",pipeline);<BR>&nbsp; <BR>&nbsp; gst_object_unref (GST_OBJECT (pipeline));</DIV>
<DIV>&nbsp; return 0;<BR>}</DIV>
<DIV>&nbsp;</DIV>
<DIV>static void play_cb (gchar * filepath)<BR>{</DIV>
<DIV>&nbsp;GstStateChangeReturn ret;<BR>&nbsp;<BR>&nbsp;build_pipeline(filepath);</DIV>
<DIV><BR>&nbsp; if (state != GST_STATE_PLAYING) {<BR>&nbsp;&nbsp;&nbsp; g_print ("PLAY pipeline\n");<BR>&nbsp;&nbsp;&nbsp; ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);<BR>&nbsp;&nbsp;&nbsp; if (ret == GST_STATE_CHANGE_FAILURE)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto failed;</DIV>
<DIV>&nbsp;&nbsp;&nbsp; state = GST_STATE_PLAYING;<BR>&nbsp; }<BR>&nbsp; return;</DIV>
<DIV>failed:<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; g_print ("PLAY failed\n");<BR>&nbsp; }<BR>}</DIV>
<DIV>&nbsp;</DIV>
<DIV>static int build_pipeline(gchar *location)<BR>{<BR>&nbsp; GstElement *filesrc,*ts_demux;<BR>&nbsp; GstElement *a_dec,*a_conv,*audiosink,*a_resample;<BR>&nbsp; GstStateChangeReturn ret;<BR>&nbsp; GstPad *audiopad,*queuesrcpad;//,*queuesinkpad<BR>&nbsp; </DIV>
<DIV>&nbsp; g_print("vesion 20070907\n");<BR>&nbsp; sleep(2);</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp; // create a new pipeline to hold the elements <BR>&nbsp; pipeline = gst_pipeline_new ("pipe");</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;// create file source element<BR>&nbsp;filesrc = gst_element_factory_make ("filesrc", "source");<BR>&nbsp; if (!filesrc )<BR>&nbsp; &nbsp; {<BR>&nbsp;&nbsp;&nbsp; g_print ("source element could not be created\n");<BR>&nbsp;&nbsp;return -1;<BR>&nbsp;&nbsp;}<BR>&nbsp;g_object_set (G_OBJECT (filesrc), "location", location, NULL);<BR>&nbsp;&nbsp;gst_bin_add (GST_BIN (pipeline), filesrc);</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp; bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));<BR>&nbsp; gst_bus_add_watch (bus, bus_call, loop);<BR>&nbsp; gst_object_unref (bus);</DIV>
<DIV>&nbsp;</DIV>
<DIV>// create ts demux element<BR>&nbsp;ts_demux = gst_element_factory_make ("flutsdemux", "ts_demux");<BR>&nbsp;if (!ts_demux )<BR>&nbsp; &nbsp; {<BR>&nbsp;&nbsp;&nbsp; g_print ("ts_demux element could not be created\n");<BR>&nbsp;&nbsp;return -1;<BR>&nbsp;&nbsp;}&nbsp;&nbsp;<BR>&nbsp;&nbsp;gst_bin_add (GST_BIN (pipeline), ts_demux);<BR>&nbsp;gst_element_link (filesrc, ts_demux);<BR>&nbsp;<BR>//audio process....<BR>//create a queue bettwen demuxer and decoder, link ts_demux with queue<BR>&nbsp;a_queue = gst_element_factory_make ("queue", "a_queue");<BR>&nbsp;if (!a_queue )<BR>&nbsp; &nbsp; {<BR>&nbsp; &nbsp;&nbsp;&nbsp; g_print ("a_queue element could not be created\n");<BR>&nbsp;&nbsp;return -1;<BR>&nbsp;&nbsp;}<BR>&nbsp;gst_bin_add (GST_BIN (pipeline), a_queue);<BR>&nbsp;gst_element_set_state (a_queue, GST_STATE_READY);</DIV>
<DIV>&nbsp;//queuesinkpad = gst_element_get_pad (a_queue, "sink");<BR>&nbsp;queuesrcpad = gst_element_get_pad (a_queue, "src");</DIV>
<DIV>&nbsp;</DIV>
<DIV>g_signal_connect (ts_demux, "pad-added", G_CALLBACK (new_pad), NULL);<BR>&nbsp;//ts_demux src pad is dynamic...<BR>&nbsp;//gst_pad_link (gst_element_get_pad (ts_demux, "audio_%02d"), queuesinkpad);</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>//create audio decoder and link queue with a_dec<BR>&nbsp; &nbsp;a_dec = gst_element_factory_make ("flump3dec", "a_dec");<BR>&nbsp;gst_bin_add (GST_BIN (pipeline), a_dec);<BR>&nbsp;gst_pad_link (queuesrcpad,gst_element_get_pad (a_dec, "sink") );</DIV>
<DIV><BR>//create audio out bin<BR>&nbsp;&nbsp; audio=gst_bin_new ("audio");</DIV>
<DIV>&nbsp;&nbsp; a_conv = gst_element_factory_make ("audioconvert", "a_conv");<BR>&nbsp;&nbsp; a_resample=gst_element_factory_make ("audioresample", "a_resample");<BR>&nbsp;&nbsp; audiosink = gst_element_factory_make ("alsasink", "audiosink");<BR>&nbsp;&nbsp; if ( !a_conv || !a_resample || !audiosink) {<BR>&nbsp; &nbsp;&nbsp;&nbsp; g_print ("One element could not be created\n");<BR>&nbsp;&nbsp;&nbsp;return -1;<BR>&nbsp; &nbsp; }<BR>&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;gst_bin_add_many (GST_BIN (audio), a_conv,a_resample,audiosink,NULL);<BR>&nbsp; &nbsp;gst_element_link_many (a_conv,a_resample,audiosink,NULL);<BR>&nbsp;<BR>&nbsp;//create ghost pad <BR>&nbsp;&nbsp; audiopad = gst_element_get_pad (a_conv, "sink");<BR>&nbsp; &nbsp;gst_element_add_pad (audio,gst_ghost_pad_new ("sink", audiopad));<BR>&nbsp; &nbsp;gst_bin_add (GST_BIN (pipeline), audio);</DIV>
<DIV>&nbsp; //link a_dec with audio out bin<BR>&nbsp;gst_pad_link (gst_element_get_pad (a_dec, "src"),audiopad );</DIV>
<DIV>&nbsp;gst_object_unref (audiopad);<BR>&nbsp; <BR>&nbsp;&nbsp; ret = gst_element_set_state (audio, GST_STATE_PLAYING);<BR>&nbsp;&nbsp; if (ret != GST_STATE_CHANGE_SUCCESS)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;g_printf("\nset audio out state : change state Expection!\n");</DIV>
<DIV><BR>//video process.......<BR>//....</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret = gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);<BR>&nbsp; if (ret != GST_STATE_CHANGE_SUCCESS)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_printf("\nset pipeline bin state : change state Expection!\n");<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp; return 0;</DIV>
<DIV>}</DIV>
<DIV><BR>static void new_pad (GstElement *element, GstPad *pad, gpointer data)<BR>{<BR>&nbsp;&nbsp;&nbsp; GstPad *srcpad;<BR>&nbsp;&nbsp;&nbsp; g_print ("Dynamic pad created, linking demuxer and a_queue\n");<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; srcpad = gst_element_get_pad (a_queue, "sink");<BR>&nbsp;&nbsp;&nbsp; gst_pad_link (pad, srcpad);<BR>&nbsp; <BR>&nbsp;&nbsp;&nbsp; gst_object_unref (srcpad);<BR>&nbsp;}</DIV>
<DIV>&nbsp;</DIV>
<DIV>static void new_pad2 (GstElement *element, GstPad *pad, gpointer data)<BR>{<BR>&nbsp;&nbsp;&nbsp; GstPad *srcpad;<BR>&nbsp;&nbsp;&nbsp; g_print ("Dynamic pad created, linking demuxer and v_queue\n");<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; srcpad = gst_element_get_pad (v_queue, "sink");<BR>&nbsp;&nbsp;&nbsp; gst_pad_link (pad, srcpad);<BR>&nbsp; <BR>&nbsp;&nbsp;&nbsp; gst_object_unref (srcpad);<BR>&nbsp;}</DIV>
<DIV>&nbsp;</DIV>
<DIV>static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)<BR>{<BR>&nbsp; GMainLoop *loop = data;</DIV>
<DIV>&nbsp; switch (GST_MESSAGE_TYPE (msg))<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; case GST_MESSAGE_EOS:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_print ("End-of-stream\n");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_main_loop_quit (loop);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<BR>&nbsp;&nbsp;&nbsp; case GST_MESSAGE_ERROR:<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gchar *debug;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GError *err;</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gst_message_parse_error (msg, &amp;err, &amp;debug);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_free (debug);</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_print ("Error: %s\n", err-&gt;message);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_error_free (err);</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g_main_loop_quit (loop);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; default:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<BR>&nbsp; }</DIV>
<DIV>&nbsp; return TRUE;<BR>}<BR></DIV>
<DIV>&nbsp;</DIV><br><!-- footer --><br> 
<hr>
<font style="font-size:12px;line-height:15px;">独有“账号保险柜”保护密码,</font><a style="font-size:12px;line-height:15px; color:blue; text-decoration:underline;" href="http://adclient.163.com/event.ng/Type=click&FlightID=94603&AdID=96090&TargetID=1200&Values=31,43,51,60,72,85,91,100,110,312,332,499,587,701,702,733,734&Redirect=http://www.rising.com.cn/2008/trial/index.htm">“瑞星08版”开始免费</a>