C 阅读「;wav";使用拖缆的文件
我正在尝试在“C”中实现以下管道:C 阅读「;wav";使用拖缆的文件,c,gstreamer,C,Gstreamer,我正在尝试在“C”中实现以下管道: arif@dev:~/GS_samples/cmd_GS$gst-launch-0.10 filesrc location="../sample_media/M1F1-Alaw-AFsp.wav" ! wavparse ! alawdec ! autoaudiosink 下面是我编写的实现 #include <gst/gst.h> void on_pad_added(GstElement *src_element, GstPad *src_pa
arif@dev:~/GS_samples/cmd_GS$gst-launch-0.10 filesrc location="../sample_media/M1F1-Alaw-AFsp.wav" ! wavparse ! alawdec ! autoaudiosink
下面是我编写的实现
#include <gst/gst.h>
void on_pad_added(GstElement *src_element, GstPad *src_pad, gpointer data);
static gboolean bus_cb(GstBus *bus, GstMessage *message, gpointer data);
static GMainLoop *loop;
int main(int argc, char **argv) {
GstElement *pipeline;
GstElement *src;
GstElement *dec;
GstElement *parse;
GstElement *sink;
GstBus *bus;
gst_init(&argc, &argv);
loop = g_main_loop_new (NULL, FALSE);
pipeline = gst_pipeline_new("wav_player");
src = gst_element_factory_make("filesrc","src");
sink = gst_element_factory_make("autoaudiosink","sink");
parse = gst_element_factory_make("wavparse","parse");
dec = gst_element_factory_make("alawdec", "dec");
gst_bin_add_many (GST_BIN(pipeline), src,parse,dec,sink, NULL);
g_object_set( G_OBJECT (src) , "location",argv[1], NULL);
gst_element_link(src,parse);
gst_element_link(dec,sink);
g_signal_connect (dec, "pad-added", G_CALLBACK (on_pad_added), dec);
bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
gst_bus_add_watch (bus, bus_cb, NULL);
gst_object_unref(bus);
gst_element_set_state(pipeline, GST_STATE_PLAYING);
g_main_loop_run(loop);
return 0;
}
void on_pad_added (GstElement *src_element, GstPad *src_pad, gpointer data)
{
g_print ("linking dynamic pad ...\n");
GstElement *sink_element = (GstElement *) data;
GstPad *sink_pad = gst_element_get_static_pad(sink_element, "sink");
gst_pad_link (src_pad, sink_pad);
gst_object_unref(sink_pad);
}
static gboolean bus_cb(GstBus *bus, GstMessage *message, gpointer data)
{
g_print ("Got %s message\n", GST_MESSAGE_TYPE_NAME (message));
switch (GST_MESSAGE_TYPE (message)) {
case GST_MESSAGE_ERROR: {
GError *err;
gchar *debug;
gst_message_parse_error (message, &err, &debug);
g_print ("Error: %s\n", err->message);
g_error_free (err);
g_free (debug);
g_main_loop_quit (loop);
break;
}
case GST_MESSAGE_EOS:
/* end-of-stream */
g_main_loop_quit (loop);
break;
default:
/* unhandled message */
break;
}
/* we want to be notified again the next time there is a message
* on the bus, so returning TRUE (FALSE means we want to stop watching
* for messages on the bus and our callback should not be called again)
*/
return TRUE;
}
问题出在这一行:
gst_element_link(src,parse);
gst_element_link(dec,sink);
您试图构建一个管道来为您执行一项任务,但没有正确链接它们。您应该使用:gst\u元素\u链接\u许多(src、parse、dec、sink)
注意这些元素的顺序很重要,一个元素的输出就是另一个元素的输入
编辑:您还有另外两个问题,我刚刚修改过,它正在工作:
gststatechangereret;
ret=gst\u元素\u集合\u状态(管道、gst\u状态\u播放);
如果(ret==GST\u状态\u变化\u失败){
g_printerr(“无法将管道设置为播放状态。\n”);
gst_对象_unref(管道);
返回-1;
}
gst_element_link(src,parse);
gst_element_link(dec,sink);