[ Foro de C ]

gstreamer, goom programado en C

07-May-2021 19:36
Invitado (mika)
0 Respuestas

Hola, tengo un proyecto que consiste en crear un efecto de viualización pra un audio. Se trata de GStreamer, de programar un goom. Especificamente nos han dicho que no podemos usar la linea de comando que lo ejecuta, tiene que crearse de cero en C. Aqui el codigo que llevo, he creado el pipeline con los elementos pero no se como avanzar y etablecer la visualización del goom. Por favor, necesito ayuda para continuarlo y sacarlo.


#include <gst/gst.h>

/*-------------------------------------------------------------------------*/

int main (int argc, char *argv[]){

GstBus *bus; //Definimos el bus
GstMessage *msg;
GstStateChangeReturn ret;

/* Initialize GStreamer */
gst_init (&argc, &argv); //Siempre se pone el init
g_print ("Inicio programa.\n");

/* Creo los elementos del pipeline */
GstElement *pipeline = gst_pipeline_new ("mi_pipeline");//creo el pipeline vacio
GstElement *src = gst_element_factory_make("filesrc","fuente_fichero");
GstElement *decoder = gst_element_factory_make("decodebin", "decoder");
GstElement *goom = gst_element_factory_make("goom", "efecto");
GstElement *texto = gst_element_factory_make ("textoverlay", "texto");
GstElement *f_colorspace = gst_element_factory_make("videoconvert", "transform_colorspace");
GstElement *img_sink = gst_element_factory_make("ximagesink", "image-output");

//Comprobación de si se ha producido algún error al crear los elementos del pipeline
if ((!pipeline)||(!src)||(!decoder)||(!goom)||(!texto)||(!f_colorspace)||(!img_sink)){
g_printerr ("Error: error en el procesamiento multimedia.\n");
return -1;// error multimedia
}

//Añade los elementos al pipeline
gst_bin_add_many(GST_BIN(pipeline), src, decoder, goom, texto, f_colorspace, img_sink, NULL);
}

//Comprobamos si hay algun error al unir los elementos
if (gst_element_link (src, decoder, goom, texto, f_colorspac, img_sink) != TRUE) {
g_printerr ("Elements could not be linked.\n");
gst_object_unref (pipeline);

return -1;

}
g_print ("add elementos.\n");

//Añadimos la ruta al fichero a reproducir al elemento filesrc
g_object_set(G_OBJECT(src), "location", filename, NULL);




/*Arranco, inicio el pipeline*/
ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
if (ret == GST_STATE_CHANGE_FAILURE) {
g_printerr ("Unable to set the pipeline to the playing state.\n");
gst_object_unref (pipeline);
return -1;

}

bus = gst_element_get_bus (pipeline); //Todo pipeline va asociado a un bus por eso lo asocio al bus
//Recojo los mensajes que me devuelve el bus, me filtra solo los mensajes que quiero
msg =
gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE,
GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
//el de time out, el de fin de fichero y el de error.

if (msg != NULL) {

GError *err;
gchar *debug_info;

switch (GST_MESSAGE_TYPE (msg)) {
case GST_MESSAGE_ERROR: //Caso si se produce un error
gst_message_parse_error (msg, &err, &debug_info);
g_printerr ("Error received from element %s: %s\n",
GST_OBJECT_NAME (msg->src), err->message);
g_printerr ("Debugging information: %s\n",
debug_info ? debug_info : "none");
g_clear_error (&err);
g_free (debug_info);

break;

case GST_MESSAGE_EOS: //Cuando se produce fin de fichero
g_print ("End-Of-Stream reached.\n");
break;

default: //En el caso de que no se produzca ninguno de los anteriores
g_printerr ("Unexpected message received.\n");

break;

}

gst_message_unref (msg);

}

/* Free resources */
gst_object_unref (bus);
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
return 0;

}

/*--------------------------------------------------------------------------*/




(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)