Reputation: 2214
Ubuntu 14.04 Gstreamer 0.10 Code Sdk : Qt .
I am quite new to Gstreamer. when I use gst-launch tool on my terminal I can successfully see camera attached to my workstation capture &streams videos.
To proceed ahead , I have written c code in Qt. It compiled properly and when I run it , it opens new Xterm window and throw error "Elements could not be linked"
Am I doing it wrong or Do I need to do something else to view streaming
Below is my code( its heavily inspired by other people's code)
.Pro File
QT += core
QT -= gui
QT += core gui
QT += network
QT +=core
QMAKE_CXXFLAGS+= -std=c++11
QMAKE_LFLAGS += -std=c++11
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = justtest
PKGCONFIG +=glib-2.0
PKGCONFIG += gstreamer-0.10
CONFIG += link_pkgconfig
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
INCLUDEPATH += pkg-config --cflags glib-2.0
INCLUDEPATH += /usr/include/glib-2.0/glib/
INCLUDEPATH +=/usr/include/libxml2/
INCLUDEPATH += /usr/include/gstreamer-0.10/
SOURCES += main.cpp
main.cpp
#include <gst/gst.h>
#include <glib.h>
static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
{
GMainLoop *loop = (GMainLoop *) data;
switch (GST_MESSAGE_TYPE (msg)) {
case GST_MESSAGE_EOS:
g_print ("End of stream\n");
g_main_loop_quit (loop);
break;
case GST_MESSAGE_ERROR: {
gchar *debug;
GError *error;
gst_message_parse_error (msg, &error, &debug);
g_free (debug);
g_printerr ("Error: %s\n", error->message);
g_error_free (error);
g_main_loop_quit (loop);
break;
}
default:
break;
}
return TRUE;
}
int main(int argc, char *argv[])
{
//QApplication app(argc, argv);
GstElement *pipeline, *source, *sink, *convert, *videoenc;
GstBus *bus;
GstMessage *msg;
GstStateChangeReturn ret;
GMainLoop *loop;
// Initialize GStreamer /
gst_init (&argc, &argv);
loop = g_main_loop_new( NULL, FALSE );
// Create the elements
source = gst_element_factory_make ("v4l2src", "source");
sink = gst_element_factory_make ("autovideosink", "sink");
convert =gst_element_factory_make("ffmpegcolorspace","convert");
videoenc = gst_element_factory_make ("ffdec_mpeg4", "videoenc");
// Create the empty pipeline
pipeline = gst_pipeline_new ("test-pipeline");
if (!pipeline || !source || !sink || !convert)
{
g_printerr ("Not all elements could be created.\n");
return -1;
}
//set der source
g_object_set (G_OBJECT ( source ), "device", "/dev/video0", NULL);
// we add a message handler
bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
gst_bus_add_watch (bus, bus_call, loop);
gst_object_unref (bus);
//Build the pipeline
gst_bin_add_many (GST_BIN (pipeline), source, convert,videoenc, sink, NULL);
if (gst_element_link (convert, sink) != TRUE)
{
g_printerr ("Elements could not be linked confert sink.\n");
gst_object_unref (pipeline);
return -1;
}
// if (gst_element_link (source, convert) != TRUE) {
// g_printerr ("Elements could not be linked source -convert.\n");
// gst_object_unref (pipeline);
// return -1;
// }
if( gst_element_link_many ( source, convert, videoenc, sink,
NULL) != TRUE )
{
g_printerr ("Elements could not be linked source -convert.\n");
}
g_print("Linked all the Elements together\n");
// Iterate
g_print ("Running...\n");
g_main_loop_run (loop);
// Out of the main loop, clean up nicely
g_print ("Returned, stopping playback\n");
gst_element_set_state (pipeline, GST_STATE_NULL);
g_print ("Deleting pipeline\n");
gst_object_unref (GST_OBJECT (pipeline));
return 0;
}
OUTPUT: ON NEW X TERM window
"Elements could not be linked"
Press <Return> to close this window
Upvotes: 2
Views: 3371
Reputation: 2094
You seem to be trying to link the same element twice, that is not possible.
You link convert to sink and then a few lines below you try linking convert ! videoenc ! sink.
Using the decoder (which you named videoenc) will only work if you know that your camera provides mpeg4 video, otherwise it will fail negotiation. If your camera supports raw formats, just remove the decoder from the pipeline.
Again, 0.10 is unmantained and obsolete for years, please consider moving to 1.x.
Upvotes: 1