ffmpeg – Streaming two camera to youtube or twitch using rtmp. But i am getting error in setting up two camera in gstreamer
#include <gst/gst.h>
static GMainLoop *loop;
GstElement *pipeline, *v4l2src1, *v4l2src2, *input_selector, *videoconvert, *x264enc, *h264parse, *flvmux, *rtmpsink,
*alsasrc, *audioconvert, *avenc_aac, *aacparse, *capsfilter;
int main(int argc, char *argv[]) {
gst_init(&argc, &argv);
loop = g_main_loop_new(NULL, FALSE);
pipeline = gst_pipeline_new("multi-camera-stream");
v4l2src1 = gst_element_factory_make("v4l2src", "source1");
v4l2src2 = gst_element_factory_make("v4l2src", "source2");
input_selector = gst_element_factory_make("input-selector", "selector");
videoconvert = gst_element_factory_make("videoconvert", "videoconvert");
x264enc = gst_element_factory_make("x264enc", "x264enc");
h264parse = gst_element_factory_make("h264parse", "h264parse");
flvmux = gst_element_factory_make("flvmux", "flvmux");
rtmpsink = gst_element_factory_make("rtmpsink", "rtmpsink");
alsasrc = gst_element_factory_make("alsasrc", "alsasrc");
audioconvert = gst_element_factory_make("audioconvert", "audioconvert");
avenc_aac = gst_element_factory_make("avenc_aac", "avenc_aac");
aacparse = gst_element_factory_make("aacparse", "aacparse");
capsfilter = gst_element_factory_make("capsfilter", "capsfilter");
// Check if elements were created successfully
if (!pipeline || !v4l2src1 || !v4l2src2 || !input_selector || !videoconvert || !x264enc || !h264parse || !flvmux ||
!rtmpsink || !alsasrc || !audioconvert || !avenc_aac || !aacparse || !capsfilter) {
g_printerr("Not all elements could be created.\n");
return -1;
}
// Set the input source for video and audio
g_object_set(G_OBJECT(v4l2src1), "device", "/dev/video4", NULL);
g_object_set(G_OBJECT(v4l2src2), "device", "/dev/video0", NULL);
g_object_set(G_OBJECT(alsasrc), "device", "hw:0", NULL);
// Set the location for RTMP sink
g_object_set(G_OBJECT(rtmpsink), "location", "rtmp://live.twitch.tv/app/{your_stream_key}", NULL);
g_object_set(G_OBJECT(x264enc), "bitrate", 4000, NULL);
g_object_set(G_OBJECT(x264enc), "key-int-max", 30, NULL);
g_object_set(G_OBJECT(x264enc), "speed-preset", 1, NULL);
g_object_set(G_OBJECT(x264enc), "tune", 4, NULL);
// Set audio-related properties
g_object_set(G_OBJECT(avenc_aac), "bitrate", 128000, NULL);
// Set video caps for the capsfilter
GstCaps *caps = gst_caps_new_simple("video/x-raw",
"format", G_TYPE_STRING, "I420",
"framerate", GST_TYPE_FRACTION, 30, 1,
NULL);
g_object_set(G_OBJECT(capsfilter), "caps", caps, NULL);
g_object_set(G_OBJECT(input_selector), "active-pad", gst_element_get_request_pad(v4l2src2, "src_%u"), NULL);
gst_bin_add_many(GST_BIN(pipeline), v4l2src1, v4l2src2, input_selector, videoconvert, x264enc, h264parse, flvmux,
rtmpsink, alsasrc, audioconvert, avenc_aac, aacparse, capsfilter, NULL);
gst_element_link_many(v4l2src1, videoconvert, input_selector, NULL);
gst_element_link_many(v4l2src2, videoconvert, input_selector, NULL);
gst_element_link_many(input_selector, x264enc, h264parse, flvmux, rtmpsink, NULL);
gst_element_link_many(alsasrc, audioconvert, avenc_aac, aacparse, flvmux, NULL);
g_print("Press '1' to switch to Camera 1 and '2' to switch to Camera 2.\n");
gst_element_set_state(pipeline, GST_STATE_PLAYING);
g_main_loop_run(loop);
gst_element_set_state(pipeline, GST_STATE_NULL);
gst_object_unref(GST_OBJECT(pipeline));
g_main_loop_unref(loop);
return 0;
}
- please use your rtmp url and key
above code will not go live but no error i am getting. But if you change or keep only one v4l2src either 1 or 2 but not both together in gst_bin_add_many it will go live one camera. SO my question is that why it is happeing so code look good to me. PLease solve my issue.
i am using 1.16.3 gstreamer version. i have tried a lot but could not solve it.
Read more here: Source link
