【发布时间】: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 包装器):
udpsrc 带大写:
"application/x-rtp,media=video,payload=127,encoding-name=H264"rtph264depay
- 解码箱
- glimagesink(用于测试)或自定义应用程序接收器(在拉模式下)将图像转换为 CVPixelBufferRef(已测试:它适用于 videotestsrc / uridecodebin / 等)
它不起作用,即使管道的状态消息看起来很“正常”。我在控制台中有关于 SecTaskLoadEntitlements failed error=22 的消息,但在使用命令行时我也有这些消息。
我在问自己在 gst-launch 下我错过了什么。我在网上找不到任何关于基于 udpsrc 的管道的示例。
我的问题是:
- 是否有人知道我们启动 gst-launch 时实际发生了什么或知道实际发生了什么的方法?
- 是否有一些使用 udpsrc 的代码中的工作管道示例?
编辑
这是我的管道图像。如您所见,GstDecodeBin 元素不会创建 src pad,因为它没有接收或处理任何东西(我在 udpsrc 元素上将“超时”属性设置为 10 秒,即被抛出)。 会不会是 OSX 沙盒问题?
现在我的管道看起来像这样:
- udpsrc
- 队列
- h264 支付
- 解码箱
- 视频转换器
- 大写过滤器
- 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