【问题标题】:GStreamer udpsrc works with gst-launch but not in app (OSX)GStreamer udpsrc 适用于 gst-launch 但不适用于应用程序 (OSX)
【发布时间】:2016-03-22 23:59:43
【问题描述】:

我以这种方式使用 gst-launch 成功地通过 GStreamer 流式传输了我的网络摄像头图像:

服务器

./gst-launch-1.0 -v -m autovideosrc ! video/x-raw,format=BGRA ! videoconvert ! queue ! x264enc pass=qual quantizer=20 tune=zerolatency ! rtph264pay ! udpsink host=XXX.XXX.XXX.XXX port=7480

客户

./gst-launch-1.0 udpsrc port=7480 ! "application/x-rtp, payload=127" ! rtph264depay ! decodebin ! glimagesink

现在我尝试使用这个管道在我的应用程序中重现客户端(我没有发布代码,因为我在管道和元素周围制作了一个 Objective-C 包装器):

  1. udpsrc 带大写:"application/x-rtp,media=video,payload=127,encoding-name=H264"

  2. rtph264depay

  3. 解码箱
  4. glimagesink(用于测试)或自定义应用程序接收器(在拉模式下)将图像转换为 CVPixelBufferRef(已测试:它适用于 videotestsrc / uridecodebin / 等)

它不起作用,即使管道的状态消息看起来很“正常”。我在控制台中有关于 SecTaskLoadEntitlements failed error=22 的消息,但在使用命令行时我也有这些消息。
我在问自己在 gst-launch 下我错过了什么。我在网上找不到任何关于基于 udpsrc 的管道的示例。

我的问题是:

  • 是否有人知道我们启动 gst-launch 时实际发生了什么或知道实际发生了什么的方法?
  • 是否有一些使用 udpsrc 的代码中的工作管道示例?

编辑


这是我的管道图像。如您所见,GstDecodeBin 元素不会创建 src pad,因为它没有接收或处理任何东西(我在 udpsrc 元素上将“超时”属性设置为 10 秒,即被抛出)。 会不会是 OSX 沙盒问题?

现在我的管道看起来像这样:

  1. udpsrc
  2. 队列
  3. h264 支付
  4. 解码箱
  5. 视频转换器
  6. 大写过滤器
  7. appsink / glimagesink

this问题中的方法测试,应用确实在这个端口收到了一些东西。

【问题讨论】:

  • 如何传输 SPS/PPS?我认为常规 RTP 期望这些数据是带外的。如果您希望它在带内,我认为您需要在 rtp pay-loader 中指定它。解码器将无法解码任何数据,因此不会有任何衬垫。最终在您的测试中,您在编码器之前启动了解码器,并且编码器可能会在第一帧之前发送一次 SPS/PPS。如果解码器错过了该数据,它将无限期地等待它。
  • 谢谢,但很抱歉:我不知道什么是 SPS/PPS...看起来 udpsrc 元素本身并不“接受”我的数据。我查看了 gst-launch 程序源,但什么也没有……我使用我在问题中发布的 gst-launch 命令行发送数据,然后再尝试通过应用程序获取数据……
  • SPS 和 PPS 是 H.264 编解码器配置数据,对于解码器解码比特流至关重要。尝试在x264enc 之后添加h264parse config-interval=1
  • 如果这没有帮助,也可以试试option-string=\"repeat-headers=1\"作为x264enc的选项。
  • 不可能,同样的事情:在我的程序中使用 udpsrc 元素时,我似乎没有收到任何东西。我尝试手动创建 GSocket,但没有结果。会不会是 udpsrc 元素自动将其置于多播模式?我有这个消息: GLib-GObject-WARNING **: 属性 GstUDPSrc:multicast-group 已弃用,不应再使用。它将在未来的版本中删除。

标签: macos udp streaming gstreamer h.264


【解决方案1】:

找到它没有收到任何东西的原因:GstUdpSrc 元素必须在 GST_STATE_NULL 分配一个端口来监听,否则它将监听默认值端口 (5004) 静默。

现在一切正常。

将环境变量 GST_DEBUG 设置为 udpsrc:5 有很大帮助,仅供参考。

【讨论】:

  • 然后将您的答案标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多