[gst-devel] play audio and video simultaneously

sledge hammer sledgehammer_999 at hotmail.com
Mon Apr 27 19:25:12 CEST 2009


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

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

_________________________________________________________________
Σύρετε φωτογραφίες στο παράθυρο του Messenger. Δείτε πώς.
http://download.live.com/messenger 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20090427/f0ae237b/attachment.htm>


More information about the gstreamer-devel mailing list