Невозможно воспроизвести файл .wav с помощью gstreamer apis - PullRequest
1 голос
/ 07 сентября 2010

Следующий код написан для воспроизведения файла .wav, но, похоже, он не работает. Я хотел бы знать, если я что-то упускаю в этом.

Код:

#include <gst/gst.h>
#include <glib.h>

int main(int argc , char *argv[])
{
GMainLoop *loop;
GstElement *source,*audioparser,*sink,*pipeline;
GstBus *bus;

gst_init(&argc,&argv);

// create a pipeline
loop = g_main_loop_new (NULL, FALSE);
pipeline = gst_pipeline_new ("wav-player");
source = gst_element_factory_make("filesrc","file-source");
audioparser = gst_element_factory_make("wavparse","wav-parser");
sink = gst_element_factory_make("alsasink","sink1");
g_object_set (G_OBJECT (source), "location", argv[1], NULL);
gst_element_set_state (pipeline, GST_STATE_NULL);
// set location to current sourceg_object_set(G_OBJECT(source),"location",argv[1],NULL);

// add elements to bin
gst_bin_add_many(GST_BIN(pipeline),source,audioparser,sink,NULL);

gst_element_link_many(source,audioparser,sink,NULL);

// create bus
bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
gst_bus_add_watch (bus, bus_call, loop);
gst_object_unref (bus);
gst_element_set_state(pipeline, GST_STATE_PLAYING);
g_main_loop_run (loop);
return 1;
}

Пожалуйста, скомпилируйте это, используя следующую команду:

 gcc -Wall $(pkg-config --cflags --libs gstreamer-0.10) wav.c -o wavparser

Заранее спасибо

Ответы [ 2 ]

5 голосов
/ 07 сентября 2010

Просто используйте playbin2 вместо конвейера ручной работы

, то есть замените все от "pipe = gst_pipeline_new ()" на "gst_element_link_many":

pipeline = gst_element_factory_make("playbin2", NULL);
g_object_set(pipeline, "uri", "file:///the/file/I/want.wav", NULL);
2 голосов
/ 01 сентября 2011

возможно playbin2 - это именно то, что вам нужно, но отвечаю на вопрос: wavparse не имеет статического src-pad, поэтому вы должны обрабатывать сигнал «добавлено pad» от этого элемента во время выполнения. что-то вроде кода:

gst_bin_add_many (GST_BIN (pipeline), wavsrc, wavparse,audioconvert, audiosink, NULL);
g_object_set (G_OBJECT (wavsrc), "location", "sound.wav", NULL);
gst_element_link(wavsrc, wavparse);
gst_element_link(audioconvert, audiosink);
g_signal_connect (wavparse, "pad-added", G_CALLBACK (on_pad_added), audioconvert);

где: wavsrc - это filesrc, wavparse - это wavparse, аудиоконвертер - это аудиоконверт, аудиосигнал - это alsasink (я не уверен, что alsasink работает для вас, поэтому вы можете выбрать другой)

void on_pad_added (GstElement *src_element, GstPad *src_pad, gpointer data)
{
    g_print ("Linking dynamic pad...\n");

    GstElement *sink_element = (GstElement *) data; // is audioconvert
    GstPad *sink_pad = gst_element_get_static_pad (sink_element, "sink");
    gst_pad_link (src_pad, sink_pad);

    gst_object_unref (sink_pad);
    src_element = NULL; // yup, i don't want "unused" warning here
}
...