0

我正在尝试使用以下 Gstreamer 命令将来自 RTMP 源的流注入 Mediasoup:

gst-launch-1.0 -v \
                rtpbin name=rtpbin \
                rtmpsrc location=${RTMP_URL} \
                ! flvdemux name=demux \
                demux.video \
                ! queue \
                ! h264parse \
                ! decodebin \
                ! videoconvert \
                ! vp8enc target-bitrate=2000000 deadline=1 cpu-used=-5 \
                ! rtpvp8pay pt=102 ssrc=22222222 picture-id-mode=2 \
                ! rtprtxqueue max-size-time=3000 max-size-packets=0 requests=2000 \
                ! rtpbin.send_rtp_sink_0 \
                rtpbin.send_rtp_src_0 ! udpsink host=${listenIp} port=${videoRtpPort} \
                rtpbin.send_rtcp_src_0 ! udpsink host=${listenIp} port=${videoRtcpPort} sync=false async=false \
                udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0 \
                demux.audio \
                ! queue \
                ! decodebin \
                ! audioconvert \
                ! audioresample ! audio/x-raw, rate=24000 \
                ! opusenc \
                ! rtpopuspay pt=101 ssrc=11111111 \
                ! rtprtxqueue max-size-time=3000 max-size-packets=0 requests=2000 \
                ! rtpbin.send_rtp_sink_1 \
                rtpbin.send_rtp_src_1 ! udpsink host=${listenIp} port=${audioRtpPort} \
                rtpbin.send_rtcp_src_1 ! udpsink host=${listenIp} port=${audioRtcpPort} sync=false async=false \
                udpsrc port=5007 ! rtpbin.recv_rtcp_sink_1

我在生产者中启用 RTCP 反馈,如下所示:

this._injectVideoProducer = await this._injectVideoTransport.produce({
                kind          : 'video',
                rtpParameters : {
                    codecs : [
                        {
                            mimeType     : 'video/vp8',
                            clockRate    : 90000,
                            payloadType  : 102,
                            rtcpFeedback : [
                                { type: 'nack' },
                                { type: 'nack', parameter: 'pli' },
                                { type: 'cm', parameter: 'fir' },
                                { type: 'goog-remb' }
                            ]
                        }
                    ],
                    encodings : [ { ssrc: 22222222 } ]
                }
            });

结果是视频随机冻结并在几秒钟后再次播放。我相信这是由于 RTP 数据包丢失。这是 pruducer 统计数据的快照:

Inject-video-producer stats:  [
   {
      "bitrate":2132493,
      "byteCount":151285009,
      "firCount":0,
      "fractionLost":0,
      "jitter":0,
      "kind":"video",
      "mimeType":"video/VP8",
      "nackCount":160,
      "nackPacketCount":1700,
      "packetCount":116907,
      "packetsDiscarded":0,
      "packetsLost":170,
      "packetsRepaired":0,
      "packetsRetransmitted":0,
      "pliCount":7,
      "score":10,
      "ssrc":22222222,
      "timestamp":796306772,
      "type":"inbound-rtp"
  }]

在这里,当我在视频中冻结时, nackCountand 会增加,但始终保持为零。nackPacketCountpacketsRetransmitted

Mediasoup 是否正确向 Gstreamer 发送重传请求?还是重传机制不正常?还是问题出在 Gstreamer 方面?这是来自 Gstreamer 输出日志的快照:

/GstPipeline:pipeline0/GstRtpBin:rtpbin/GstRtpSession:rtpsession1: 
stats = application/x-rtp-session-stats, rtx-drop-count=(uint)0, 
sent-nack-count=(uint)0, recv-nack-count=(uint)0, 
source-stats=(GValueArray)< "application/x-rtp-source-stats\,
\ ssrc\=\(uint\)11111111\,\ internal\=\(boolean\)true\,\ validated\=\(boolean\)true\,
\ received-bye\=\(boolean\)false\,\ is-csrc\=\(boolean\)false\,
\ is-sender\=\(boolean\)true\,\ seqnum-base\=\(int\)29231\,\ clock-rate\=\(int\)48000\,
\ octets-sent\=\(guint64\)22460160\,\ packets-sent\=\(guint64\)140376\,
\ octets-received\=\(guint64\)22460160\,\ packets-received\=\(guint64\)140376\,
\ bitrate\=\(guint64\)64000\,\ packets-lost\=\(int\)-140376\,\ jitter\=\(uint\)0\,
\ sent-pli-count\=\(uint\)0\,\ recv-pli-count\=\(uint\)0\,\ sent-fir-count\=\(uint\)0\,
\ recv-fir-count\=\(uint\)0\,\ sent-nack-count\=\(uint\)0\,\ recv-nack-count\=\(uint\)0\,
\ have-sr\=\(boolean\)true\,\ sr-ntptime\=\(guint64\)16547233726635086532\,
\ sr-rtptime\=\(uint\)3405294345\,\ sr-octet-count\=\(uint\)22436320\,
\ sr-packet-count\=\(uint\)140227\;" >, rtx-count=(uint)0, recv-rtx-req-count=(uint)0, 
sent-rtx-req-count=(uint)0;

由于我是 Mediasoup 的新手,任何提示将不胜感激。

4

0 回答 0