Untitled
unknown
plain_text
a year ago
3.1 kB
11
Indexable
#include <gst/gst.h>
static void on_pad_added(GstElement *element, GstPad *pad, gpointer data) {
GstElement *decoder = (GstElement *)data;
GstPad *sink_pad = gst_element_get_static_pad(decoder, "sink");
GstCaps *caps = gst_pad_query_caps(pad, NULL);
const gchar *media_type = gst_structure_get_name(gst_caps_get_structure(caps, 0));
/* If our converter is already linked, we have nothing to do here */
if (gst_pad_is_linked (sink_pad)) {
g_print ("We are already linked. Ignoring.\n");
goto exit;
}
if (g_strrstr(media_type, "audio")) {
g_print("Audio media type detected\n");
GstPadLinkReturn ret = gst_pad_link(pad, sink_pad);
if (GST_PAD_LINK_FAILED(ret)) {
g_printerr("Failed to link audio pads\n");
} else {
g_print("Audio pads linked\n");
}
} else if (g_strrstr(media_type, "video")) {
g_print("Video media type detected\n");
// Handle video here, for now just print message
} else {
g_print("Unsupported media type\n");
}
exit:
gst_object_unref(sink_pad);
gst_caps_unref(caps);
}
int main(int argc, char *argv[]) {
GMainLoop *loop;
GstElement *pipeline, *source, *decoder, *audio_convert, *audio_sink, *video_convert, *encoder, *pay, *video_sink;
gst_init(NULL, NULL);
loop = g_main_loop_new(NULL, FALSE);
if (argc != 2) {
g_printerr("Usage: %s <filename>\n", argv[0]);
return -1;
}
pipeline = gst_pipeline_new("audio-video-player");
source = gst_element_factory_make("filesrc", "file-source");
decoder = gst_element_factory_make("decodebin", "decoder");
gst_bin_add_many(GST_BIN(pipeline), source, decoder, NULL);
gst_element_link(source, decoder);
g_signal_connect(decoder, "pad-added", G_CALLBACK(on_pad_added), decoder);
audio_convert = gst_element_factory_make("audioconvert", "audio-convert");
audio_sink = gst_element_factory_make("autoaudiosink", "audio-output");
video_convert = gst_element_factory_make("videoconvert", "video-convert");
encoder = gst_element_factory_make("x264enc", "encoder");
pay = gst_element_factory_make("rtph264pay", "payloader");
video_sink = gst_element_factory_make("udpsink", "udp-output");
g_object_set(video_sink, "host", "127.0.0.1", "port", 5000, NULL);
gst_bin_add_many(GST_BIN(pipeline), audio_convert, audio_sink, video_convert, encoder, pay, video_sink, NULL);
gst_element_link_many(audio_convert, audio_sink, NULL);
gst_element_link_many(video_convert, encoder, pay, video_sink, NULL);
g_object_set(source, "location", argv[1], NULL);
if (gst_element_set_state(pipeline, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) {
g_printerr("Unable to set the pipeline to the playing state.\n");
gst_object_unref(pipeline);
return -1;
}
g_main_loop_run(loop);
gst_element_set_state(pipeline, GST_STATE_NULL);
gst_object_unref(pipeline);
g_main_loop_unref(loop);
return 0;
}Editor is loading...
Leave a Comment