Video and Audio streaming

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Video and Audio streaming

clust3r
Hi all, I'm a n00b in Gstreamer devel..
I wrote a very simple code that creates different pipelines in order to trasmit audio and video from source video and audio.
now I need to merge and syncronize audio and video ,  in 1 pipeline, but I have no idea, how to do this.... please help..!! :-)

<code>
#include <gst/gst.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
static GMainLoop *loop;
 
static gboolean bus_call(GstBus *bus, GstMessage *msg, void *user_data)
{
        switch (GST_MESSAGE_TYPE(msg)) {
        case GST_MESSAGE_EOS: {
                g_message("End-of-stream");
                g_main_loop_quit(loop);
                break;
        }
        case GST_MESSAGE_ERROR: {
                GError *err;
                gst_message_parse_error(msg, &err, NULL);
                g_error("%s", err->message);
                g_error_free(err);
 
                g_main_loop_quit(loop);
                break;
        }
        default:
                break;
        }
 
        return true;
}
 
static void play_uri(const char *uri)
{
        GstElement *pipeline;
        GstBus *bus;
 
        loop = g_main_loop_new(NULL, FALSE);
        pipeline = gst_element_factory_make("playbin", "player");
 
        if (uri)
                g_object_set(G_OBJECT(pipeline), "uri", uri, NULL);
 
        bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
        gst_bus_add_watch(bus, bus_call, NULL);
        gst_object_unref(bus);
 
        gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_PLAYING);
 
        g_main_loop_run(loop);
 
        gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_NULL);
        gst_object_unref(GST_OBJECT(pipeline));
}

