简体   繁体   English

Gstreamer FLAC管道创建错误

[英]Gstreamer FLAC pipeline creation Error

I keep getting this error: 我不断收到此错误:

$ ./test recit24bit.flac 
Now playing: recit24bit.flac
Running...
Error: Internal data flow error.
Returned, stopping playback
Deleting pipeline

When compiling this code: 编译此代码时:

#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;

I'm using this to compile it successfully: 我正在使用它来成功编译它:

g++ -Wall test-flac.cc -o test $(pkg-config --cflags --libs gstreamer-1.0)

I'm using Arch, if that means anything. 我正在使用Arch,如果这有任何意义。 Does anybody have some advice? 有人建议吗? I'm a pretty big noob, but I don't understand what I'm not doing right because it seems like it should work. 我是一个非常大的菜鸟,但是我不明白我做错了什么,因为它似乎应该可以工作。

I just needed to replace the demuxer with a parsar, which is (apparently) necessary. 我只需要用parsar代替多路分配器,这显然是必要的。 Derp. 德普 I used flacparse, of course. 我当然使用了flacparse。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM