Skip to content

Instantly share code, notes, and snippets.

@Stanisbouts1
Created April 20, 2021 15:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Stanisbouts1/4928626e9d88e410c2972eac86660b3d to your computer and use it in GitHub Desktop.
Save Stanisbouts1/4928626e9d88e410c2972eac86660b3d to your computer and use it in GitHub Desktop.
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