c - 使用streamer读取 "wav"文件

标签 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_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;
}

但这不起作用:

arif@dev:~/GS_samples/cmd_GS$./a.out ../sample_media/M1F1-Alaw-AFsp.wav 
Got state-changed message
Got state-changed message
Got stream-status message
Got tag message
Got error message
Error: Internal data flow error.

最佳答案

问题出在这一行:

gst_element_link(src,parse);
gst_element_link(dec,sink);

您正在尝试构建一个为您完成一项任务的管道,但您没有正确链接它们。您应该使用:gst_element_link_many(src,parse,dec,sink)

请注意,这些元素的顺序很重要,其中一个元素的输出就是另一个元素的输入。

编辑:您还有另外两个问题,我刚刚修改了它并且它正在工作:

  1. 为什么要使用解码器?您已经在解析 .wav 文件,删除解码器元素并将数据流到音频接收器进行播放。

  2. 您的代码中没有任何地方将管道设置为播放状态。添加此代码块将管道设置为播放状态:

    GstStateChangeReturn ret; ret = gst_element_set_state(管道,GST_STATE_PLAYING); 如果(ret == GST_STATE_CHANGE_FAILURE){ g_printerr("无法将管道设置为播放状态。\n"); gst_object_unref(管道); 返回-1; }

关于c - 使用streamer读取 "wav"文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21576366/

相关文章:

python - 将gstreamer管道更改为python中的opencv

字符串中的字符计数 - C 程序

python - Gstreamer 已安装但未使用 OpenCV 构建

android - android 4.1 中的媒体编解码器示例实现

c - 为什么 C 中没有检测到分隔符\n?

opencv - 使用 Gstreamer 编译 Opencv,cmake 找不到 GStreamer

c - g_object_set/strchr 的段错误

c - 为什么在很多地方 *p() 被称为返回指针的函数而不是返回地址的函数?

c - 带管道 C 的 sscanf

c - c中fscanf返回值的问题