c++ - 如何设置 GstPlayer 管道?

标签 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!");
  }

最佳答案

但是您可以开箱即用地通过 GstPlayer 播放 rtsp。为什么要自定义管道? 播放器正在使用接受任何类型的 url 的 playbin。它会根据正在播放的内容动态创建管道。

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

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

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

更新:

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

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

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

HTH

关于c++ - 如何设置 GstPlayer 管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38646333/

相关文章:

c++ - OpenCV - Videocapture 中未处理的异常

Gstreamer : transcoding Matroska video to mp4

c - 如何在不停止管道的情况下在多个 rtsp 视频流之间切换 [无缝流式传输]

python - 如何使用带有 GStreamer 后端的 OpenCV Python 创建 x264 RTSP 服务器

webrtc - mediasoup - 错过 PayloadTypes 之间的匹配

ffmpeg - 将 rtmp 流转换为 rtsp 和 http 流

c++ - 以编程方式将 LAN 计算机名称解析为完全限定名称?

c++ - 如何在 C++ 中使用模板避免重复代码

c++ - 运算符重载+添加多个对象

video-streaming - 使用 VLC 托管无限视频循环的流