static void stream (void)
{
        GstElement *video_pipeline, *video_source, *video_encoder, *video_payload, *video_sink;
        GstElement *audio_pipeline_tx, *audio_source, *audio_encoder, *audio_payload, *audio_tx;
        GstElement *audio_pipeline_rx, *audio_rx, *audio_depayload, *audio_decoder, *audio_sink;
        GstBus *video_bus;
        GstBus *audio_tx_bus, *audio_rx_bus;
        GstCaps *rx_caps;
 
        loop = g_main_loop_new(NULL, FALSE);
       
        /*
         * VIDEO PIPELINE
         */
        video_pipeline = gst_pipeline_new("test-video-stream");
        g_assert (video_pipeline);
       
        video_source = gst_element_factory_make("mfw_v4lsrc", "video_source");
        video_encoder = gst_element_factory_make("mfw_vpuencoder", "video_encoder");
        video_payload = gst_element_factory_make("rtph264pay","video_payload");
        video_sink = gst_element_factory_make("udpsink","video_sink");
       
        g_object_set(G_OBJECT(video_source), "capture-width", 352, NULL);
        g_object_set(G_OBJECT(video_source), "capture-height", 288, NULL);

        g_object_set(G_OBJECT(video_encoder), "codec-type", 2, NULL);
        g_object_set(G_OBJECT(video_encoder), "width", 352, NULL);
        g_object_set(G_OBJECT(video_encoder), "height", 288, NULL);
        g_object_set(G_OBJECT(video_encoder), "loopback", FALSE, NULL);

        g_object_set(G_OBJECT(video_sink), "host", "192.168.3.140", NULL);
        g_object_set(G_OBJECT(video_sink), "port", 5500, NULL);
       
       
        video_bus = gst_pipeline_get_bus(GST_PIPELINE(video_pipeline));
        gst_bus_add_watch(video_bus, bus_call, NULL);
        gst_object_unref(video_bus);
 
        gst_bin_add_many(GST_BIN(video_pipeline), video_source, video_encoder,
                        video_payload, video_sink, NULL);

        gst_element_link_many(video_source, video_encoder, video_payload, video_sink, NULL);
       
        /*
         * AUDIO PIPELINE
         */
        audio_pipeline_tx = gst_pipeline_new("audio_tx");
        g_assert(audio_pipeline_tx);

        audio_source = gst_element_factory_make("alsasrc", "audio_source");
        audio_encoder = gst_element_factory_make("mulawenc", "audio_encoder");
        audio_payload = gst_element_factory_make("rtppcmupay","audio_payload");
        audio_tx = gst_element_factory_make("udpsink","audio_tx");
       
        g_object_set(G_OBJECT(audio_tx), "host", "192.168.3.140", NULL);
        g_object_set(G_OBJECT(audio_tx), "port", 5600, NULL);
       
        audio_tx_bus = gst_pipeline_get_bus(GST_PIPELINE(audio_pipeline_tx));
        gst_bus_add_watch(audio_tx_bus, bus_call, NULL);
        gst_object_unref(audio_tx_bus);
 
        gst_bin_add_many(GST_BIN(audio_pipeline_tx), audio_source, audio_encoder,
                        audio_payload, audio_tx, NULL);

        gst_element_link_many(audio_source, audio_encoder, audio_payload, audio_tx, NULL);
       
        // __________________________________________ //

        audio_pipeline_rx = gst_pipeline_new("audio_rx");
       
        audio_rx = gst_element_factory_make("udpsrc", "audio_receive");
        audio_depayload = gst_element_factory_make("rtppcmudepay", "audio_depayload");
        audio_decoder = gst_element_factory_make("mulawdec", "audio_decoder");
        audio_sink = gst_element_factory_make("alsasink", "audio_sink");
       
        rx_caps = gst_caps_new_simple("application/x-rtp",
                                "media", G_TYPE_STRING, "audio",
                                "clock-rate", G_TYPE_INT, 8000,
                                "encoding-name", G_TYPE_STRING, "PCMU",
                                NULL);

        g_object_set(G_OBJECT(audio_rx), "port", 5600, NULL);
        g_object_set (G_OBJECT (audio_rx), "caps", rx_caps, NULL);
        gst_caps_unref (rx_caps);
       
        audio_rx_bus = gst_pipeline_get_bus(GST_PIPELINE(audio_pipeline_rx));
        gst_bus_add_watch(audio_rx_bus, bus_call, NULL);
        gst_object_unref(audio_rx_bus);
 
        gst_bin_add_many(GST_BIN(audio_pipeline_rx), audio_rx, audio_depayload,
                        audio_decoder, audio_sink, NULL);

        gst_element_link_many(audio_rx, audio_depayload, audio_decoder, audio_sink, NULL);

        /*
         * TEST
         */
        srcpad = gst_element_get_static_pad (rtpsrc, "src");
        sinkpad = gst_element_get_request_pad (rtpbin, "recv_rtp_sink_0");
        lres = gst_pad_link (srcpad, sinkpad);
        g_assert (lres == GST_PAD_LINK_OK);
        gst_object_unref (srcpad);
       
        ///



        /*
         * PLAY
         */
        gst_element_set_state(GST_ELEMENT(video_pipeline), GST_STATE_PLAYING);
        gst_element_set_state(GST_ELEMENT(audio_pipeline_tx), GST_STATE_PLAYING);
        gst_element_set_state(GST_ELEMENT(audio_pipeline_rx), GST_STATE_PLAYING);
 
        g_main_loop_run(loop);
 
        gst_element_set_state(GST_ELEMENT(video_pipeline), GST_STATE_NULL);
        gst_object_unref(GST_OBJECT(video_pipeline));
        gst_element_set_state(GST_ELEMENT(audio_pipeline_tx), GST_STATE_NULL);
        gst_object_unref(GST_OBJECT(audio_pipeline_tx));
        gst_element_set_state(GST_ELEMENT(audio_pipeline_rx), GST_STATE_NULL);
        gst_object_unref(GST_OBJECT(audio_pipeline_rx));

}
 
int main(int argc, char *argv[])
{
        gst_init(&argc, &argv);
        stream();
        //play_uri(argv[1]);
        return 0;
}
</code>