<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Verdana
}
</style>
</head>
<body class='hmmessage'>
I think your problem is this: <br><br>The queues should be between the demuxer and the decoder. I see that you put them between the decoder and the audioconvert(for the audio stream). The pipeline linkage should look like src-&gt;demuxer-&gt;queuea-&gt;decodera-&gt;convert-&gt;resample-&gt;sinka<br>src-&gt;demuxer-&gt;queuev-&gt;decoderv-&gt;sinkv<br><br>&gt; Date: Thu, 23 Apr 2009 08:31:41 -0700<br>&gt; From: alavariega@dextratech.com<br>&gt; To: gstreamer-devel@lists.sourceforge.net<br>&gt; Subject: Re: [gst-devel] play audio and video simultaneously<br>&gt; <br>&gt; <br>&gt; The "mad" element doesn't have dynamic pads, so it doesn't emit a "pad-added"<br>&gt; signal. You can connect it directly to "audioconvert".<br>&gt; <br>&gt; Also I see that you declare "queueV" as a "GstElement**" and not as a<br>&gt; "GstElement*".<br>&gt; <br>&gt; <br>&gt; Hi Sledge, thanks for your reply!<br>&gt; <br>&gt; I have already made the corresponding changes and still not activated the<br>&gt; signal that link the video decoder with the respective queue. when i execute<br>&gt; the application this is the result:<br>&gt; <br>&gt; ** (testvideop:6043): DEBUG: Signal: pad-added<br>&gt; on_pad_added: audio/mpeg<br>&gt; ** (testvideop:6043): DEBUG: Linking audio pad to decodera<br>&gt; The audio pad src was linked<br>&gt; ** (testvideop:6043): DEBUG: Signal: pad-added<br>&gt; on_pad_added: video/mpeg<br>&gt; ** (testvideop:6043): DEBUG: Linking video pad to decoderv<br>&gt; The video pad src was linked<br>&gt; <br>&gt; There are no more errors, but they are not playing the video and audio<br>&gt; streams simultaneously<br>&gt; <br>&gt; Thanks in advance for the help,<br>&gt; <br>&gt; Best Regards,<br>&gt; <br>&gt; Alberto.<br>&gt; <br>&gt; <br>&gt; <br>&gt; #include&lt;gst/gst.h&gt;<br>&gt; <br>&gt; static gboolean bus_call (GstBus     *bus,  GstMessage *msg,   gpointer   <br>&gt; data);<br>&gt; static void on_pad_added (GstElement *element, GstPad *pad);<br>&gt; static void on_decpad_added(GstElement *element, GstPad *pad );<br>&gt; <br>&gt; GstElement *pipeline, *src, *demux, *decoderv, *sinkv, *decodera, *convert,<br>&gt; *resample, *sinka;<br>&gt; GstElement *queueA, *queueV;<br>&gt; <br>&gt; int main(int argc, char *argv[])<br>&gt;   {<br>&gt;    GstStateChangeReturn ret;<br>&gt;    GMainLoop *loop;<br>&gt;    GstBus *bus;<br>&gt;    /*initialization*/<br>&gt;    gst_init(&amp;argc,&amp;argv);<br>&gt;    loop = g_main_loop_new(NULL, FALSE);<br>&gt;    <br>&gt;    if(argc != 2)<br>&gt;      {<br>&gt;      g_print("Usage: %s &lt;mpg/mpeg video file&gt;", argv[0]);<br>&gt;      return -1;<br>&gt;      }<br>&gt; <br>&gt;     pipeline = gst_pipeline_new("VIDEO PLAYER");<br>&gt;     bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));<br>&gt;     gst_bus_add_watch(bus, bus_call, loop);<br>&gt; <br>&gt;     src = gst_element_factory_make("filesrc", "filesource");<br>&gt;     demux = gst_element_factory_make("dvddemux", "mpg-demux");<br>&gt;    <br>&gt;     /*Gstreamer video elements*/<br>&gt;     decoderv = gst_element_factory_make("mpeg2dec", "mpeg-decoder");<br>&gt;     sinkv = gst_element_factory_make("xvimagesink", "video-out");<br>&gt;     if(!decoderv || !sinkv)<br>&gt;      {<br>&gt;       g_print("\nthe video could not playback\n");<br>&gt;       return -1;<br>&gt;      }<br>&gt; <br>&gt;    /*Gstreamer audio elements*/<br>&gt; <br>&gt;    decodera = gst_element_factory_make("mad", "decoder-audio");<br>&gt;    convert = gst_element_factory_make("audioconvert", "a-convert");<br>&gt;    resample = gst_element_factory_make("audioresample", "a-resample");<br>&gt;    sinka = gst_element_factory_make("osssink", "play audio");<br>&gt;    if(!decodera || !convert || !resample || !sinka)<br>&gt;      {<br>&gt;       g_print("\nthe audio could not playback\n");<br>&gt;       return -1;<br>&gt;      }<br>&gt;    <br>&gt;    queueA = gst_element_factory_make("queue", "queue-audio");<br>&gt;    queueV = gst_element_factory_make("queue", "queue-video");<br>&gt; <br>&gt;    g_object_set (G_OBJECT (src), "location", argv[1], NULL);<br>&gt;    gst_bin_add_many(GST_BIN(pipeline), src, demux, decoderv,<br>&gt; queueV,sinkv,decodera,convert, resample, sinka, NULL);<br>&gt;   <br>&gt;    gst_element_link (src, demux);<br>&gt;    gst_element_link (queueV, sinkv);<br>&gt;   // gst_element_link (queueA, convert);<br>&gt;    gst_element_link (decodera, convert);<br>&gt;    gst_element_link (convert, resample);<br>&gt;    gst_element_link (resample, sinka);<br>&gt; <br>&gt;    g_signal_connect (demux, "pad-added",G_CALLBACK (on_pad_added), NULL);<br>&gt;    //g_signal_connect (decodera,<br>&gt; "pad-added",G_CALLBACK(on_decpad_added),decodera);<br>&gt;    g_signal_connect (decoderv,<br>&gt; "pad-added",G_CALLBACK(on_decpad_added),decoderv);<br>&gt;   <br>&gt;  /* run */<br>&gt;    ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);<br>&gt;   <br>&gt;    if (ret == GST_STATE_CHANGE_FAILURE) <br>&gt;     {<br>&gt;      GstMessage *msg;<br>&gt; <br>&gt;      g_print ("Failed to start up pipeline!\n");<br>&gt; <br>&gt;      /* check if there is an error message with details on the bus */<br>&gt;      msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0);<br>&gt;      if (msg) {<br>&gt;        GError *err = NULL;<br>&gt;        g_print("\nDISPLAY ERROR:\n");<br>&gt;        gst_message_parse_error (msg, &amp;err, NULL);<br>&gt;        g_print ("ERROR: %s\n", err-&gt;message);<br>&gt;        g_error_free (err);<br>&gt;        gst_message_unref (msg);<br>&gt;     }<br>&gt;     return -1;<br>&gt;   }<br>&gt; <br>&gt;    g_main_loop_run (loop);<br>&gt; <br>&gt;   /* clean up */<br>&gt;    gst_element_set_state (pipeline, GST_STATE_NULL);<br>&gt;    gst_object_unref (pipeline);<br>&gt; <br>&gt;    return 0;<br>&gt; <br>&gt;   }<br>&gt; <br>&gt; <br>&gt; static gboolean bus_call (GstBus     *bus,  GstMessage *msg,   gpointer   <br>&gt; data)<br>&gt; {<br>&gt;   GMainLoop *loop = data;<br>&gt; <br>&gt;   switch (GST_MESSAGE_TYPE (msg)) {<br>&gt;     case GST_MESSAGE_EOS:<br>&gt;       g_print ("End-of-stream\n");<br>&gt;       g_main_loop_quit (loop);<br>&gt;       break;<br>&gt;     case GST_MESSAGE_ERROR: {<br>&gt;       gchar *debug = NULL;<br>&gt;       GError *err = NULL;<br>&gt; <br>&gt;       gst_message_parse_error (msg, &amp;err, &amp;debug);<br>&gt; <br>&gt;       g_print ("Error: %s\n", err-&gt;message);<br>&gt;       g_error_free (err);<br>&gt; <br>&gt;       if (debug) {<br>&gt;         g_print ("Debug details: %s\n", debug);<br>&gt;         g_free (debug);<br>&gt;       }<br>&gt; <br>&gt;       g_main_loop_quit (loop);<br>&gt;       break;<br>&gt;     }<br>&gt;     default:<br>&gt;       break;<br>&gt;   }<br>&gt; <br>&gt;   return TRUE;<br>&gt; }<br>&gt; <br>&gt; <br>&gt; static void on_decpad_added(GstElement *element, GstPad *pad )<br>&gt; {<br>&gt;     g_debug ("Signal: decoder pad-added");<br>&gt;     GstCaps *caps;<br>&gt;     GstStructure *str;<br>&gt;     GstPad *targetsink;<br>&gt;     caps = gst_pad_get_caps (pad);<br>&gt;     g_assert (caps != NULL);<br>&gt;     str = gst_caps_get_structure (caps, 0);<br>&gt;     g_assert (str != NULL);<br>&gt; <br>&gt;         g_debug ("Linking decoder to QUEUE pad ");<br>&gt;         // Link it actually<br>&gt;         //element = (element == decodera ? queueA : queueV);<br>&gt;         targetsink = gst_element_get_pad ( queueV, "sink");<br>&gt;         g_assert (targetsink != NULL);<br>&gt;         gst_pad_link (pad, targetsink);        <br>&gt;         if (gst_pad_is_linked(pad))<br>&gt;             g_print("The decoder pad src was linked\n");<br>&gt;         else<br>&gt;            g_print("The stream:%s pad src was<br>&gt; linked\n",gst_pad_get_name(pad));<br>&gt;         gst_object_unref (targetsink);<br>&gt;         gst_caps_unref (caps);<br>&gt; }<br>&gt; <br>&gt; static void on_pad_added (GstElement *element, GstPad *pad)<br>&gt; {<br>&gt;         g_debug ("Signal: pad-added");<br>&gt;         GstCaps *caps;<br>&gt;         GstStructure *str;<br>&gt; <br>&gt;         caps = gst_pad_get_caps (pad);<br>&gt;         g_assert (caps != NULL);<br>&gt;         str = gst_caps_get_structure (caps, 0);<br>&gt;         g_assert (str != NULL);<br>&gt; <br>&gt;         const gchar *c = gst_structure_get_name(str);<br>&gt;         g_print("on_pad_added: %s\n",c);<br>&gt;         if (g_strrstr (c, "video") || g_strrstr (c, "image")) {<br>&gt;                 g_debug ("Linking video pad to decoderv");<br>&gt;                 // Link it actually<br>&gt;                 GstPad *targetsink = gst_element_get_pad (decoderv, "sink");              <br>&gt;                 g_assert (targetsink != NULL);<br>&gt;                 //g_print("\nVIDEO--pad source: %s\n",<br>&gt; gst_pad_get_name(pad));<br>&gt;                 //g_print("\nVIDEO--pad sink: %s\n",<br>&gt; gst_pad_get_name(targetsink));<br>&gt;                 gst_pad_link (pad, targetsink);<br>&gt;                 if (gst_pad_is_linked(pad))<br>&gt;                   g_print("The video pad src was linked\n");<br>&gt;                 gst_object_unref (targetsink);<br>&gt;         }<br>&gt; <br>&gt;         if (g_strrstr (c, "audio")) {<br>&gt;                 g_debug ("Linking audio pad to decodera");<br>&gt;                 // Link it actually<br>&gt;                 GstPad *targetsink = gst_element_get_pad (decodera, "sink");<br>&gt;                 g_assert (targetsink != NULL);<br>&gt;                 //g_print("\nAUDIO--pad source: %s\n",<br>&gt; gst_pad_get_name(pad));<br>&gt;                 //g_print("\nAUDIO--pad sink: %s\n",<br>&gt; gst_pad_get_name(targetsink));<br>&gt;                 gst_pad_link (pad, targetsink);<br>&gt;                 if (gst_pad_is_linked(pad))<br>&gt;                   g_print("The audio pad src was linked\n");<br>&gt;                 gst_object_unref (targetsink);<br>&gt;         }<br>&gt; <br>&gt;         gst_caps_unref (caps);<br>&gt; }<br>&gt; <br>&gt; <br>&gt; <br>&gt; <br>&gt; -- <br>&gt; View this message in context: http://www.nabble.com/play-audio-and-video-simultaneously-tp23175849p23197413.html<br>&gt; Sent from the GStreamer-devel mailing list archive at Nabble.com.<br>&gt; <br>&gt; <br>&gt; ------------------------------------------------------------------------------<br>&gt; Stay on top of everything new and different, both inside and <br>&gt; around Java (TM) technology - register by April 22, and save<br>&gt; $200 on the JavaOne (SM) conference, June 2-5, 2009, San Francisco.<br>&gt; 300 plus technical and hands-on sessions. Register today. <br>&gt; Use priority code J9JMT32. http://p.sf.net/sfu/p<br>&gt; _______________________________________________<br>&gt; gstreamer-devel mailing list<br>&gt; gstreamer-devel@lists.sourceforge.net<br>&gt; https://lists.sourceforge.net/lists/listinfo/gstreamer-devel<br><br /><hr />Σύρετε φωτογραφίες στο παράθυρο του Messenger. Δείτε πώς. <a href='http://download.live.com/messenger ' target='_new'>Κάντε κλικ εδώ!</a></body>
</html>