GStreamer 上限“不接受” - 如何转换?

问题描述 投票:0回答:2

我正在编写一项服务,该服务采用 MPEG-TS 流并将该流作为 WebRTC 提供给浏览器。

我知道 MPEG-TS 输入始终包含 h264 视频和 OPUS 音频,我想避免任何不必要的解码/编码,因此我正在测试如下所示的 GStreamer 管道:

udpsrc port=8888 ! tsdemux name=demux
demux. ! tee name=video-tee ! queue ! fakesink sync=true
demux. ! tee name=audio-tee ! queue ! fakesink sync=true

当客户端从 Web 浏览器连接到服务时,以下 bin 将添加到管道中:

queue name=video-queue ! rtph264pay aggregate-mode=zero-latency ! webrtcbin.
queue name=audio-queue ! rtpopuspay ! webrtcbin.
webrtcbin name=webrtcbin

然后使用 Ghost pad 将队列

video-queue
audio-queue
连接到代码中的 T 恤
video-tee
audio-tee

虽然所有这些看起来都有效,但浏览器中显示的视频流是黑色的。 webrtc-internals 报告传入的视频流具有正确的尺寸和帧速率。

检查 GStreamers 日志,问题似乎出在这里:

GST_CAPS gstpad.c:3235:gst_pad_query_accept_caps_default:<rtph264pay0:sink> caps: video/x-h264, stream-format=(string)byte-stream were not compatible with: video/x-h264, stream-format=(string)byte-stream, profile=(string)constrained-baseline, alignment=(string){ nal, au }; video/x-h264, stream-format=(string)byte-stream, alignment=(string){ nal, au }

我的问题是如何让

rtph254pay
节点接受h264流(理想情况下无需重新编码)?我认为
videoconvert
节点可以解决问题,但是似乎无论我将其插入管道中的哪个位置,它都会导致问题。

gstreamer gstreamer-1.0 gstreamer-rs
2个回答
0
投票

为了连接使用 h264 编码但大写略有不同的不同元素,例如,您的大写似乎没有配置文件、对齐方式等。您可以使用 h264parse 元素。

所以第二个容器(或第一个容器的输出)类似于:

queue name=video-queue ! h264parse ! rtph264pay aggregate-mode=zero-latency ! webrtcbin.
...

0
投票

遗憾的是,在 chrome 103 之前,它仅接受 h264 基线配置文件。 大约 103+ 他们也开始接受主要配置文件。 (但不是所有种类) 但是 - 他们希望在 sdp 中包含 profileID,以检查它是否正确,如果不存在则不起作用。 WEBRTCBIN 接受每个 RTP(您可以检查,它有任何),甚至是 mpegts 和 h265。这并不意味着浏览器会接受它...

因此,您基本上需要做的是确保相机在其大写字母中提供 profileID、profile 和 level 道具,并确保它发送基线。 (您也可以使用 capssetter 元素自行添加,我觉得这很烦人)

© www.soinside.com 2019 - 2024. All rights reserved.