2010-09-07 45 views
1

下面的代碼被寫入播放.wav文件,但似乎不起作用。 我想知道我是否缺少一些東西。無法使用gstreamer播放.wav文件apis

代碼:

#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 

在此先感謝

回答

5

就用它代替手工製作的管道

是playbin2 ,通過以下方式將「pipeline = 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

也許playbin2正是你所需要的,但answerring問題:wavparse沒有靜態SRC-墊,所以你必須處理來自上運行時,這個元素「墊添加」信號。類似的代碼:

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,audioconvert是audioconvert,audiosink是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 
}