开发者

After pausing the gstreamer pipeline and make changes nothing was applied when get back to playing state?

开发者 https://www.devze.com 2023-04-06 13:48 出处:网络
The code below is to stream mpeg4 video (using v4l2src element of the following capabilities: width=640, height=480, frame rate=30/1) over a network using a updsink element and the capabilities values

The code below is to stream mpeg4 video (using v4l2src element of the following capabilities: width=640, height=480, frame rate=30/1) over a network using a updsink element and the capabilities values should change to (width=352, height=288, frame rate=15/1) after pressing "1" on the keyboard. I tried to do this by pausing the pipeline after the "1" is pressed and then re-setting the caps to the new values and then get the pipeline into playing state again but this did not work for me.

I get the caps values printed before pausing the pipeline and after the changes made and I can see that the changes to the caps were done but not applied when the pipeline is brought to playing state again ()

please help.......

you can playback this stream by typing into a new terminal the following command just before running the code below:

gst-launch udpsrc multicast-group=127.0.0.1 port=8999 ! mpeg4videoparse ! ffdec_mpeg4 ! ffmpegcolorspace ! autovideosink

======================

    #include <gst/gst.h>

    #include <glib.h>

    #include <stdio.h>

    #include <glib-object.h>




    static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)

    {

       GMainLoop *loop = (GMainLoop *) 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;

             GError *error;

             gst_message_parse_error (msg, &error, &debug);

             g_free (debug);

             g_printerr ("Error: %s\n", error->message);

             g_error_free (error);

             g_main_loop_quit (loop);

             break;

             }




         default: break;

         }

    return TRUE;

   }




int main (int argc, char *argv[])

{

   GMainLoop *loop;

   GstElement *pipeline, *source, *filter, *vrate, *encoder, *conv, *sink;

   GstBus *bus;

   GstCaps *filtercaps; 

   gint width, height, num, denom;

   const GstStructure *str;




   /* Initialisation */

   gst_init (&argc, &argv);

   loop = g_main_loop_new (NULL, FALSE);




   /* Check input arguments */

   if (argc != 2) {

     g_printerr ("Usage: %s <Ogg/Vorbis filename>\n", argv[0]);

     return -1;

   }




   /* Create gstreamer elements */

   pipeline = gst_pipeline_new ("video-player");

   source = gst_element_factory_make ("v4l2src", "file-source");

   vrate = gst_element_factory_make ("videorate", "video-rate");

   filter = gst_element_factory_make ("capsfilter", "filter");

   conv = gst_element_factory_make ("ffmpegcolorspace","converter");

   encoder = gst_element_factory_make ("ffenc_mpeg4","mpeg-decoder");

   sink = gst_element_factory_make ("udpsink","audio-output");







   if (!pipeline || !source || !filter || !vrate || !conv || !encoder || !sink) {

     g_printerr ("One element could not be created. Exiting.\n");

     return -1;

   }




   /* Set up the pipeline */

   /* we set the input filename to the source element */

   filtercaps = gst_caps_new_simple ("video/x-raw-yuv",

         "width", G_TYPE_INT, 640,

         "height", G_TYPE_INT, 480,

         "framerate", GST_TYPE_FRACTION, 30, 1,

         NULL);




   g_object_set (G_OBJECT (filter), "caps", filtercaps, NULL);

   gst_caps_unref (filtercaps);

   g_object_set (G_OBJECT (encoder), "bitrate" , 384 ,  NULL);

   g_object_set (G_OBJECT (sink), "host" , argv[1] ,  NULL);

   g_object_set (G_OBJECT (sink), "port" , 8999 ,  NULL);

   g_object_set (G_OBJECT (sink), "async" , FALSE ,  NULL);






   /* we add a message handler */

   bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));

   gst_bus_add_watch (bus, bus_call, loop);

   gst_object_unref (bus);




   /* we add all elements into the pipeline */

   /* file-source | ogg-demuxer | vorbis-decoder | converter | alsa-output */

   gst_bin_add_many (GST_BIN (pipeline), source, vrate, filter, conv, encoder, sink, NULL);




   /* we link the elements together */

   /* file-source -> ogg-demuxer ~> vorbis-decoder -> converter -> alsa-output */

   gst_element_link_many (source, vrate, filter, conv, encoder,  sink, NULL);









   /* Set the pipeline to "playing" state*/

   g_print ("Now playing: \n");

   gst_element_set_state (pipeline, GST_STATE_PLAYING);





   /* Print out the frame size and rate */

   str = gst_caps_get_structure (filtercaps, 0);

   if (!gst_structure_get_int (str, "width", &width) || !gst_structure_get_int (str, "height", &height) || 

       !gst_structure_get_fraction (str, "framerate", &num, &denom)) 

         g_print ("No width/height available\n");

   g_print ("The video size of this set of capabilities is %dx%d and the frame rate is %d/%d\n", width, height, num, denom);









   /* Pausing the streame */ 

   int in;

   if (scanf ("%d", &in) == 1){

     g_print ("Now pausing: \n");

     gst_element_set_state (pipeline, GST_STATE_PAUSED );



     g_assert (GST_STATE (pipeline) == GST_STATE_PAU开发者_Python百科SED);

     g_assert (GST_STATE (source) == GST_STATE_PAUSED);

     g_assert (GST_STATE (filter) == GST_STATE_PAUSED);

     g_assert (GST_STATE (vrate) == GST_STATE_PAUSED);

     g_assert (GST_STATE (encoder) == GST_STATE_PAUSED);

     g_assert (GST_STATE (conv) == GST_STATE_PAUSED);

     g_assert (GST_STATE (sink) == GST_STATE_PAUSED);






     /* apply the alterations to the caps now */

     gst_caps_set_simple (filtercaps, "width", G_TYPE_INT, 352, "height", G_TYPE_INT, 288, "framerate", GST_TYPE_FRACTION, 15, 1, NULL);    





         /* Print out the frame size and rate after alteration*/

     str = gst_caps_get_structure (filtercaps, 0);

        if (!gst_structure_get_int (str, "width", &width) || !gst_structure_get_int (str, "height", &height) || 

        !gst_structure_get_fraction (str, "framerate", &num, &denom)) 

         g_print ("No width/height available\n");

     g_print ("The video size of this set of capabilities is %dx%d and the frame rate is %d/%d\n", width, height, num, denom);  



     /* set back to playing */

     gst_element_set_state (pipeline, GST_STATE_PLAYING);




     g_assert (GST_STATE (pipeline) == GST_STATE_PLAYING);

     g_assert (GST_STATE (source) == GST_STATE_PLAYING);

     g_assert (GST_STATE (filter) == GST_STATE_PLAYING);

     g_assert (GST_STATE (vrate) == GST_STATE_PLAYING);

     g_assert (GST_STATE (encoder) == GST_STATE_PLAYING);

     g_assert (GST_STATE (conv) == GST_STATE_PLAYING);

     g_assert (GST_STATE (sink) == GST_STATE_PLAYING);  



     }






   /* Iterate */

   g_print ("Running...\n");

   g_main_loop_run (loop);





   /* Out of the main loop, clean up nicely */

   g_print ("Returned, stopping playback\n");

   gst_element_set_state (pipeline, GST_STATE_NULL);

   g_print ("Deleting pipeline\n");

   gst_object_unref (GST_OBJECT (pipeline));




   return 0;

}

Cheers.

Ibra


you miss the function of g_object_set(G_OBJECT(filter), "caps", filtercaps, NULL);

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号