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