diff --git a/test-record/.gitignore b/test-record/.gitignore new file mode 100644 index 0000000..ba2906d --- /dev/null +++ b/test-record/.gitignore @@ -0,0 +1 @@ +main diff --git a/test-record/Makefile b/test-record/Makefile index 7d2f1b0..2f4ffc1 100644 --- a/test-record/Makefile +++ b/test-record/Makefile @@ -7,3 +7,4 @@ build: clean: rm -f myprog + rm -f *.mp4 diff --git a/test-record/main b/test-record/main index b306b2e..79fe43e 100755 Binary files a/test-record/main and b/test-record/main differ diff --git a/test-record/main.c b/test-record/main.c index 22c45c0..8774138 100644 --- a/test-record/main.c +++ b/test-record/main.c @@ -1,109 +1,146 @@ #include -#include #include -#include #include +#include +#include +#include -// gst-launch-1.0 v4l2src ! x264enc ! mp4mux ! filesink location=/home/rish/Desktop/okay.264 -e +// gst-launch-1.0 v4l2src ! x264enc ! mp4mux ! filesink +// location=/home/rish/Desktop/okay.264 -e static GMainLoop *loop; -static GstElement *pipeline, *src, *convert, *encoder, *muxer, *sink; +static GstElement *pipeline, *src, *convert, *encoder, *muxer, *sink, *video_queue; +static GstElement *alsa_src, *audio_queue, *audio_convert, *audio_resample, + *audio_encoder, *audio_parse; static GstBus *bus; -static gboolean -message_cb (GstBus * bus, GstMessage * message, gpointer user_data) -{ - switch (GST_MESSAGE_TYPE (message)) { - case GST_MESSAGE_ERROR:{ - GError *err = NULL; - gchar *name, *debug = NULL; +static gboolean message_cb(GstBus *bus, GstMessage *message, + gpointer user_data) { + switch (GST_MESSAGE_TYPE(message)) { + case GST_MESSAGE_ERROR: { + GError *err = NULL; + gchar *name, *debug = NULL; - name = gst_object_get_path_string (message->src); - gst_message_parse_error (message, &err, &debug); + name = gst_object_get_path_string(message->src); + gst_message_parse_error(message, &err, &debug); - g_printerr ("ERROR: from element %s: %s\n", name, err->message); - if (debug != NULL) - g_printerr ("Additional debug info:\n%s\n", debug); + g_printerr("ERROR: from element %s: %s\n", name, err->message); + if (debug != NULL) + g_printerr("Additional debug info:\n%s\n", debug); - g_error_free (err); - g_free (debug); - g_free (name); + g_error_free(err); + g_free(debug); + g_free(name); - g_main_loop_quit (loop); - break; - } - case GST_MESSAGE_WARNING:{ - GError *err = NULL; - gchar *name, *debug = NULL; + g_main_loop_quit(loop); + break; + } + case GST_MESSAGE_WARNING: { + GError *err = NULL; + gchar *name, *debug = NULL; - name = gst_object_get_path_string (message->src); - gst_message_parse_warning (message, &err, &debug); + name = gst_object_get_path_string(message->src); + gst_message_parse_warning(message, &err, &debug); - g_printerr ("ERROR: from element %s: %s\n", name, err->message); - if (debug != NULL) - g_printerr ("Additional debug info:\n%s\n", debug); + g_printerr("ERROR: from element %s: %s\n", name, err->message); + if (debug != NULL) + g_printerr("Additional debug info:\n%s\n", debug); - g_error_free (err); - g_free (debug); - g_free (name); - break; - } - case GST_MESSAGE_EOS:{ - g_print ("Got EOS\n"); - g_main_loop_quit (loop); - gst_element_set_state (pipeline, GST_STATE_NULL); - g_main_loop_unref (loop); - gst_object_unref (pipeline); - exit(0); - break; - } - default: - break; + g_error_free(err); + g_free(debug); + g_free(name); + break; + } + case GST_MESSAGE_EOS: { + g_print("Got EOS\n"); + g_main_loop_quit(loop); + gst_element_set_state(pipeline, GST_STATE_NULL); + g_main_loop_unref(loop); + gst_object_unref(pipeline); + exit(0); + break; + } + default: + break; } return TRUE; } int sigintHandler(int unused) { - g_print("You ctrl-c-ed! Sending EoS"); - gst_element_send_event(pipeline, gst_event_new_eos()); - return 0; + g_print("You ctrl-c-ed! Sending EoS"); + gst_element_send_event(pipeline, gst_event_new_eos()); + return 0; } -int main(int argc, char *argv[]) -{ - signal(SIGINT, sigintHandler); - gst_init (&argc, &argv); +int main(int argc, char *argv[]) { + signal(SIGINT, sigintHandler); + gst_init(&argc, &argv); - pipeline = gst_pipeline_new(NULL); - src = gst_element_factory_make("v4l2src", NULL); + pipeline = gst_pipeline_new(NULL); + src = gst_element_factory_make("v4l2src", NULL); convert = gst_element_factory_make("videoconvert", NULL); - encoder = gst_element_factory_make("x264enc", NULL); - muxer = gst_element_factory_make("mp4mux", NULL); - sink = gst_element_factory_make("filesink", NULL); + video_queue = gst_element_factory_make("queue", NULL); + encoder = gst_element_factory_make("vaapih264enc", NULL); - if (!pipeline || !src || !convert || !encoder || !muxer || !sink) { - g_error("Failed to create elements"); - return -1; - } + muxer = gst_element_factory_make("mp4mux", NULL); + sink = gst_element_factory_make("filesink", NULL); - g_object_set(sink, "location", "/home/talksik/code/gstreamer-tests/test-record/out.mp4", NULL); - gst_bin_add_many(GST_BIN(pipeline), src, convert, encoder, muxer, sink, NULL); - if (!gst_element_link_many(src, convert, encoder, muxer, sink, NULL)){ - g_error("Failed to link elements"); - return -2; - } + alsa_src = gst_element_factory_make("alsasrc", NULL); + audio_queue = gst_element_factory_make("queue", NULL); + audio_convert = gst_element_factory_make("audioconvert", NULL); + audio_resample = gst_element_factory_make("audioresample", NULL); + audio_encoder = gst_element_factory_make("voaacenc", NULL); + audio_parse = gst_element_factory_make("aacparse", NULL); - loop = g_main_loop_new(NULL, FALSE); + if (!pipeline || !src || !convert || !encoder || !muxer || !sink) { + g_error("Failed to create video elements"); + return -1; + } - bus = gst_pipeline_get_bus(GST_PIPELINE (pipeline)); - gst_bus_add_signal_watch(bus); - g_signal_connect(G_OBJECT(bus), "message", G_CALLBACK(message_cb), NULL); - gst_object_unref(GST_OBJECT(bus)); + if (!alsa_src || !audio_queue || !audio_convert || !audio_resample || + !audio_encoder || !audio_parse) { + g_error("Failed to create audio elements"); + return -1; + } - gst_element_set_state(pipeline, GST_STATE_PLAYING); + g_object_set(sink, "location", "./out.mp4", "sync", false, NULL); + gst_bin_add_many(GST_BIN(pipeline), + src, + video_queue, + convert, + encoder, + muxer, + sink, + alsa_src, + audio_queue, + audio_convert, + audio_resample, + audio_encoder, + audio_parse, + NULL); + if (!gst_element_link_many(src, convert, encoder, muxer, sink, NULL)) { + g_error("Failed to link video elements"); + return -2; + } - g_print("Starting loop"); - g_main_loop_run(loop); + if (!gst_element_link_many(alsa_src, audio_queue, audio_convert, + audio_resample, audio_encoder, audio_parse, muxer, + NULL)) { + g_error("Failed to link audio elements"); + return -2; + } - return 0; + loop = g_main_loop_new(NULL, FALSE); + + bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); + gst_bus_add_signal_watch(bus); + g_signal_connect(G_OBJECT(bus), "message", G_CALLBACK(message_cb), NULL); + gst_object_unref(GST_OBJECT(bus)); + + gst_element_set_state(pipeline, GST_STATE_PLAYING); + + g_print("Starting loop"); + g_main_loop_run(loop); + + return 0; } diff --git a/test-record/out.mp4 b/test-record/out.mp4 deleted file mode 100644 index c7c2b8c..0000000 Binary files a/test-record/out.mp4 and /dev/null differ