Created
April 20, 2021 15:30
-
-
Save Stanisbouts1/4928626e9d88e410c2972eac86660b3d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void Streamer::setupPipeline() { | |
pStreamerData->video_switch = gst_element_factory_make("input-selector", "video_switch"); | |
g_object_set(G_OBJECT(pStreamerData->video_switch), "cache-buffers", TRUE, NULL); | |
pStreamerData->videoTee = gst_element_factory_make("tee", "videoTee"); | |
pStreamerData->twitchQueue = gst_element_factory_make("queue", "twitchQueue"); | |
pStreamerData->twitchsink = gst_element_factory_make("rtmpsink", "twitchsink"); | |
g_object_set(G_OBJECT(pStreamerData->twitchsink), "location", | |
"rtmp://live-cdg.twitch.tv/app/KEY", | |
NULL); | |
pStreamerData->mux = gst_element_factory_make("encodebin", "mux"); | |
pStreamerData->x264enc = gst_element_factory_make("x264enc", "x264enc"); | |
pStreamerData->flvmux = gst_element_factory_make("flvmux", "flvmux"); | |
g_object_set(G_OBJECT(pStreamerData->flvmux), "streamable", TRUE, NULL); | |
pStreamerData->imageoverlay = gst_element_factory_make("gdkpixbufoverlay","imageoverlay"); | |
g_object_set (pStreamerData->imageoverlay, "location", "images/Video1920-1080.png",NULL); | |
pStreamerData->textoverlay = gst_element_factory_make("textoverlay", "textoverlay"); | |
g_object_set (pStreamerData->textoverlay, "name", "textov",NULL); | |
g_object_set (pStreamerData->textoverlay, "text", "GStreamer rocks!",NULL); | |
g_object_set (pStreamerData->textoverlay, "valignment", 3,NULL); | |
g_object_set (pStreamerData->textoverlay, "halignment", 4,NULL); | |
g_object_set (pStreamerData->textoverlay, "deltay", -8,NULL); | |
g_object_set (pStreamerData->textoverlay, "font-desc", "NotoSansHK-Regular, 72",NULL); | |
gst_bin_add_many(GST_BIN(pStreamerData->pipeline), | |
pStreamerData->video_switch, | |
pStreamerData->textoverlay, | |
pStreamerData->imageoverlay, | |
pStreamerData->videoTee, | |
pStreamerData->twitchQueue, | |
pStreamerData->x264enc, | |
pStreamerData->flvmux, | |
pStreamerData->twitchsink, | |
NULL); | |
// for each camera in the config file | |
int i = 0; | |
for (Camera *camera : pStreamerData->cameras) | |
{ | |
camera->sinkIndex = i; | |
i++; | |
std::string Bin = "cameraBin" + std::to_string(i); | |
const char *cameraBinString = Bin.c_str(); | |
std::cout<<cameraBinString<<::std::endl; | |
GstElement *cameraBin = gst_bin_new(cameraBinString); | |
camera->createSrcElement(); | |
camera->setSrcLocation(); | |
GstElement *depayloader = gst_element_factory_make("rtph264depay", "depayloader"); | |
GstElement *decoder = gst_element_factory_make("h264parse", "decoder"); | |
GstElement *GstFlvMuxPad = gst_element_factory_make("flvmux", "GstFlvMuxPad"); | |
g_object_set(G_OBJECT(GstFlvMuxPad), "streamable", TRUE, NULL); | |
GstElement *sink_sync = gst_element_factory_make("identity", "sink_sync"); | |
g_object_set(G_OBJECT(sink_sync), "sync", TRUE, NULL); | |
gst_bin_add_many(GST_BIN(cameraBin), camera->source, depayloader, | |
decoder, GstFlvMuxPad, sink_sync, | |
NULL); | |
GstPad *camera_src_pad = gst_element_get_static_pad(sink_sync, "src"); | |
GstPad *ghost_pad = gst_ghost_pad_new("sink_1", camera_src_pad); | |
gst_pad_set_active (ghost_pad, TRUE); | |
gst_element_add_pad (cameraBin, ghost_pad); | |
gst_object_unref (camera_src_pad); | |
gst_bin_add_many(GST_BIN(pStreamerData->pipeline), GST_ELEMENT(cameraBin), NULL); | |
if (!gst_element_link_many(depayloader, decoder, GstFlvMuxPad, sink_sync, | |
NULL)) { | |
g_printerr("Basic Bin Elements could not be linked.\n"); | |
} | |
if (!gst_element_link(GST_ELEMENT(cameraBin), pStreamerData->video_switch)) { | |
g_printerr("Bin can not be linked to video switcher\n"); | |
} | |
g_signal_connect(camera->source, "pad-added", G_CALLBACK(on_pad_added), | |
depayloader); | |
} | |
// linking all the elements after the camera's | |
if (!gst_element_link(pStreamerData->video_switch, pStreamerData->imageoverlay)) { | |
g_printerr("imageoverlay could not be linked.\n"); | |
} | |
if (!gst_element_link(pStreamerData->imageoverlay, pStreamerData->textoverlay)) { | |
g_printerr("textoverlay could not be linked.\n"); | |
} | |
if (!gst_element_link(pStreamerData->textoverlay, pStreamerData->x264enc)) { | |
g_printerr("x264enc could not be linked.\n"); | |
} | |
if (!gst_element_link(pStreamerData->x264enc, pStreamerData->flvmux)) { | |
g_printerr("flvmux could not be linked.\n"); | |
} | |
if (!gst_element_link(pStreamerData->flvmux, pStreamerData->videoTee)) { | |
g_printerr("twitchQueue could not be linked.\n"); | |
} | |
if (!gst_element_link(pStreamerData->videoTee, pStreamerData->twitchQueue)) { | |
g_printerr("twitchsink could not be linked.\n"); | |
} | |
if (!gst_element_link(pStreamerData->twitchQueue, pStreamerData->twitchsink)) { | |
g_printerr("twitchsink could not be linked.\n"); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment