Gstreamer Concat command line to code?

killerrats koreysjunkmail at gmail.com
Thu Nov 1 18:09:31 UTC 2018


Success on building the pipeline to code. Just have to put each filesrc
elements in a list and pass to the pad-added function from demux and works.
Have to also connect the queue to the concat elements audio and video side.
There is a limit on storage because it seems to halt at a certain time. have
to figure that out. seems to be at different amounts of storage. it could do
10 files with 10 megabytes each. Different time I could only combine 3 of 50
megabyte files. So don't know what the difference is. Any one know?

class filesrcElements
	{
	public:
		GstElement* filesrc
		,* qtdemux
		,* queue1
		,* queue2;
		std::string queue1Name, queue2Name, qtdemuxName,
filesrcName,filesrcLocation;
	};
bool VideoPipeline::SetupFilesrcElements()
{
	if (this->aFiles.size() == 0)
		return false;

	GstPad* srcPad, *sinkPad;
	GstElement* concat = gst_bin_get_by_name(GST_BIN(this->srcPipeline),
"concat1")
	,* concat2 = gst_bin_get_by_name(GST_BIN(this->srcPipeline),"concat2");

	std::string filesrcPipe;
	std::list<std::string>::iterator it = this->aFiles.begin();
	unsigned int index = 0;

	for (; it != this->aFiles.end(); it++)
	{
		AddToConsoleOutputList("File: " + *it);
		++index;
		filesrcElements file;
		++this->concatPadNumber;
		++this->queueCount;
		std::string demuxName = "dem" + std::to_string(index);
		std::string filesrcName = "filesrc" + std::to_string(index);
		std::string queue1Name = "queue" + std::to_string(queueCount);
		++queueCount;
		std::string queue2Name = "queue" + std::to_string(queueCount);
		file.filesrcName = filesrcName;
		file.qtdemuxName = demuxName;
		file.queue1Name = queue1Name;
		file.queue2Name = queue2Name;

		file.queue1 = this->AssignElement("queue", queue1Name);
		file.queue2 = this->AssignElement("queue", queue2Name);
		file.filesrc = this->AssignElement("filesrc", filesrcName);
		file.qtdemux = this->AssignElement("qtdemux", demuxName);

		g_object_set(G_OBJECT(file.filesrc), "location", (*it).c_str(), NULL);
		gst_bin_add_many(GST_BIN(this->srcPipeline), file.filesrc,
file.qtdemux,file.queue1,file.queue2, NULL);

		gst_element_link(file.filesrc, file.qtdemux);

		sinkPad = gst_element_get_request_pad(concat,
("sink_"+std::to_string(concatPadNumber)).c_str());
		srcPad = gst_element_get_static_pad(file.queue1, "src");
		gst_pad_link(srcPad, sinkPad);
		gst_object_unref(srcPad);
		gst_object_unref(sinkPad);

		sinkPad = gst_element_get_request_pad(concat2, ("sink_" +
std::to_string(concatPadNumber)).c_str());
		srcPad = gst_element_get_static_pad(file.queue2, "src");
		gst_pad_link(srcPad, sinkPad);
		gst_object_unref(srcPad);
		gst_object_unref(sinkPad);

                //list so gstreamer has reference to
		this->filesSources.push_back(file);

                // signal from demux and pass the file that was just added
to be connected to queues
		g_signal_connect(file.qtdemux, "pad-added",
G_CALLBACK(qtdemux_pad_added_cb), &this->filesSources.back());
	}
	
	return true;
}
void VideoPipeline::qtdemux_pad_added_cb(GstElement* element,
	GstPad* pad,
	gpointer user_data)
{
	gchar *name;
	GstCaps * p_caps;
	GstElement* nextElement = NULL;
	filesrcElements* file = static_cast<filesrcElements*>(user_data);
	name = gst_pad_get_name(pad);
	//g_print("A new pad %s was created\n", name);
	p_caps = gst_pad_get_pad_template_caps(pad);

	if (strstr(name, "video") != NULL)
	{
		std::cout << "\n------------------------ Video
-------------------------------\n";
		
			if (!gst_element_link_pads_filtered(element, name,file->queue1 ,
"sink",p_caps))
			{
				std::cout << "\nFailed to link video element to src to sink\n";
			}
	}
	else if (strstr(name, "audio") != NULL)
	{
		std::cout << "\n------------------------ Audio
-------------------------------\n";
		if (!gst_element_link_pads_filtered(element, name, file->queue2, "sink",
p_caps))
		{
			std::cout << "\nFailed to link video element to src to sink\n";
		}
	}
	g_free(name);
	gst_caps_unref(p_caps);
}



-----
------------------------------
Gstreamer 1.14.4
------------------------------
Windows
--
Sent from: http://gstreamer-devel.966125.n4.nabble.com/


More information about the gstreamer-devel mailing list