C++ Gstreamer FLAC管道创建错误

C++ Gstreamer FLAC管道创建错误,c++,c,gstreamer,flac,C++,C,Gstreamer,Flac,我不断地发现这个错误: $ ./test recit24bit.flac Now playing: recit24bit.flac Running... Error: Internal data flow error. Returned, stopping playback Deleting pipeline 编译此代码时: #include <gst/gst.h> #include <glib.h> static gboolean bus_call (GstBus

我不断地发现这个错误:

$ ./test recit24bit.flac 
Now playing: recit24bit.flac
Running...
Error: Internal data flow error.
Returned, stopping playback
Deleting pipeline
编译此代码时:

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

static gboolean bus_call (GstBus *bus,
                          GstMessage *msg,
                          gpointer data)

{
  GMainLoop *loop = (GMainLoop *) data;

  switch (GST_MESSAGE_TYPE (msg))
  {
    case GST_MESSAGE_EOS:
    {
      g_print ("End of stream\n");
      g_main_loop_quit (loop);
      break;
    }
    case GST_MESSAGE_ERROR:
    {
      gchar *debug;
      GError *error;

      gst_message_parse_error (msg, &error, &debug);
      g_free (debug);

      g_printerr ("Error: %s\n", error->message);
      g_error_free (error);

      g_main_loop_quit (loop);
      break;
    }
    default:
    {
      break;
    }
  }

  return TRUE;
}



/*
static void on_pad_added (GstElement *element,
                          GstPad *pad, 
                          gpointer data)
{
  GstPad *sinkpad;
  GstElement *decoder = (GstElement *) data;


  // We can now link this pad with the vorbis-decoder sink pad 
  g_print ("Dynamic pad created, linking demuxer/decoder\n");
  sinkpad = gst_element_get_static_pad (decoder, "sink");
  gst_pad_link (pad, sinkpad);
  gst_object_unref (sinkpad);
}
*/



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

  GstElement *pipeline,
             *source,
             //*demuxer, 
             *decoder,
             *conv,
             *sink;

  GstBus *bus;


  guint bus_watch_id;


  /* Initialisation */
  gst_init (&argc, &argv);

  loop = g_main_loop_new (NULL, FALSE);

  /* Check input arguments */
  if (argc != 2)
  {
    g_printerr ("Usage: %s <Flac filename>\n", argv[0]);
    return -1;
  }

  /* Create gstreamer elements */
  pipeline = gst_pipeline_new ("audio-player");
  source   = gst_element_factory_make ("filesrc",       "file-source");
  //demuxer  = gst_element_factory_make ("oggdemux",      "ogg-demuxer");
  decoder  = gst_element_factory_make ("flacdec",     "flac-decoder");
  conv     = gst_element_factory_make ("audioconvert",  "converter");
  sink     = gst_element_factory_make ("alsasink", "audio-output");


  if (!pipeline || !source ||/* !demuxer ||*/ !decoder ||/* !conv ||*/ !sink)
  {
    g_printerr ("One element could not be created. Exiting.\n");
    return -1;
  }


  /* Set up the pipeline */
  /* we set the input filename to the source element */
  g_object_set (G_OBJECT (source), "location", argv[1], NULL);

  /* we add a message handler */
  bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
  bus_watch_id = gst_bus_add_watch (bus, bus_call, loop);
  gst_object_unref (bus);

  /* we add all elements into the pipeline */
  /* file-source | ogg-demuxer | vorbis-decoder | converter | alsa-output */
  gst_bin_add_many (GST_BIN (pipeline), source,/* demuxer,*/ decoder, conv, sink, NULL);


  /* we link the elements together */
  /* file-source -> ogg-demuxer ~> vorbis-decoder -> converter -> alsa-output */
  //gst_element_link (source, demuxer);
  gst_element_link_many (source, decoder, conv, sink, NULL);

//  g_signal_connect (demuxer, "pad-added", G_CALLBACK (on_pad_added), decoder);
  /* note that the demuxer will be linked to the decoder dynamically.
  The reason is that Ogg may contain various streams (for example
  audio and video). The source pad(s) will be created at run time,
  by the demuxer when it detects the amount and nature of streams.
  Therefore we connect a callback function which will be executed
  when the "pad-added" is emitted.*/

  /* Set the pipeline to "playing" state*/
  g_print ("Now playing: %s\n", argv[1]);
  gst_element_set_state (pipeline, GST_STATE_PLAYING);

  /* Iterate */
  g_print ("Running...\n");
  g_main_loop_run (loop);


  /* Out of the main loop, clean up nicely */
  g_print ("Returned, stopping playback\n");



  gst_element_set_state (pipeline, GST_STATE_NULL);
  g_print ("Deleting pipeline\n");

  gst_object_unref (GST_OBJECT (pipeline));
  g_source_remove (bus_watch_id);
  g_main_loop_unref (loop);

  return 0;

我用的是Arch,如果这有什么意义的话。有人有什么建议吗?我是一个相当大的noob,但我不明白我没有做对什么,因为它似乎应该工作。

我只需要用parsar替换demuxer,这(显然)是必要的。德普。当然,我使用的是flacparse。

您可能希望在启用gst调试的情况下再次运行程序,例如:
gst\u DEBUG=3./test-recont24bit.flac
。GStreamer通常以这种方式打印一些错误详细信息。另外,您是否尝试过使用
gst-launch
运行管道?这就是我得到的结果:
gst\u-DEBUG=3./test-recont24bit.flac
正在播放:recont24bit.flac
正在运行
0:00:00.023722046 7116 0xd7a9e0 WARN basesrc gstbasesrc.c:2865:gst_base_src_循环:错误:内部数据流错误
0:00:00.023746630 7116 0xd7a9e0 WARN basesrc gstbasesrc.c:2865:gst_base_src_循环:错误:流任务暂停,原因错误(-5)错误:内部数据流错误
返回,停止播放
删除管道
我没有尝试使用gst启动运行它,但我会在找到方法后运行它。
g++ -Wall test-flac.cc -o test $(pkg-config --cflags --libs gstreamer-1.0)