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> |
Free forum by Nabble | Edit this page |