如何设置GstPlayer管道?

时间:2016-07-28 20:40:58

标签: c++ gstreamer rtsp

我构建了一个自定义GStreamer管道,用于播放RTSP流。与此同时,我想创建一个新的GstPlayer来使用此管道。问题是,我无法设置GstPlayer的管道(唯一相关的方法是gst_player_get_pipeline()。我不明白那里有什么无法为GstPlayer自定义管道。这似乎是基本功能,所以我必须遗漏一些东西。

我的管道:

  GstElement *pipeline, *source, *filter, *sink;

  // Create pipeline elements
  pipeline = gst_pipeline_new ("vdi-pipeline");
  source = gst_element_factory_make ("rtspsrc", "vdi-source");
  filter = gst_element_factory_make ("decodebin", "vdi-filter");
  sink = gst_element_factory_make ("appsink", "vdi-sink");
  if (!source || !filter || !sink)
  {
    __android_log_print (ANDROID_LOG_ERROR, "Error", "A GstElement could not be created. Exiting.");
    return;
  }

  // Add elements to pipeline
  gst_bin_add_many (GST_BIN (pipeline), source, filter, sink, NULL);

  // Link elements together
  if (!gst_element_link_many (source, filter, sink, NULL)) {
    __android_log_print (ANDROID_LOG_ERROR, "Warning", "Failed to link elements!");
  }

1 个答案:

答案 0 :(得分:0)

但你可以开箱即用GstPlayer播放rtsp ..为什么你想要自定义管道? 玩家正在使用playbin接受任何类型的网址..它将根据正在播放的内容动态创建管道..

如果你真的不能使用playbin那么修补播放器本身怎么样?我不认为它是用于自定义管道..但你可以破解它here

然后你将在rtspsrc上挂起newpads和其他回调而不是playbin ..和其他东西 - 我想你不想要这个。

另一种方式是 - 当playbin构造管道时它在里面使用rtspsrc - 你可以从管道对象中获取这个元素并改变一些参数..但要小心,因为在播放过程中更改参数非常棘手......

更新:

嗯,我想我会以某种方式忽略appsink ..我认为你可以设置playbin属性audio-sink或视频接收器来覆盖它以使用appsink。

但是你仍然必须以某种方式从GstPlayer中获取playbin元素或在初始化时设置playbin参数(我不知道如何) - 在这种情况下,如果你要去的话,我会问IRC(freenode,#gstreamer)正确的方向。

也许更好的方法是使用decodebin甚至playbin创建自己的应用程序并在那里传递appsink元素..如果你不玩游戏而不是处理缓冲区,你为什么要使用GstPlayer?

HTH